@@ -2352,9 +2352,9 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV)
2352
2352
ZEND_VM_HELPER (zend_leave_helper , ANY , ANY )
2353
2353
{
2354
2354
zend_execute_data * old_execute_data ;
2355
- zend_call_kind call_kind = EX_CALL_KIND ();
2355
+ uint32_t call_info = EX_CALL_INFO ();
2356
2356
2357
- if (call_kind == ZEND_CALL_NESTED_FUNCTION ) {
2357
+ if (ZEND_CALL_KIND_EX ( call_info ) == ZEND_CALL_NESTED_FUNCTION ) {
2358
2358
zend_object * object ;
2359
2359
2360
2360
i_free_compiled_variables (execute_data );
@@ -2364,7 +2364,7 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
2364
2364
zend_vm_stack_free_extra_args (execute_data );
2365
2365
old_execute_data = execute_data ;
2366
2366
execute_data = EG (current_execute_data ) = EX (prev_execute_data );
2367
- if (UNEXPECTED (old_execute_data -> func -> op_array . fn_flags & ZEND_ACC_CLOSURE )) {
2367
+ if (UNEXPECTED (call_info & ZEND_CALL_CLOSURE )) {
2368
2368
OBJ_RELEASE ((zend_object * )old_execute_data -> func -> op_array .prototype );
2369
2369
}
2370
2370
object = Z_OBJ (old_execute_data -> This );
@@ -2395,7 +2395,7 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
2395
2395
LOAD_OPLINE ();
2396
2396
ZEND_VM_INC_OPCODE ();
2397
2397
ZEND_VM_LEAVE ();
2398
- } else if (call_kind == ZEND_CALL_NESTED_CODE ) {
2398
+ } else if (ZEND_CALL_KIND_EX ( call_info ) == ZEND_CALL_NESTED_CODE ) {
2399
2399
zend_detach_symbol_table (execute_data );
2400
2400
destroy_op_array (& EX (func )-> op_array );
2401
2401
efree_size (EX (func ), sizeof (zend_op_array ));
@@ -2413,14 +2413,14 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
2413
2413
ZEND_VM_INC_OPCODE ();
2414
2414
ZEND_VM_LEAVE ();
2415
2415
} else {
2416
- if (call_kind == ZEND_CALL_TOP_FUNCTION ) {
2416
+ if (ZEND_CALL_KIND_EX ( call_info ) == ZEND_CALL_TOP_FUNCTION ) {
2417
2417
i_free_compiled_variables (execute_data );
2418
2418
if (UNEXPECTED (EX (symbol_table ) != NULL )) {
2419
2419
zend_clean_and_cache_symbol_table (EX (symbol_table ));
2420
2420
}
2421
2421
zend_vm_stack_free_extra_args (execute_data );
2422
2422
EG (current_execute_data ) = EX (prev_execute_data );
2423
- if (EX ( func ) -> op_array . fn_flags & ZEND_ACC_CLOSURE ) {
2423
+ if (UNEXPECTED ( call_info & ZEND_CALL_CLOSURE ) ) {
2424
2424
OBJ_RELEASE ((zend_object * )EX (func )-> op_array .prototype );
2425
2425
}
2426
2426
} else /* if (call_kind == ZEND_CALL_TOP_CODE) */ {
@@ -3112,6 +3112,7 @@ ZEND_VM_HANDLER(128, ZEND_INIT_DYNAMIC_CALL, ANY, CONST|TMPVAR|CV)
3112
3112
zend_class_entry * called_scope ;
3113
3113
zend_object * object ;
3114
3114
zend_execute_data * call ;
3115
+ uint32_t call_info = ZEND_CALL_NESTED_FUNCTION ;
3115
3116
3116
3117
SAVE_OPLINE ();
3117
3118
function_name = GET_OP2_ZVAL_PTR (BP_VAR_R );
@@ -3147,6 +3148,7 @@ ZEND_VM_C_LABEL(try_function_name):
3147
3148
/* Delay closure destruction until its invocation */
3148
3149
ZEND_ASSERT (GC_TYPE (fbc -> common .prototype ) == IS_OBJECT );
3149
3150
GC_REFCOUNT (fbc -> common .prototype )++ ;
3151
+ call_info |= ZEND_CALL_CLOSURE ;
3150
3152
}
3151
3153
FREE_OP2 ();
3152
3154
} else if (EXPECTED (Z_TYPE_P (function_name ) == IS_ARRAY ) &&
@@ -3241,7 +3243,7 @@ ZEND_VM_C_LABEL(try_function_name):
3241
3243
FREE_OP2 ();
3242
3244
HANDLE_EXCEPTION ();
3243
3245
}
3244
- call = zend_vm_stack_push_call_frame (ZEND_CALL_NESTED_FUNCTION ,
3246
+ call = zend_vm_stack_push_call_frame (call_info ,
3245
3247
fbc , opline -> extended_value , called_scope , object );
3246
3248
call -> prev_execute_data = EX (call );
3247
3249
EX (call ) = call ;
@@ -3261,6 +3263,7 @@ ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMPVAR|CV)
3261
3263
zend_class_entry * called_scope ;
3262
3264
zend_object * object ;
3263
3265
zend_execute_data * call ;
3266
+ uint32_t call_info = ZEND_CALL_NESTED_FUNCTION ;
3264
3267
3265
3268
SAVE_OPLINE ();
3266
3269
function_name = GET_OP2_ZVAL_PTR (BP_VAR_R );
@@ -3276,6 +3279,7 @@ ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMPVAR|CV)
3276
3279
}
3277
3280
ZEND_ASSERT (GC_TYPE (func -> common .prototype ) == IS_OBJECT );
3278
3281
GC_REFCOUNT (func -> common .prototype )++ ;
3282
+ call_info |= ZEND_CALL_CLOSURE ;
3279
3283
}
3280
3284
called_scope = fcc .called_scope ;
3281
3285
object = fcc .object ;
@@ -3304,7 +3308,7 @@ ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMPVAR|CV)
3304
3308
object = NULL ;
3305
3309
}
3306
3310
3307
- call = zend_vm_stack_push_call_frame (ZEND_CALL_NESTED_FUNCTION ,
3311
+ call = zend_vm_stack_push_call_frame (call_info ,
3308
3312
func , opline -> extended_value , called_scope , object );
3309
3313
call -> prev_execute_data = EX (call );
3310
3314
EX (call ) = call ;
@@ -4434,7 +4438,7 @@ ZEND_VM_HANDLER(119, ZEND_SEND_ARRAY, ANY, ANY)
4434
4438
}
4435
4439
}
4436
4440
zend_internal_type_error (EX_USES_STRICT_TYPES (), "call_user_func_array() expects parameter 2 to be array, %s given" , zend_get_type_by_const (Z_TYPE_P (args )));
4437
- if (EX (call )-> func -> common . fn_flags & ZEND_ACC_CLOSURE ) {
4441
+ if (ZEND_CALL_INFO ( EX (call )) & ZEND_CALL_CLOSURE ) {
4438
4442
OBJ_RELEASE ((zend_object * )EX (call )-> func -> common .prototype );
4439
4443
}
4440
4444
if (Z_OBJ (EX (call )-> This )) {
@@ -4481,7 +4485,7 @@ ZEND_VM_C_LABEL(send_array):
4481
4485
EX (call )-> func -> common .scope ? "::" : "" ,
4482
4486
EX (call )-> func -> common .function_name -> val );
4483
4487
4484
- if (EX (call )-> func -> common . fn_flags & ZEND_ACC_CLOSURE ) {
4488
+ if (ZEND_CALL_INFO ( EX (call )) & ZEND_CALL_CLOSURE ) {
4485
4489
OBJ_RELEASE ((zend_object * )EX (call )-> func -> common .prototype );
4486
4490
}
4487
4491
if (Z_OBJ (EX (call )-> This )) {
@@ -4539,7 +4543,7 @@ ZEND_VM_HANDLER(120, ZEND_SEND_USER, VAR|CV, ANY)
4539
4543
EX (call )-> func -> common .scope ? "::" : "" ,
4540
4544
EX (call )-> func -> common .function_name -> val );
4541
4545
4542
- if (EX (call )-> func -> common . fn_flags & ZEND_ACC_CLOSURE ) {
4546
+ if (ZEND_CALL_INFO ( EX (call )) & ZEND_CALL_CLOSURE ) {
4543
4547
OBJ_RELEASE ((zend_object * )EX (call )-> func -> common .prototype );
4544
4548
}
4545
4549
if (Z_OBJ (EX (call )-> This )) {
0 commit comments