ZEND_API int zend_delete_global_variable(zend_string *name TSRMLS_DC);
ZEND_API void zend_rebuild_symbol_table(TSRMLS_D);
-ZEND_API void zend_attach_symbol_table(TSRMLS_D);
-ZEND_API void zend_detach_symbol_table(TSRMLS_D);
+ZEND_API void zend_attach_symbol_table(zend_execute_data *execute_data);
+ZEND_API void zend_detach_symbol_table(zend_execute_data *execute_data);
ZEND_API int zend_set_local_var(zend_string *name, zval *value, int force TSRMLS_DC);
ZEND_API int zend_set_local_var_str(const char *name, int len, zval *value, int force TSRMLS_DC);
zend_bool is_ctor_result_used;
} call_slot;
+typedef enum _vm_frame_kind {
+ VM_FRAME_NESTED_FUNCTION, /* stackless VM call to function */
+ VM_FRAME_NESTED_CODE, /* stackless VM call to include/require/eval */
+ VM_FRAME_TOP_FUNCTION, /* direct VM call to function from external C code */
+ VM_FRAME_TOP_CODE /* direct VM call to "main" code from external C code */
+} vm_frame_kind;
+
struct _zend_execute_data {
struct _zend_op *opline;
void **run_time_cache;
zend_array *symbol_table;
struct _zend_execute_data *prev_execute_data;
zval old_error_reporting;
- zend_bool nested;
+ vm_frame_kind frame_kind;
zval *return_value;
// TODO: simplify call sequence and remove current_* and call_* ???
zend_class_entry *current_scope;
* +----------------------------------------+
*/
-static zend_always_inline zend_execute_data *i_create_execute_data_from_op_array(zend_op_array *op_array, zval *return_value, zend_bool nested TSRMLS_DC) /* {{{ */
+static zend_always_inline zend_execute_data *i_create_execute_data_from_op_array(zend_op_array *op_array, zval *return_value, vm_frame_kind frame_kind TSRMLS_DC) /* {{{ */
{
zend_execute_data *execute_data;
EX(symbol_table) = EG(active_symbol_table);
EX(call) = NULL;
EG(current_execute_data) = execute_data;
- EX(nested) = nested;
+ EX(frame_kind) = frame_kind;
EX(delayed_exception) = NULL;
EX(return_value) = return_value;
}
EX(run_time_cache) = op_array->run_time_cache;
- if (EG(active_symbol_table)) {
- zend_attach_symbol_table(TSRMLS_C);
+ if (EX(symbol_table)) {
+ zend_attach_symbol_table(execute_data);
}
if (op_array->this_var != -1 && Z_OBJ(EG(This))) {
}
/* }}} */
-ZEND_API zend_execute_data *zend_create_execute_data_from_op_array(zend_op_array *op_array, zval *return_value, zend_bool nested TSRMLS_DC) /* {{{ */
+ZEND_API zend_execute_data *zend_create_execute_data_from_op_array(zend_op_array *op_array, zval *return_value, vm_frame_kind frame_kind TSRMLS_DC) /* {{{ */
{
- return i_create_execute_data_from_op_array(op_array, return_value, nested TSRMLS_CC);
+ return i_create_execute_data_from_op_array(op_array, return_value, frame_kind TSRMLS_CC);
}
/* }}} */
void init_executor(TSRMLS_D);
void shutdown_executor(TSRMLS_D);
void shutdown_destructors(TSRMLS_D);
-ZEND_API zend_execute_data *zend_create_execute_data_from_op_array(zend_op_array *op_array, zval *return_value, zend_bool nested TSRMLS_DC);
+ZEND_API zend_execute_data *zend_create_execute_data_from_op_array(zend_op_array *op_array, zval *return_value, vm_frame_kind frame_kind TSRMLS_DC);
ZEND_API void zend_execute(zend_op_array *op_array, zval *return_value TSRMLS_DC);
ZEND_API void execute_ex(zend_execute_data *execute_data TSRMLS_DC);
ZEND_API void execute_internal(zend_execute_data *execute_data_ptr, struct _zend_fcall_info *fci TSRMLS_DC);
zend_execute(EG(active_op_array), fci->retval TSRMLS_CC);
}
+ EG(active_op_array) = original_op_array;
+ EG(opline_ptr) = original_opline_ptr;
if (!fci->symbol_table && EG(active_symbol_table)) {
zend_clean_and_cache_symbol_table(EG(active_symbol_table) TSRMLS_CC);
}
EG(active_symbol_table) = calling_symbol_table;
- EG(active_op_array) = original_op_array;
- EG(opline_ptr) = original_opline_ptr;
} else if (EX(function_state).function->type == ZEND_INTERNAL_FUNCTION) {
int call_via_handler = (EX(function_state).function->common.fn_flags & ZEND_ACC_CALL_VIA_HANDLER) != 0;
ZVAL_NULL(fci->retval);
}
/* }}} */
-ZEND_API void zend_attach_symbol_table(TSRMLS_D) /* {{{ */
+ZEND_API void zend_attach_symbol_table(zend_execute_data *execute_data) /* {{{ */
{
int i;
- zend_execute_data *execute_data = EG(current_execute_data);
zend_op_array *op_array = execute_data->op_array;
- HashTable *ht = &EG(active_symbol_table)->ht;
+ HashTable *ht = &execute_data->symbol_table->ht;
/* copy real values from symbol table into CV slots and create
INDIRECT references to CV in symbol table */
}
/* }}} */
-ZEND_API void zend_detach_symbol_table(TSRMLS_D) /* {{{ */
+ZEND_API void zend_detach_symbol_table(zend_execute_data *execute_data) /* {{{ */
{
int i;
- zend_execute_data *execute_data = EG(current_execute_data);
zend_op_array *op_array = execute_data->op_array;
- HashTable *ht = &EG(active_symbol_table)->ht;
+ HashTable *ht = &execute_data->symbol_table->ht;
/* copy real values from CV slots into symbol table */
for (i = 0; i < op_array->last_var; i++) {
opline_ptr = EG(opline_ptr);
current_symbol_table = EG(active_symbol_table);
EG(active_symbol_table) = NULL;
- execute_data = zend_create_execute_data_from_op_array(op_array, return_value, 0 TSRMLS_CC);
+ execute_data = zend_create_execute_data_from_op_array(op_array, return_value, VM_FRAME_TOP_FUNCTION TSRMLS_CC);
EG(active_symbol_table) = current_symbol_table;
EG(current_execute_data) = current_execute_data;
EG(opline_ptr) = opline_ptr;
ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
{
- zend_bool nested = EX(nested);
- zend_op_array *op_array = EX(op_array);
+ vm_frame_kind frame_kind = EX(frame_kind);
- if ((nested && EX(prev_execute_data)->opline->opcode == ZEND_INCLUDE_OR_EVAL) ||
- EG(active_symbol_table) == &EG(symbol_table)) {
- zend_detach_symbol_table(TSRMLS_C);
- }
-
EG(current_execute_data) = EX(prev_execute_data);
- EG(opline_ptr) = NULL;
-
- if (EG(active_symbol_table) != &EG(symbol_table)) {
- i_free_compiled_variables(execute_data TSRMLS_CC);
- }
-
- zend_vm_stack_free((char*)execute_data TSRMLS_CC);
- if ((op_array->fn_flags & ZEND_ACC_CLOSURE) && op_array->prototype) {
- zval_ptr_dtor((zval*)op_array->prototype);
- }
+ if (frame_kind == VM_FRAME_NESTED_FUNCTION) {
+ i_free_compiled_variables(execute_data TSRMLS_CC);
+ if (UNEXPECTED(EX(symbol_table) != NULL)) {
+ zend_clean_and_cache_symbol_table(EX(symbol_table) TSRMLS_CC);
+ }
+ if (UNEXPECTED((EX(op_array)->fn_flags & ZEND_ACC_CLOSURE) != 0) && EX(op_array)->prototype) {
+ zval_ptr_dtor((zval*)EX(op_array)->prototype);
+ }
+ zend_vm_stack_free((char*)execute_data TSRMLS_CC);
- if (nested) {
execute_data = EG(current_execute_data);
- }
- if (nested) {
- USE_OPLINE
-
- LOAD_REGS();
- LOAD_OPLINE();
- if (UNEXPECTED(opline->opcode == ZEND_INCLUDE_OR_EVAL)) {
-
- zend_attach_symbol_table(TSRMLS_C);
+ EG(opline_ptr) = &EX(opline);
+ EG(active_op_array) = EX(op_array);
+ EG(active_symbol_table) = EX(symbol_table);
- EX(function_state).function = (zend_function *) EX(op_array);
- EX(function_state).arguments = NULL;
+ EX(function_state).function = (zend_function *) EX(op_array);
+ EX(function_state).arguments = NULL;
- EG(opline_ptr) = &EX(opline);
- EG(active_op_array) = EX(op_array);
- destroy_op_array(op_array TSRMLS_CC);
- efree(op_array);
- if (UNEXPECTED(EG(exception) != NULL)) {
- zend_throw_exception_internal(NULL TSRMLS_CC);
- HANDLE_EXCEPTION_LEAVE();
+ if (Z_OBJ(EG(This))) {
+ if (UNEXPECTED(EG(exception) != NULL) && EX(call)->is_ctor_call) {
+ if (EX(call)->is_ctor_result_used) {
+ Z_DELREF(EG(This));
+ }
+ if (Z_REFCOUNT(EG(This)) == 1) {
+ zend_object_store_ctor_failed(Z_OBJ(EG(This)) TSRMLS_CC);
+ }
}
+ zval_ptr_dtor(&EG(This));
+ }
+ Z_OBJ(EG(This)) = EX(current_this);
+ EG(scope) = EX(current_scope);
+ EG(called_scope) = EX(current_called_scope);
- ZEND_VM_INC_OPCODE();
- ZEND_VM_LEAVE();
- } else {
- EG(opline_ptr) = &EX(opline);
- EG(active_op_array) = EX(op_array);
- if (EG(active_symbol_table)) {
- zend_clean_and_cache_symbol_table(EG(active_symbol_table) TSRMLS_CC);
- }
- EG(active_symbol_table) = EX(symbol_table);
+ EX(call)--;
- EX(function_state).function = (zend_function *) EX(op_array);
- EX(function_state).arguments = NULL;
+ zend_vm_stack_clear_multiple(1 TSRMLS_CC);
- if (Z_OBJ(EG(This))) {
- if (UNEXPECTED(EG(exception) != NULL) && EX(call)->is_ctor_call) {
- if (EX(call)->is_ctor_result_used) {
- Z_DELREF(EG(This));
- }
- if (Z_REFCOUNT(EG(This)) == 1) {
- zend_object_store_ctor_failed(Z_OBJ(EG(This)) TSRMLS_CC);
- }
- }
- zval_ptr_dtor(&EG(This));
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ zend_op *opline = EX(opline);
+ zend_throw_exception_internal(NULL TSRMLS_CC);
+ if (RETURN_VALUE_USED(opline)) {
+ zval_ptr_dtor(EX_VAR(opline->result.var));
}
- Z_OBJ(EG(This)) = EX(current_this);
- EG(scope) = EX(current_scope);
- EG(called_scope) = EX(current_called_scope);
+ HANDLE_EXCEPTION_LEAVE();
+ }
- EX(call)--;
+ ZEND_VM_INC_OPCODE();
+ ZEND_VM_LEAVE();
+ } else if (frame_kind == VM_FRAME_NESTED_CODE) {
+ zend_detach_symbol_table(execute_data);
+ destroy_op_array(EX(op_array) TSRMLS_CC);
+ efree(EX(op_array));
+ zend_vm_stack_free((char*)execute_data TSRMLS_CC);
- zend_vm_stack_clear_multiple(1 TSRMLS_CC);
+ execute_data = EG(current_execute_data);
+ zend_attach_symbol_table(execute_data);
+ EX(function_state).function = (zend_function *) EX(op_array);
+ EX(function_state).arguments = NULL;
+ EG(opline_ptr) = &EX(opline);
+ EG(active_op_array) = EX(op_array);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ zend_throw_exception_internal(NULL TSRMLS_CC);
+ HANDLE_EXCEPTION_LEAVE();
+ }
- if (UNEXPECTED(EG(exception) != NULL)) {
- zend_throw_exception_internal(NULL TSRMLS_CC);
- if (RETURN_VALUE_USED(opline)) {
- zval_ptr_dtor(EX_VAR(opline->result.var));
+ ZEND_VM_INC_OPCODE();
+ ZEND_VM_LEAVE();
+ } else {
+ if (frame_kind == VM_FRAME_TOP_FUNCTION) {
+ i_free_compiled_variables(execute_data TSRMLS_CC);
+ } else /* if (frame_kind == VM_FRAME_TOP_CODE) */ {
+ zend_array *symbol_table = EX(symbol_table);
+ zend_execute_data *old_execute_data;
+
+ zend_detach_symbol_table(execute_data);
+ old_execute_data = EX(prev_execute_data);
+ while (old_execute_data) {
+ if (old_execute_data->op_array) {
+ if (old_execute_data->symbol_table == symbol_table) {
+ zend_attach_symbol_table(old_execute_data);
+ }
+ break;
}
- HANDLE_EXCEPTION_LEAVE();
+ old_execute_data = old_execute_data->prev_execute_data;
}
-
- ZEND_VM_INC_OPCODE();
- ZEND_VM_LEAVE();
}
- }
- ZEND_VM_RETURN();
+ if ((EX(op_array)->fn_flags & ZEND_ACC_CLOSURE) && EX(op_array)->prototype) {
+ zval_ptr_dtor((zval*)EX(op_array)->prototype);
+ }
+ zend_vm_stack_free((char*)execute_data TSRMLS_CC);
+ EG(opline_ptr) = NULL;
+ ZEND_VM_RETURN();
+ }
}
ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY)
}
} else if (EXPECTED(zend_execute_ex == execute_ex)) {
if (EXPECTED(EG(exception) == NULL)) {
- i_create_execute_data_from_op_array(EG(active_op_array), return_value, 1 TSRMLS_CC);
+ i_create_execute_data_from_op_array(EG(active_op_array), return_value, VM_FRAME_NESTED_FUNCTION TSRMLS_CC);
ZEND_VM_ENTER();
}
} else {
EG(opline_ptr) = &EX(opline);
EG(active_op_array) = EX(op_array);
- if (EG(active_symbol_table)) {
+ if (UNEXPECTED(EG(active_symbol_table) != NULL)) {
zend_clean_and_cache_symbol_table(EG(active_symbol_table) TSRMLS_CC);
}
EG(active_symbol_table) = EX(symbol_table);
}
if (EXPECTED(zend_execute_ex == execute_ex)) {
- i_create_execute_data_from_op_array(new_op_array, return_value, 1 TSRMLS_CC);
+ i_create_execute_data_from_op_array(new_op_array, return_value, VM_FRAME_NESTED_CODE TSRMLS_CC);
ZEND_VM_ENTER();
} else {
zend_execute(new_op_array, return_value TSRMLS_CC);
if (EG(exception) != NULL) {
return;
}
- zend_execute_ex(i_create_execute_data_from_op_array(op_array, return_value, 0 TSRMLS_CC) TSRMLS_CC);
+ zend_execute_ex(i_create_execute_data_from_op_array(op_array, return_value, EG(active_symbol_table) ? VM_FRAME_TOP_CODE : VM_FRAME_TOP_FUNCTION TSRMLS_CC) TSRMLS_CC);
}
static int ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
{
- zend_bool nested = EX(nested);
- zend_op_array *op_array = EX(op_array);
-
- if ((nested && EX(prev_execute_data)->opline->opcode == ZEND_INCLUDE_OR_EVAL) ||
- EG(active_symbol_table) == &EG(symbol_table)) {
- zend_detach_symbol_table(TSRMLS_C);
- }
+ vm_frame_kind frame_kind = EX(frame_kind);
EG(current_execute_data) = EX(prev_execute_data);
- EG(opline_ptr) = NULL;
- if (EG(active_symbol_table) != &EG(symbol_table)) {
+ if (frame_kind == VM_FRAME_NESTED_FUNCTION) {
i_free_compiled_variables(execute_data TSRMLS_CC);
- }
-
- zend_vm_stack_free((char*)execute_data TSRMLS_CC);
-
- if ((op_array->fn_flags & ZEND_ACC_CLOSURE) && op_array->prototype) {
- zval_ptr_dtor((zval*)op_array->prototype);
- }
+ if (UNEXPECTED(EX(symbol_table) != NULL)) {
+ zend_clean_and_cache_symbol_table(EX(symbol_table) TSRMLS_CC);
+ }
+ if (UNEXPECTED((EX(op_array)->fn_flags & ZEND_ACC_CLOSURE) != 0) && EX(op_array)->prototype) {
+ zval_ptr_dtor((zval*)EX(op_array)->prototype);
+ }
+ zend_vm_stack_free((char*)execute_data TSRMLS_CC);
- if (nested) {
execute_data = EG(current_execute_data);
- }
- if (nested) {
- USE_OPLINE
-
- LOAD_REGS();
- LOAD_OPLINE();
- if (UNEXPECTED(opline->opcode == ZEND_INCLUDE_OR_EVAL)) {
-
- zend_attach_symbol_table(TSRMLS_C);
+ EG(opline_ptr) = &EX(opline);
+ EG(active_op_array) = EX(op_array);
+ EG(active_symbol_table) = EX(symbol_table);
- EX(function_state).function = (zend_function *) EX(op_array);
- EX(function_state).arguments = NULL;
+ EX(function_state).function = (zend_function *) EX(op_array);
+ EX(function_state).arguments = NULL;
- EG(opline_ptr) = &EX(opline);
- EG(active_op_array) = EX(op_array);
- destroy_op_array(op_array TSRMLS_CC);
- efree(op_array);
- if (UNEXPECTED(EG(exception) != NULL)) {
- zend_throw_exception_internal(NULL TSRMLS_CC);
- HANDLE_EXCEPTION_LEAVE();
+ if (Z_OBJ(EG(This))) {
+ if (UNEXPECTED(EG(exception) != NULL) && EX(call)->is_ctor_call) {
+ if (EX(call)->is_ctor_result_used) {
+ Z_DELREF(EG(This));
+ }
+ if (Z_REFCOUNT(EG(This)) == 1) {
+ zend_object_store_ctor_failed(Z_OBJ(EG(This)) TSRMLS_CC);
+ }
}
+ zval_ptr_dtor(&EG(This));
+ }
+ Z_OBJ(EG(This)) = EX(current_this);
+ EG(scope) = EX(current_scope);
+ EG(called_scope) = EX(current_called_scope);
- ZEND_VM_INC_OPCODE();
- ZEND_VM_LEAVE();
- } else {
- EG(opline_ptr) = &EX(opline);
- EG(active_op_array) = EX(op_array);
- if (EG(active_symbol_table)) {
- zend_clean_and_cache_symbol_table(EG(active_symbol_table) TSRMLS_CC);
- }
- EG(active_symbol_table) = EX(symbol_table);
+ EX(call)--;
- EX(function_state).function = (zend_function *) EX(op_array);
- EX(function_state).arguments = NULL;
+ zend_vm_stack_clear_multiple(1 TSRMLS_CC);
- if (Z_OBJ(EG(This))) {
- if (UNEXPECTED(EG(exception) != NULL) && EX(call)->is_ctor_call) {
- if (EX(call)->is_ctor_result_used) {
- Z_DELREF(EG(This));
- }
- if (Z_REFCOUNT(EG(This)) == 1) {
- zend_object_store_ctor_failed(Z_OBJ(EG(This)) TSRMLS_CC);
- }
- }
- zval_ptr_dtor(&EG(This));
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ zend_op *opline = EX(opline);
+ zend_throw_exception_internal(NULL TSRMLS_CC);
+ if (RETURN_VALUE_USED(opline)) {
+ zval_ptr_dtor(EX_VAR(opline->result.var));
}
- Z_OBJ(EG(This)) = EX(current_this);
- EG(scope) = EX(current_scope);
- EG(called_scope) = EX(current_called_scope);
+ HANDLE_EXCEPTION_LEAVE();
+ }
- EX(call)--;
+ ZEND_VM_INC_OPCODE();
+ ZEND_VM_LEAVE();
+ } else if (frame_kind == VM_FRAME_NESTED_CODE) {
+ zend_detach_symbol_table(execute_data);
+ destroy_op_array(EX(op_array) TSRMLS_CC);
+ efree(EX(op_array));
+ zend_vm_stack_free((char*)execute_data TSRMLS_CC);
- zend_vm_stack_clear_multiple(1 TSRMLS_CC);
+ execute_data = EG(current_execute_data);
+ zend_attach_symbol_table(execute_data);
+ EX(function_state).function = (zend_function *) EX(op_array);
+ EX(function_state).arguments = NULL;
+ EG(opline_ptr) = &EX(opline);
+ EG(active_op_array) = EX(op_array);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ zend_throw_exception_internal(NULL TSRMLS_CC);
+ HANDLE_EXCEPTION_LEAVE();
+ }
- if (UNEXPECTED(EG(exception) != NULL)) {
- zend_throw_exception_internal(NULL TSRMLS_CC);
- if (RETURN_VALUE_USED(opline)) {
- zval_ptr_dtor(EX_VAR(opline->result.var));
+ ZEND_VM_INC_OPCODE();
+ ZEND_VM_LEAVE();
+ } else {
+ if (frame_kind == VM_FRAME_TOP_FUNCTION) {
+ i_free_compiled_variables(execute_data TSRMLS_CC);
+ } else /* if (frame_kind == VM_FRAME_TOP_CODE) */ {
+ zend_array *symbol_table = EX(symbol_table);
+ zend_execute_data *old_execute_data;
+
+ zend_detach_symbol_table(execute_data);
+ old_execute_data = EX(prev_execute_data);
+ while (old_execute_data) {
+ if (old_execute_data->op_array) {
+ if (old_execute_data->symbol_table == symbol_table) {
+ zend_attach_symbol_table(old_execute_data);
+ }
+ break;
}
- HANDLE_EXCEPTION_LEAVE();
+ old_execute_data = old_execute_data->prev_execute_data;
}
-
- ZEND_VM_INC_OPCODE();
- ZEND_VM_LEAVE();
}
+ if ((EX(op_array)->fn_flags & ZEND_ACC_CLOSURE) && EX(op_array)->prototype) {
+ zval_ptr_dtor((zval*)EX(op_array)->prototype);
+ }
+ zend_vm_stack_free((char*)execute_data TSRMLS_CC);
+ EG(opline_ptr) = NULL;
+ ZEND_VM_RETURN();
}
- ZEND_VM_RETURN();
}
static int ZEND_FASTCALL zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
}
} else if (EXPECTED(zend_execute_ex == execute_ex)) {
if (EXPECTED(EG(exception) == NULL)) {
- i_create_execute_data_from_op_array(EG(active_op_array), return_value, 1 TSRMLS_CC);
+ i_create_execute_data_from_op_array(EG(active_op_array), return_value, VM_FRAME_NESTED_FUNCTION TSRMLS_CC);
ZEND_VM_ENTER();
}
} else {
EG(opline_ptr) = &EX(opline);
EG(active_op_array) = EX(op_array);
- if (EG(active_symbol_table)) {
+ if (UNEXPECTED(EG(active_symbol_table) != NULL)) {
zend_clean_and_cache_symbol_table(EG(active_symbol_table) TSRMLS_CC);
}
EG(active_symbol_table) = EX(symbol_table);
}
if (EXPECTED(zend_execute_ex == execute_ex)) {
- i_create_execute_data_from_op_array(new_op_array, return_value, 1 TSRMLS_CC);
+ i_create_execute_data_from_op_array(new_op_array, return_value, VM_FRAME_NESTED_CODE TSRMLS_CC);
ZEND_VM_ENTER();
} else {
zend_execute(new_op_array, return_value TSRMLS_CC);
}
if (EXPECTED(zend_execute_ex == execute_ex)) {
- i_create_execute_data_from_op_array(new_op_array, return_value, 1 TSRMLS_CC);
+ i_create_execute_data_from_op_array(new_op_array, return_value, VM_FRAME_NESTED_CODE TSRMLS_CC);
ZEND_VM_ENTER();
} else {
zend_execute(new_op_array, return_value TSRMLS_CC);
}
if (EXPECTED(zend_execute_ex == execute_ex)) {
- i_create_execute_data_from_op_array(new_op_array, return_value, 1 TSRMLS_CC);
+ i_create_execute_data_from_op_array(new_op_array, return_value, VM_FRAME_NESTED_CODE TSRMLS_CC);
ZEND_VM_ENTER();
} else {
zend_execute(new_op_array, return_value TSRMLS_CC);
}
if (EXPECTED(zend_execute_ex == execute_ex)) {
- i_create_execute_data_from_op_array(new_op_array, return_value, 1 TSRMLS_CC);
+ i_create_execute_data_from_op_array(new_op_array, return_value, VM_FRAME_NESTED_CODE TSRMLS_CC);
ZEND_VM_ENTER();
} else {
zend_execute(new_op_array, return_value TSRMLS_CC);
if (EG(exception) != NULL) {
return;
}
- zend_{%EXECUTOR_NAME%}_ex(i_create_execute_data_from_op_array(op_array, return_value, 0 TSRMLS_CC) TSRMLS_CC);
+ zend_{%EXECUTOR_NAME%}_ex(i_create_execute_data_from_op_array(op_array, return_value, EG(active_symbol_table) ? VM_FRAME_TOP_CODE : VM_FRAME_TOP_FUNCTION TSRMLS_CC) TSRMLS_CC);
}
{%EXTERNAL_EXECUTOR%}
}
} /* }}} */
-static inline zend_execute_data *phpdbg_create_execute_data(zend_op_array *op_array, zval *return_value, zend_bool nested TSRMLS_DC) /* {{{ */
+static inline zend_execute_data *phpdbg_create_execute_data(zend_op_array *op_array, zval *return_value, vm_frame_kind frame_kind TSRMLS_DC) /* {{{ */
{
#if PHP_VERSION_ID >= 50500
- return zend_create_execute_data_from_op_array(op_array, return_value, nested TSRMLS_CC);
+ return zend_create_execute_data_from_op_array(op_array, return_value, frame_kind TSRMLS_CC);
#else
#undef EX