@@ -848,7 +848,7 @@ ZEND_VM_C_LABEL(assign_dim_op_convert_to_array):
848
848
if (EXPECTED (Z_TYPE_P (container ) <= IS_FALSE )) {
849
849
ZEND_VM_C_GOTO (assign_dim_op_convert_to_array );
850
850
}
851
- if (UNEXPECTED (!Z_ISERROR_P (container ))) {
851
+ if (UNEXPECTED (OP1_TYPE != IS_VAR || !Z_ISERROR_P (container ))) {
852
852
zend_error (E_WARNING , "Cannot use a scalar value as an array" );
853
853
}
854
854
ZEND_VM_C_LABEL (assign_dim_op_ret_null ):
@@ -2503,56 +2503,69 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
2503
2503
zend_execute_data * old_execute_data ;
2504
2504
uint32_t call_info = EX_CALL_INFO ();
2505
2505
2506
- if (EXPECTED ((call_info & (ZEND_CALL_CODE |ZEND_CALL_TOP )) == 0 )) {
2506
+ if (EXPECTED ((call_info & (ZEND_CALL_CODE |ZEND_CALL_TOP | ZEND_CALL_HAS_SYMBOL_TABLE | ZEND_CALL_FREE_EXTRA_ARGS | ZEND_CALL_ALLOCATED )) == 0 )) {
2507
2507
i_free_compiled_variables (execute_data );
2508
- if (UNEXPECTED (call_info & (ZEND_CALL_HAS_SYMBOL_TABLE |ZEND_CALL_FREE_EXTRA_ARGS |ZEND_CALL_ALLOCATED ))) {
2509
- if (UNEXPECTED (call_info & ZEND_CALL_HAS_SYMBOL_TABLE )) {
2510
- zend_clean_and_cache_symbol_table (EX (symbol_table ));
2511
- }
2512
- EG (current_execute_data ) = EX (prev_execute_data );
2513
- if (UNEXPECTED (call_info & ZEND_CALL_RELEASE_THIS )) {
2514
- zend_object * object = Z_OBJ (execute_data -> This );
2508
+
2509
+ EG (current_execute_data ) = EX (prev_execute_data );
2510
+ if (UNEXPECTED (call_info & ZEND_CALL_RELEASE_THIS )) {
2511
+ zend_object * object = Z_OBJ (execute_data -> This );
2515
2512
#if 0
2516
- if (UNEXPECTED (EG (exception ) != NULL ) && (EX (opline )-> op1 .num & ZEND_CALL_CTOR )) {
2513
+ if (UNEXPECTED (EG (exception ) != NULL ) && (EX (opline )-> op1 .num & ZEND_CALL_CTOR )) {
2517
2514
#else
2518
- if (UNEXPECTED (EG (exception ) != NULL ) && (call_info & ZEND_CALL_CTOR )) {
2515
+ if (UNEXPECTED (EG (exception ) != NULL ) && (call_info & ZEND_CALL_CTOR )) {
2519
2516
#endif
2520
- GC_REFCOUNT (object )-- ;
2521
- if (GC_REFCOUNT (object ) == 1 ) {
2522
- zend_object_store_ctor_failed (object );
2523
- }
2517
+ GC_REFCOUNT (object )-- ;
2518
+ if (GC_REFCOUNT (object ) == 1 ) {
2519
+ zend_object_store_ctor_failed (object );
2524
2520
}
2525
- OBJ_RELEASE (object );
2526
- } else if (UNEXPECTED (call_info & ZEND_CALL_CLOSURE )) {
2527
- OBJ_RELEASE ((zend_object * )execute_data -> func -> op_array .prototype );
2528
2521
}
2522
+ OBJ_RELEASE (object );
2523
+ } else if (UNEXPECTED (call_info & ZEND_CALL_CLOSURE )) {
2524
+ OBJ_RELEASE ((zend_object * )execute_data -> func -> op_array .prototype );
2525
+ }
2526
+ EG (vm_stack_top ) = (zval * )execute_data ;
2527
+ execute_data = EX (prev_execute_data );
2529
2528
2530
- zend_vm_stack_free_extra_args_ex (call_info , execute_data );
2531
- old_execute_data = execute_data ;
2532
- execute_data = EX (prev_execute_data );
2533
- zend_vm_stack_free_call_frame_ex (call_info , old_execute_data );
2534
- } else {
2535
- EG (current_execute_data ) = EX (prev_execute_data );
2536
- if (UNEXPECTED (call_info & ZEND_CALL_RELEASE_THIS )) {
2537
- zend_object * object = Z_OBJ (execute_data -> This );
2529
+ if (UNEXPECTED (EG (exception ) != NULL )) {
2530
+ const zend_op * old_opline = EX (opline );
2531
+ zend_throw_exception_internal (NULL );
2532
+ if (RETURN_VALUE_USED (old_opline )) {
2533
+ zval_ptr_dtor (EX_VAR (old_opline -> result .var ));
2534
+ }
2535
+ HANDLE_EXCEPTION_LEAVE ();
2536
+ }
2537
+
2538
+ LOAD_NEXT_OPLINE ();
2539
+ ZEND_VM_LEAVE ();
2540
+ } else if (EXPECTED ((call_info & (ZEND_CALL_CODE |ZEND_CALL_TOP )) == 0 )) {
2541
+ i_free_compiled_variables (execute_data );
2542
+
2543
+ if (UNEXPECTED (call_info & ZEND_CALL_HAS_SYMBOL_TABLE )) {
2544
+ zend_clean_and_cache_symbol_table (EX (symbol_table ));
2545
+ }
2546
+ EG (current_execute_data ) = EX (prev_execute_data );
2547
+ if (UNEXPECTED (call_info & ZEND_CALL_RELEASE_THIS )) {
2548
+ zend_object * object = Z_OBJ (execute_data -> This );
2538
2549
#if 0
2539
- if (UNEXPECTED (EG (exception ) != NULL ) && (EX (opline )-> op1 .num & ZEND_CALL_CTOR )) {
2550
+ if (UNEXPECTED (EG (exception ) != NULL ) && (EX (opline )-> op1 .num & ZEND_CALL_CTOR )) {
2540
2551
#else
2541
- if (UNEXPECTED (EG (exception ) != NULL ) && (call_info & ZEND_CALL_CTOR )) {
2552
+ if (UNEXPECTED (EG (exception ) != NULL ) && (call_info & ZEND_CALL_CTOR )) {
2542
2553
#endif
2543
- GC_REFCOUNT (object )-- ;
2544
- if (GC_REFCOUNT (object ) == 1 ) {
2545
- zend_object_store_ctor_failed (object );
2546
- }
2554
+ GC_REFCOUNT (object )-- ;
2555
+ if (GC_REFCOUNT (object ) == 1 ) {
2556
+ zend_object_store_ctor_failed (object );
2547
2557
}
2548
- OBJ_RELEASE (object );
2549
- } else if (UNEXPECTED (call_info & ZEND_CALL_CLOSURE )) {
2550
- OBJ_RELEASE ((zend_object * )execute_data -> func -> op_array .prototype );
2551
2558
}
2552
- EG (vm_stack_top ) = (zval * )execute_data ;
2553
- execute_data = EX (prev_execute_data );
2559
+ OBJ_RELEASE (object );
2560
+ } else if (UNEXPECTED (call_info & ZEND_CALL_CLOSURE )) {
2561
+ OBJ_RELEASE ((zend_object * )execute_data -> func -> op_array .prototype );
2554
2562
}
2555
2563
2564
+ zend_vm_stack_free_extra_args_ex (call_info , execute_data );
2565
+ old_execute_data = execute_data ;
2566
+ execute_data = EX (prev_execute_data );
2567
+ zend_vm_stack_free_call_frame_ex (call_info , old_execute_data );
2568
+
2556
2569
if (UNEXPECTED (EG (exception ) != NULL )) {
2557
2570
const zend_op * old_opline = EX (opline );
2558
2571
zend_throw_exception_internal (NULL );
@@ -4300,20 +4313,15 @@ ZEND_VM_HANDLER(106, ZEND_SEND_VAR_NO_REF, VAR, NUM)
4300
4313
zval * varptr , * arg ;
4301
4314
4302
4315
varptr = GET_OP1_ZVAL_PTR (BP_VAR_R );
4316
+ arg = ZEND_CALL_VAR (EX (call ), opline -> result .var );
4317
+ ZVAL_COPY_VALUE (arg , varptr );
4303
4318
4304
4319
if (EXPECTED (Z_ISREF_P (varptr ))) {
4305
- arg = ZEND_CALL_VAR (EX (call ), opline -> result .var );
4306
- ZVAL_COPY_VALUE (arg , varptr );
4307
-
4308
4320
ZEND_VM_NEXT_OPCODE ();
4309
4321
}
4310
4322
4311
4323
SAVE_OPLINE ();
4312
4324
zend_error (E_NOTICE , "Only variables should be passed by reference" );
4313
-
4314
- arg = ZEND_CALL_VAR (EX (call ), opline -> result .var );
4315
- ZVAL_COPY_VALUE (arg , varptr );
4316
-
4317
4325
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION ();
4318
4326
}
4319
4327
@@ -4330,12 +4338,11 @@ ZEND_VM_HANDLER(50, ZEND_SEND_VAR_NO_REF_EX, VAR, NUM, SPEC(QUICK_ARG))
4330
4338
}
4331
4339
4332
4340
varptr = GET_OP1_ZVAL_PTR (BP_VAR_R );
4341
+ arg = ZEND_CALL_VAR (EX (call ), opline -> result .var );
4342
+ ZVAL_COPY_VALUE (arg , varptr );
4333
4343
4334
4344
if (EXPECTED (Z_ISREF_P (varptr ) ||
4335
4345
QUICK_ARG_MAY_BE_SENT_BY_REF (EX (call )-> func , arg_num ))) {
4336
- arg = ZEND_CALL_VAR (EX (call ), opline -> result .var );
4337
- ZVAL_COPY_VALUE (arg , varptr );
4338
-
4339
4346
ZEND_VM_NEXT_OPCODE ();
4340
4347
}
4341
4348
} else {
@@ -4344,22 +4351,17 @@ ZEND_VM_HANDLER(50, ZEND_SEND_VAR_NO_REF_EX, VAR, NUM, SPEC(QUICK_ARG))
4344
4351
}
4345
4352
4346
4353
varptr = GET_OP1_ZVAL_PTR (BP_VAR_R );
4354
+ arg = ZEND_CALL_VAR (EX (call ), opline -> result .var );
4355
+ ZVAL_COPY_VALUE (arg , varptr );
4347
4356
4348
4357
if (EXPECTED (Z_ISREF_P (varptr ) ||
4349
4358
ARG_MAY_BE_SENT_BY_REF (EX (call )-> func , arg_num ))) {
4350
- arg = ZEND_CALL_VAR (EX (call ), opline -> result .var );
4351
- ZVAL_COPY_VALUE (arg , varptr );
4352
-
4353
4359
ZEND_VM_NEXT_OPCODE ();
4354
4360
}
4355
4361
}
4356
4362
4357
4363
SAVE_OPLINE ();
4358
4364
zend_error (E_NOTICE , "Only variables should be passed by reference" );
4359
-
4360
- arg = ZEND_CALL_VAR (EX (call ), opline -> result .var );
4361
- ZVAL_COPY_VALUE (arg , varptr );
4362
-
4363
4365
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION ();
4364
4366
}
4365
4367
@@ -4374,7 +4376,8 @@ ZEND_VM_HANDLER(67, ZEND_SEND_REF, VAR|CV, NUM)
4374
4376
4375
4377
arg = ZEND_CALL_VAR (EX (call ), opline -> result .var );
4376
4378
if (OP1_TYPE == IS_VAR && UNEXPECTED (Z_ISERROR_P (varptr ))) {
4377
- ZVAL_NEW_REF (arg , & EG (uninitialized_zval ));
4379
+ ZVAL_NEW_EMPTY_REF (arg );
4380
+ ZVAL_NULL (Z_REFVAL_P (arg ));
4378
4381
ZEND_VM_NEXT_OPCODE ();
4379
4382
}
4380
4383
0 commit comments