From 6aee1ee4a187b1653b4e702104e55332ef897691 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 15 Apr 2015 17:02:21 +0300 Subject: [PATCH] Optimization of stack-frame construction --- Zend/zend_execute.c | 4 +- Zend/zend_execute.h | 7 +- Zend/zend_execute_API.c | 2 +- Zend/zend_vm_def.h | 61 ++++++++---- Zend/zend_vm_execute.h | 207 +++++++++++++++++++++++++++------------ Zend/zend_vm_execute.skl | 2 +- 6 files changed, 193 insertions(+), 90 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 3b1f5138cc..f60cfbfa68 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2061,8 +2061,8 @@ ZEND_API zend_execute_data *zend_create_generator_execute_data(zend_execute_data (zend_function*)op_array, num_args, call->called_scope, - Z_OBJ(call->This), - NULL); + Z_OBJ(call->This)); + EX(prev_execute_data) = NULL; EX_NUM_ARGS() = num_args; /* copy arguments */ diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index a3844b2a47..add05f3139 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -162,7 +162,7 @@ static zend_always_inline zval* zend_vm_stack_alloc(size_t size) return (zval*)top; } -static zend_always_inline zend_execute_data *zend_vm_stack_push_call_frame_ex(uint32_t used_stack, uint32_t call_info, zend_function *func, uint32_t num_args, zend_class_entry *called_scope, zend_object *object, zend_execute_data *prev) +static zend_always_inline zend_execute_data *zend_vm_stack_push_call_frame_ex(uint32_t used_stack, uint32_t call_info, zend_function *func, uint32_t num_args, zend_class_entry *called_scope, zend_object *object) { zend_execute_data *call = (zend_execute_data*)zend_vm_stack_alloc(used_stack); @@ -171,7 +171,6 @@ static zend_always_inline zend_execute_data *zend_vm_stack_push_call_frame_ex(ui ZEND_SET_CALL_INFO(call, call_info); ZEND_CALL_NUM_ARGS(call) = num_args; call->called_scope = called_scope; - call->prev_execute_data = prev; return call; } @@ -185,12 +184,12 @@ static zend_always_inline uint32_t zend_vm_calc_used_stack(uint32_t num_args, ze return used_stack * sizeof(zval); } -static zend_always_inline zend_execute_data *zend_vm_stack_push_call_frame(uint32_t call_info, zend_function *func, uint32_t num_args, zend_class_entry *called_scope, zend_object *object, zend_execute_data *prev) +static zend_always_inline zend_execute_data *zend_vm_stack_push_call_frame(uint32_t call_info, zend_function *func, uint32_t num_args, zend_class_entry *called_scope, zend_object *object) { uint32_t used_stack = zend_vm_calc_used_stack(num_args, func); return zend_vm_stack_push_call_frame_ex(used_stack, call_info, - func, num_args, called_scope, object, prev); + func, num_args, called_scope, object); } static zend_always_inline void zend_vm_stack_free_extra_args(zend_execute_data *call) diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index f79169232d..b710ae99c0 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -747,7 +747,7 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache) / func = fci_cache->function_handler; call = zend_vm_stack_push_call_frame(ZEND_CALL_TOP_FUNCTION, - func, fci->param_count, fci_cache->called_scope, fci_cache->object, NULL); + func, fci->param_count, fci_cache->called_scope, fci_cache->object); calling_scope = fci_cache->calling_scope; fci->object = fci_cache->object; if (fci->object && diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 3d736cce51..350f6afafb 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2840,6 +2840,7 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, TMPVAR|UNUSED|CV, CONST|TMPVAR|CV) zend_function *fbc; zend_class_entry *called_scope; zend_object *obj; + zend_execute_data *call; SAVE_OPLINE(); @@ -2923,8 +2924,10 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, TMPVAR|UNUSED|CV, CONST|TMPVAR|CV) GC_REFCOUNT(obj)++; /* For $this pointer */ } - EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, - fbc, opline->extended_value, called_scope, obj, EX(call)); + call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, + fbc, opline->extended_value, called_scope, obj); + call->prev_execute_data = EX(call); + EX(call) = call; FREE_OP2(); FREE_OP1(); @@ -2940,6 +2943,7 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, CONST|VAR, CONST|TMPVAR|UNUSE zend_class_entry *ce; zend_object *object; zend_function *fbc; + zend_execute_data *call; SAVE_OPLINE(); @@ -3054,8 +3058,10 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, CONST|VAR, CONST|TMPVAR|UNUSE } } - EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, - fbc, opline->extended_value, ce, object, EX(call)); + call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, + fbc, opline->extended_value, ce, object); + call->prev_execute_data = EX(call); + EX(call) = call; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -3066,6 +3072,7 @@ ZEND_VM_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST) USE_OPLINE zend_function *fbc; zval *function_name, *func; + zend_execute_data *call; if (EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))))) { fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))); @@ -3080,8 +3087,10 @@ ZEND_VM_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST) CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), fbc); } } - EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, - fbc, opline->extended_value, NULL, NULL, EX(call)); + call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, + fbc, opline->extended_value, NULL, NULL); + call->prev_execute_data = EX(call); + EX(call) = call; /*CHECK_EXCEPTION();*/ ZEND_VM_NEXT_OPCODE(); @@ -3096,6 +3105,7 @@ ZEND_VM_HANDLER(128, ZEND_INIT_DYNAMIC_CALL, ANY, CONST|TMPVAR|CV) zend_free_op free_op2; zend_class_entry *called_scope; zend_object *object; + zend_execute_data *call; SAVE_OPLINE(); function_name = GET_OP2_ZVAL_PTR(BP_VAR_R); @@ -3225,8 +3235,10 @@ ZEND_VM_C_LABEL(try_function_name): FREE_OP2(); HANDLE_EXCEPTION(); } - EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, - fbc, opline->extended_value, called_scope, object, EX(call)); + call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, + fbc, opline->extended_value, called_scope, object); + call->prev_execute_data = EX(call); + EX(call) = call; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -3242,6 +3254,7 @@ ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMPVAR|CV) zend_function *func; zend_class_entry *called_scope; zend_object *object; + zend_execute_data *call; SAVE_OPLINE(); function_name = GET_OP2_ZVAL_PTR(BP_VAR_R); @@ -3285,8 +3298,10 @@ ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMPVAR|CV) object = NULL; } - EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, - func, opline->extended_value, called_scope, object, EX(call)); + call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, + func, opline->extended_value, called_scope, object); + call->prev_execute_data = EX(call); + EX(call) = call; FREE_OP2(); CHECK_EXCEPTION(); @@ -3299,6 +3314,7 @@ ZEND_VM_HANDLER(69, ZEND_INIT_NS_FCALL_BY_NAME, ANY, CONST) zval *func_name; zval *func; zend_function *fbc; + zend_execute_data *call; func_name = EX_CONSTANT(opline->op2) + 1; if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) { @@ -3318,8 +3334,10 @@ ZEND_VM_HANDLER(69, ZEND_INIT_NS_FCALL_BY_NAME, ANY, CONST) CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), fbc); } - EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, - fbc, opline->extended_value, NULL, NULL, EX(call)); + call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, + fbc, opline->extended_value, NULL, NULL); + call->prev_execute_data = EX(call); + EX(call) = call; ZEND_VM_NEXT_OPCODE(); } @@ -3331,6 +3349,7 @@ ZEND_VM_HANDLER(61, ZEND_INIT_FCALL, ANY, CONST) zval *fname = GET_OP2_ZVAL_PTR(BP_VAR_R); zval *func; zend_function *fbc; + zend_execute_data *call; if (CACHED_PTR(Z_CACHE_SLOT_P(fname))) { fbc = CACHED_PTR(Z_CACHE_SLOT_P(fname)); @@ -3343,9 +3362,11 @@ ZEND_VM_HANDLER(61, ZEND_INIT_FCALL, ANY, CONST) CACHE_PTR(Z_CACHE_SLOT_P(fname), fbc); } - EX(call) = zend_vm_stack_push_call_frame_ex( + call = zend_vm_stack_push_call_frame_ex( opline->op1.num, ZEND_CALL_NESTED_FUNCTION, - fbc, opline->extended_value, NULL, NULL, EX(call)); + fbc, opline->extended_value, NULL, NULL); + call->prev_execute_data = EX(call); + EX(call) = call; FREE_OP2(); @@ -4789,14 +4810,15 @@ ZEND_VM_HANDLER(68, ZEND_NEW, CONST|VAR, ANY) ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2)); } else { /* We are not handling overloaded classes right now */ - EX(call) = zend_vm_stack_push_call_frame( + zend_execute_data *call = zend_vm_stack_push_call_frame( ZEND_CALL_FUNCTION | ZEND_CALL_CTOR | (EXPECTED(RETURN_VALUE_USED(opline)) ? 0 : ZEND_CALL_CTOR_RESULT_UNUSED), constructor, opline->extended_value, ce, - Z_OBJ(object_zval), - EX(call)); + Z_OBJ(object_zval)); + call->prev_execute_data = EX(call); + EX(call) = call; if (EXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), &object_zval); @@ -5319,7 +5341,7 @@ ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMPVAR|CV, ANY) new_op_array->scope = EG(scope); call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_CODE, - (zend_function*)new_op_array, 0, EX(called_scope), Z_OBJ(EX(This)), NULL); + (zend_function*)new_op_array, 0, EX(called_scope), Z_OBJ(EX(This))); if (EX(symbol_table)) { call->symbol_table = EX(symbol_table); @@ -7698,7 +7720,8 @@ ZEND_VM_HANDLER(158, ZEND_CALL_TRAMPOLINE, ANY, ANY) call = execute_data; execute_data = EG(current_execute_data) = EX(prev_execute_data); zend_vm_stack_free_call_frame(call); - call = zend_vm_stack_push_call_frame(call_kind, fbc->common.prototype, 2, scope, object, execute_data); + call = zend_vm_stack_push_call_frame(call_kind, fbc->common.prototype, 2, scope, object); + call->prev_execute_data = execute_data; ZVAL_STR(ZEND_CALL_ARG(call, 1), fbc->common.function_name); ZVAL_ARR(ZEND_CALL_ARG(call, 2), args); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 798a87c417..7449ac46f8 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -423,7 +423,7 @@ ZEND_API void zend_execute(zend_op_array *op_array, zval *return_value) } execute_data = zend_vm_stack_push_call_frame(ZEND_CALL_TOP_CODE, - (zend_function*)op_array, 0, EG(current_execute_data) ? EG(current_execute_data)->called_scope : NULL, EG(current_execute_data) ? Z_OBJ(EG(current_execute_data)->This) : NULL, NULL); + (zend_function*)op_array, 0, EG(current_execute_data) ? EG(current_execute_data)->called_scope : NULL, EG(current_execute_data) ? Z_OBJ(EG(current_execute_data)->This) : NULL); if (EG(current_execute_data)) { execute_data->symbol_table = zend_rebuild_symbol_table(); } else { @@ -1800,7 +1800,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CALL_TRAMPOLINE_SPEC_HANDLER(Z call = execute_data; execute_data = EG(current_execute_data) = EX(prev_execute_data); zend_vm_stack_free_call_frame(call); - call = zend_vm_stack_push_call_frame(call_kind, fbc->common.prototype, 2, scope, object, execute_data); + call = zend_vm_stack_push_call_frame(call_kind, fbc->common.prototype, 2, scope, object); + call->prev_execute_data = execute_data; ZVAL_STR(ZEND_CALL_ARG(call, 1), fbc->common.function_name); ZVAL_ARR(ZEND_CALL_ARG(call, 2), args); @@ -1956,6 +1957,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_ USE_OPLINE zend_function *fbc; zval *function_name, *func; + zend_execute_data *call; if (EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))))) { fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))); @@ -1970,8 +1972,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_ CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), fbc); } } - EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, - fbc, opline->extended_value, NULL, NULL, EX(call)); + call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, + fbc, opline->extended_value, NULL, NULL); + call->prev_execute_data = EX(call); + EX(call) = call; /*CHECK_EXCEPTION();*/ ZEND_VM_NEXT_OPCODE(); @@ -1986,6 +1990,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_DYNAMIC_CALL_SPEC_CONST_H zend_class_entry *called_scope; zend_object *object; + zend_execute_data *call; SAVE_OPLINE(); function_name = EX_CONSTANT(opline->op2); @@ -2114,8 +2119,10 @@ try_function_name: HANDLE_EXCEPTION(); } - EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, - fbc, opline->extended_value, called_scope, object, EX(call)); + call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, + fbc, opline->extended_value, called_scope, object); + call->prev_execute_data = EX(call); + EX(call) = call; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -2127,6 +2134,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CON zval *func_name; zval *func; zend_function *fbc; + zend_execute_data *call; func_name = EX_CONSTANT(opline->op2) + 1; if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) { @@ -2146,8 +2154,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CON CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), fbc); } - EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, - fbc, opline->extended_value, NULL, NULL, EX(call)); + call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, + fbc, opline->extended_value, NULL, NULL); + call->prev_execute_data = EX(call); + EX(call) = call; ZEND_VM_NEXT_OPCODE(); } @@ -2159,6 +2169,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_FCALL_SPEC_CONST_HANDLER( zval *fname = EX_CONSTANT(opline->op2); zval *func; zend_function *fbc; + zend_execute_data *call; if (CACHED_PTR(Z_CACHE_SLOT_P(fname))) { fbc = CACHED_PTR(Z_CACHE_SLOT_P(fname)); @@ -2171,9 +2182,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_FCALL_SPEC_CONST_HANDLER( CACHE_PTR(Z_CACHE_SLOT_P(fname), fbc); } - EX(call) = zend_vm_stack_push_call_frame_ex( + call = zend_vm_stack_push_call_frame_ex( opline->op1.num, ZEND_CALL_NESTED_FUNCTION, - fbc, opline->extended_value, NULL, NULL, EX(call)); + fbc, opline->extended_value, NULL, NULL); + call->prev_execute_data = EX(call); + EX(call) = call; ZEND_VM_NEXT_OPCODE(); } @@ -2381,6 +2394,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_DYNAMIC_CALL_SPEC_CV_HAND zend_class_entry *called_scope; zend_object *object; + zend_execute_data *call; SAVE_OPLINE(); function_name = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -2509,8 +2523,10 @@ try_function_name: HANDLE_EXCEPTION(); } - EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, - fbc, opline->extended_value, called_scope, object, EX(call)); + call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, + fbc, opline->extended_value, called_scope, object); + call->prev_execute_data = EX(call); + EX(call) = call; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -2569,6 +2585,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR_ zend_free_op free_op2; zend_class_entry *called_scope; zend_object *object; + zend_execute_data *call; SAVE_OPLINE(); function_name = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -2698,8 +2715,10 @@ try_function_name: zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } - EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, - fbc, opline->extended_value, called_scope, object, EX(call)); + call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, + fbc, opline->extended_value, called_scope, object); + call->prev_execute_data = EX(call); + EX(call) = call; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -3247,14 +3266,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_CONST_HANDLER(ZEND_OP ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2)); } else { /* We are not handling overloaded classes right now */ - EX(call) = zend_vm_stack_push_call_frame( + zend_execute_data *call = zend_vm_stack_push_call_frame( ZEND_CALL_FUNCTION | ZEND_CALL_CTOR | (EXPECTED(RETURN_VALUE_USED(opline)) ? 0 : ZEND_CALL_CTOR_RESULT_UNUSED), constructor, opline->extended_value, ce, - Z_OBJ(object_zval), - EX(call)); + Z_OBJ(object_zval)); + call->prev_execute_data = EX(call); + EX(call) = call; if (EXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), &object_zval); @@ -3541,7 +3561,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HAN new_op_array->scope = EG(scope); call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_CODE, - (zend_function*)new_op_array, 0, EX(called_scope), Z_OBJ(EX(This)), NULL); + (zend_function*)new_op_array, 0, EX(called_scope), Z_OBJ(EX(This))); if (EX(symbol_table)) { call->symbol_table = EX(symbol_table); @@ -5244,6 +5264,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C zend_class_entry *ce; zend_object *object; zend_function *fbc; + zend_execute_data *call; SAVE_OPLINE(); @@ -5358,8 +5379,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C } } - EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, - fbc, opline->extended_value, ce, object, EX(call)); + call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, + fbc, opline->extended_value, ce, object); + call->prev_execute_data = EX(call); + EX(call) = call; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -5375,6 +5398,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CONS zend_function *func; zend_class_entry *called_scope; zend_object *object; + zend_execute_data *call; SAVE_OPLINE(); function_name = EX_CONSTANT(opline->op2); @@ -5418,8 +5442,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CONS object = NULL; } - EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, - func, opline->extended_value, called_scope, object, EX(call)); + call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, + func, opline->extended_value, called_scope, object); + call->prev_execute_data = EX(call); + EX(call) = call; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -7190,6 +7216,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C zend_class_entry *ce; zend_object *object; zend_function *fbc; + zend_execute_data *call; SAVE_OPLINE(); @@ -7304,8 +7331,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C } } - EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, - fbc, opline->extended_value, ce, object, EX(call)); + call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, + fbc, opline->extended_value, ce, object); + call->prev_execute_data = EX(call); + EX(call) = call; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -8697,6 +8726,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C zend_class_entry *ce; zend_object *object; zend_function *fbc; + zend_execute_data *call; SAVE_OPLINE(); @@ -8811,8 +8841,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C } } - EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, - fbc, opline->extended_value, ce, object, EX(call)); + call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, + fbc, opline->extended_value, ce, object); + call->prev_execute_data = EX(call); + EX(call) = call; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -8828,6 +8860,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CV_H zend_function *func; zend_class_entry *called_scope; zend_object *object; + zend_execute_data *call; SAVE_OPLINE(); function_name = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -8871,8 +8904,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CV_H object = NULL; } - EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, - func, opline->extended_value, called_scope, object, EX(call)); + call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, + func, opline->extended_value, called_scope, object); + call->prev_execute_data = EX(call); + EX(call) = call; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -10285,6 +10320,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C zend_class_entry *ce; zend_object *object; zend_function *fbc; + zend_execute_data *call; SAVE_OPLINE(); @@ -10399,8 +10435,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C } } - EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, - fbc, opline->extended_value, ce, object, EX(call)); + call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, + fbc, opline->extended_value, ce, object); + call->prev_execute_data = EX(call); + EX(call) = call; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -10416,6 +10454,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_TMPV zend_function *func; zend_class_entry *called_scope; zend_object *object; + zend_execute_data *call; SAVE_OPLINE(); function_name = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -10459,8 +10498,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_TMPV object = NULL; } - EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, - func, opline->extended_value, called_scope, object, EX(call)); + call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, + func, opline->extended_value, called_scope, object); + call->prev_execute_data = EX(call); + EX(call) = call; zval_ptr_dtor_nogc(free_op2); CHECK_EXCEPTION(); @@ -14389,14 +14430,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_VAR_HANDLER(ZEND_OPCO ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2)); } else { /* We are not handling overloaded classes right now */ - EX(call) = zend_vm_stack_push_call_frame( + zend_execute_data *call = zend_vm_stack_push_call_frame( ZEND_CALL_FUNCTION | ZEND_CALL_CTOR | (EXPECTED(RETURN_VALUE_USED(opline)) ? 0 : ZEND_CALL_CTOR_RESULT_UNUSED), constructor, opline->extended_value, ce, - Z_OBJ(object_zval), - EX(call)); + Z_OBJ(object_zval)); + call->prev_execute_data = EX(call); + EX(call) = call; if (EXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), &object_zval); @@ -16520,6 +16562,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V zend_class_entry *ce; zend_object *object; zend_function *fbc; + zend_execute_data *call; SAVE_OPLINE(); @@ -16634,8 +16677,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V } } - EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, - fbc, opline->extended_value, ce, object, EX(call)); + call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, + fbc, opline->extended_value, ce, object); + call->prev_execute_data = EX(call); + EX(call) = call; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -18112,6 +18157,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V zend_class_entry *ce; zend_object *object; zend_function *fbc; + zend_execute_data *call; SAVE_OPLINE(); @@ -18226,8 +18272,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V } } - EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, - fbc, opline->extended_value, ce, object, EX(call)); + call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, + fbc, opline->extended_value, ce, object); + call->prev_execute_data = EX(call); + EX(call) = call; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -19798,6 +19846,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V zend_class_entry *ce; zend_object *object; zend_function *fbc; + zend_execute_data *call; SAVE_OPLINE(); @@ -19912,8 +19961,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V } } - EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, - fbc, opline->extended_value, ce, object, EX(call)); + call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, + fbc, opline->extended_value, ce, object); + call->prev_execute_data = EX(call); + EX(call) = call; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -21439,6 +21490,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V zend_class_entry *ce; zend_object *object; zend_function *fbc; + zend_execute_data *call; SAVE_OPLINE(); @@ -21553,8 +21605,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V } } - EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, - fbc, opline->extended_value, ce, object, EX(call)); + call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, + fbc, opline->extended_value, ce, object); + call->prev_execute_data = EX(call); + EX(call) = call; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22884,6 +22938,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C zend_function *fbc; zend_class_entry *called_scope; zend_object *obj; + zend_execute_data *call; SAVE_OPLINE(); @@ -22967,8 +23022,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C GC_REFCOUNT(obj)++; /* For $this pointer */ } - EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, - fbc, opline->extended_value, called_scope, obj, EX(call)); + call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, + fbc, opline->extended_value, called_scope, obj); + call->prev_execute_data = EX(call); + EX(call) = call; CHECK_EXCEPTION(); @@ -25273,6 +25330,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C zend_function *fbc; zend_class_entry *called_scope; zend_object *obj; + zend_execute_data *call; SAVE_OPLINE(); @@ -25356,8 +25414,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C GC_REFCOUNT(obj)++; /* For $this pointer */ } - EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, - fbc, opline->extended_value, called_scope, obj, EX(call)); + call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, + fbc, opline->extended_value, called_scope, obj); + call->prev_execute_data = EX(call); + EX(call) = call; CHECK_EXCEPTION(); @@ -26781,6 +26841,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_T zend_function *fbc; zend_class_entry *called_scope; zend_object *obj; + zend_execute_data *call; SAVE_OPLINE(); @@ -26864,8 +26925,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_T GC_REFCOUNT(obj)++; /* For $this pointer */ } - EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, - fbc, opline->extended_value, called_scope, obj, EX(call)); + call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, + fbc, opline->extended_value, called_scope, obj); + call->prev_execute_data = EX(call); + EX(call) = call; zval_ptr_dtor_nogc(free_op2); @@ -28321,7 +28384,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLE new_op_array->scope = EG(scope); call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_CODE, - (zend_function*)new_op_array, 0, EX(called_scope), Z_OBJ(EX(This)), NULL); + (zend_function*)new_op_array, 0, EX(called_scope), Z_OBJ(EX(This))); if (EX(symbol_table)) { call->symbol_table = EX(symbol_table); @@ -30973,6 +31036,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CONST zend_function *fbc; zend_class_entry *called_scope; zend_object *obj; + zend_execute_data *call; SAVE_OPLINE(); @@ -31056,8 +31120,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CONST GC_REFCOUNT(obj)++; /* For $this pointer */ } - EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, - fbc, opline->extended_value, called_scope, obj, EX(call)); + call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, + fbc, opline->extended_value, called_scope, obj); + call->prev_execute_data = EX(call); + EX(call) = call; CHECK_EXCEPTION(); @@ -35928,6 +35994,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HA zend_function *fbc; zend_class_entry *called_scope; zend_object *obj; + zend_execute_data *call; SAVE_OPLINE(); @@ -36011,8 +36078,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HA GC_REFCOUNT(obj)++; /* For $this pointer */ } - EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, - fbc, opline->extended_value, called_scope, obj, EX(call)); + call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, + fbc, opline->extended_value, called_scope, obj); + call->prev_execute_data = EX(call); + EX(call) = call; CHECK_EXCEPTION(); @@ -38457,6 +38526,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVA zend_function *fbc; zend_class_entry *called_scope; zend_object *obj; + zend_execute_data *call; SAVE_OPLINE(); @@ -38540,8 +38610,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVA GC_REFCOUNT(obj)++; /* For $this pointer */ } - EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, - fbc, opline->extended_value, called_scope, obj, EX(call)); + call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, + fbc, opline->extended_value, called_scope, obj); + call->prev_execute_data = EX(call); + EX(call) = call; zval_ptr_dtor_nogc(free_op2); @@ -39551,7 +39623,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_HA new_op_array->scope = EG(scope); call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_CODE, - (zend_function*)new_op_array, 0, EX(called_scope), Z_OBJ(EX(This)), NULL); + (zend_function*)new_op_array, 0, EX(called_scope), Z_OBJ(EX(This))); if (EX(symbol_table)) { call->symbol_table = EX(symbol_table); @@ -40552,6 +40624,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_C zend_function *fbc; zend_class_entry *called_scope; zend_object *obj; + zend_execute_data *call; SAVE_OPLINE(); @@ -40635,8 +40708,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_C GC_REFCOUNT(obj)++; /* For $this pointer */ } - EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, - fbc, opline->extended_value, called_scope, obj, EX(call)); + call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, + fbc, opline->extended_value, called_scope, obj); + call->prev_execute_data = EX(call); + EX(call) = call; zval_ptr_dtor_nogc(free_op1); @@ -42559,6 +42634,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_C zend_function *fbc; zend_class_entry *called_scope; zend_object *obj; + zend_execute_data *call; SAVE_OPLINE(); @@ -42642,8 +42718,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_C GC_REFCOUNT(obj)++; /* For $this pointer */ } - EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, - fbc, opline->extended_value, called_scope, obj, EX(call)); + call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, + fbc, opline->extended_value, called_scope, obj); + call->prev_execute_data = EX(call); + EX(call) = call; zval_ptr_dtor_nogc(free_op1); @@ -43577,6 +43655,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_T zend_function *fbc; zend_class_entry *called_scope; zend_object *obj; + zend_execute_data *call; SAVE_OPLINE(); @@ -43660,8 +43739,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_T GC_REFCOUNT(obj)++; /* For $this pointer */ } - EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, - fbc, opline->extended_value, called_scope, obj, EX(call)); + call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, + fbc, opline->extended_value, called_scope, obj); + call->prev_execute_data = EX(call); + EX(call) = call; zval_ptr_dtor_nogc(free_op2); zval_ptr_dtor_nogc(free_op1); diff --git a/Zend/zend_vm_execute.skl b/Zend/zend_vm_execute.skl index 6b1720731d..5bbc390f5b 100644 --- a/Zend/zend_vm_execute.skl +++ b/Zend/zend_vm_execute.skl @@ -29,7 +29,7 @@ ZEND_API void zend_{%EXECUTOR_NAME%}(zend_op_array *op_array, zval *return_value } execute_data = zend_vm_stack_push_call_frame(ZEND_CALL_TOP_CODE, - (zend_function*)op_array, 0, EG(current_execute_data) ? EG(current_execute_data)->called_scope : NULL, EG(current_execute_data) ? Z_OBJ(EG(current_execute_data)->This) : NULL, NULL); + (zend_function*)op_array, 0, EG(current_execute_data) ? EG(current_execute_data)->called_scope : NULL, EG(current_execute_data) ? Z_OBJ(EG(current_execute_data)->This) : NULL); if (EG(current_execute_data)) { execute_data->symbol_table = zend_rebuild_symbol_table(); } else { -- 2.40.0