Internal functions now recieves zend_execute_data as the first argument.
# define HANDLE_UNBLOCK_INTERRUPTIONS() ZEND_SIGNAL_UNBLOCK_INTERRUPTIONS()
#endif
-#define INTERNAL_FUNCTION_PARAMETERS uint32_t param_count, zval *return_value TSRMLS_DC
-#define INTERNAL_FUNCTION_PARAM_PASSTHRU param_count, return_value TSRMLS_CC
+#define INTERNAL_FUNCTION_PARAMETERS zend_execute_data *execute_data, zval *return_value TSRMLS_DC
+#define INTERNAL_FUNCTION_PARAM_PASSTHRU execute_data, return_value TSRMLS_CC
#define USED_RET() \
- (!EG(current_execute_data) || \
- !EG(current_execute_data)->prev_execute_data || \
- !ZEND_USER_CODE(EG(current_execute_data)->prev_execute_data->func->common.type) || \
- !(EG(current_execute_data)->prev_execute_data->opline->result_type & EXT_TYPE_UNUSED))
+ (!EX(prev_execute_data) || \
+ !ZEND_USER_CODE(EX(prev_execute_data)->func->common.type) || \
+ !(EX(prev_execute_data)->opline->result_type & EXT_TYPE_UNUSED))
#ifdef HAVE_NORETURN
# if defined(ZEND_WIN32)
} else {
fcc->called_scope = EG(current_execute_data) ? EG(current_execute_data)->called_scope : NULL;
fcc->calling_scope = EG(scope);
- if (!fcc->object && Z_OBJ(EG(This))) {
- fcc->object = Z_OBJ(EG(This));
+ if (!fcc->object && EG(current_execute_data) && Z_OBJ(EG(current_execute_data)->This)) {
+ fcc->object = Z_OBJ(EG(current_execute_data)->This);
}
ret = 1;
}
} else {
fcc->called_scope = EG(current_execute_data) ? EG(current_execute_data)->called_scope : NULL;
fcc->calling_scope = EG(scope)->parent;
- if (!fcc->object && Z_OBJ(EG(This))) {
- fcc->object = Z_OBJ(EG(This));
+ if (!fcc->object && EG(current_execute_data) && Z_OBJ(EG(current_execute_data)->This)) {
+ fcc->object = Z_OBJ(EG(current_execute_data)->This);
}
*strict_class = 1;
ret = 1;
} else {
fcc->called_scope = EG(current_execute_data)->called_scope;
fcc->calling_scope = EG(current_execute_data)->called_scope;
- if (!fcc->object && Z_OBJ(EG(This))) {
- fcc->object = Z_OBJ(EG(This));
+ if (!fcc->object && Z_OBJ(EG(current_execute_data)->This)) {
+ fcc->object = Z_OBJ(EG(current_execute_data)->This);
}
*strict_class = 1;
ret = 1;
}
scope = ex ? ex->func->common.scope : NULL;
fcc->calling_scope = ce;
- if (scope && !fcc->object && Z_OBJ(EG(This)) &&
- instanceof_function(Z_OBJCE(EG(This)), scope TSRMLS_CC) &&
+ if (scope && !fcc->object && EG(current_execute_data) && Z_OBJ(EG(current_execute_data)->This) &&
+ instanceof_function(Z_OBJCE(EG(current_execute_data)->This), scope TSRMLS_CC) &&
instanceof_function(scope, fcc->calling_scope TSRMLS_CC)) {
- fcc->object = Z_OBJ(EG(This));
- fcc->called_scope = Z_OBJCE(EG(This));
+ fcc->object = Z_OBJ(EG(current_execute_data)->This);
+ fcc->called_scope = Z_OBJCE(EG(current_execute_data)->This);
} else {
fcc->called_scope = fcc->object ? zend_get_class_entry(fcc->object TSRMLS_CC) : fcc->calling_scope;
}
if (fcc->function_handler) {
retval = 1;
call_via_handler = (fcc->function_handler->common.fn_flags & ZEND_ACC_CALL_VIA_HANDLER) != 0;
- if (call_via_handler && !fcc->object && Z_OBJ(EG(This)) &&
- Z_OBJ_HT(EG(This))->get_class_entry &&
- instanceof_function(Z_OBJCE(EG(This)), fcc->calling_scope TSRMLS_CC)) {
- fcc->object = Z_OBJ(EG(This));
+ if (call_via_handler && !fcc->object && EG(current_execute_data) && Z_OBJ(EG(current_execute_data)->This) &&
+ Z_OBJ_HT(EG(current_execute_data)->This)->get_class_entry &&
+ instanceof_function(Z_OBJCE(EG(current_execute_data)->This), fcc->calling_scope TSRMLS_CC)) {
+ fcc->object = Z_OBJ(EG(current_execute_data)->This);
}
}
}
if ((check_flags & IS_CALLABLE_CHECK_IS_STATIC) != 0) {
retval = 0;
}
- if (Z_OBJ(EG(This)) && instanceof_function(Z_OBJCE(EG(This)), fcc->calling_scope TSRMLS_CC)) {
- fcc->object = Z_OBJ(EG(This));
+ if (EG(current_execute_data) && Z_OBJ(EG(current_execute_data)->This) && instanceof_function(Z_OBJCE(EG(current_execute_data)->This), fcc->calling_scope TSRMLS_CC)) {
+ fcc->object = Z_OBJ(EG(current_execute_data)->This);
if (error) {
- zend_spprintf(error, 0, "non-static method %s::%s() %s be called statically, assuming $this from compatible context %s", fcc->calling_scope->name->val, fcc->function_handler->common.function_name->val, verb, Z_OBJCE(EG(This))->name->val);
+ zend_spprintf(error, 0, "non-static method %s::%s() %s be called statically, assuming $this from compatible context %s", fcc->calling_scope->name->val, fcc->function_handler->common.function_name->val, verb, Z_OBJCE(EG(current_execute_data)->This)->name->val);
if (severity == E_ERROR) {
retval = 0;
}
} else if (retval) {
- zend_error(severity, "Non-static method %s::%s() %s be called statically, assuming $this from compatible context %s", fcc->calling_scope->name->val, fcc->function_handler->common.function_name->val, verb, Z_OBJCE(EG(This))->name->val);
+ zend_error(severity, "Non-static method %s::%s() %s be called statically, assuming $this from compatible context %s", fcc->calling_scope->name->val, fcc->function_handler->common.function_name->val, verb, Z_OBJCE(EG(current_execute_data)->This)->name->val);
}
} else {
if (error) {
}
/* }}} */
+ZEND_API void zend_ctor_make_null(zend_execute_data *execute_data) /* {{{ */
+{
+ if (EX(return_value)) {
+/*
+ if (Z_TYPE_P(EX(return_value)) == IS_OBJECT) {
+ zend_object *object = Z_OBJ_P(EX(return_value));
+ zend_execute_data *ex = EX(prev_execute_data);
+
+ while (ex && Z_OBJ(ex->This) == object) {
+ if (ex->func) {
+ if (ZEND_USER_CODE(ex->func->type)) {
+ if (ex->func->op_array.this_var != -1) {
+ zval *this_var = EX_VAR_2(ex, ex->func->op_array.this_var);
+ if (this_var != EX(return_value)) {
+ zval_ptr_dtor(this_var);
+ ZVAL_NULL(this_var);
+ }
+ }
+ }
+ }
+ Z_OBJ(ex->This) = NULL;
+ ZVAL_NULL(&ex->This);
+ ex = ex->prev_execute_data;
+ }
+ }
+*/
+ zval_ptr_dtor(EX(return_value));
+ Z_OBJ_P(EX(return_value)) = NULL;
+ ZVAL_NULL(EX(return_value));
+ }
+}
+/* }}} */
+
/*
* Local variables:
* tab-width: 4
ZEND_API zend_string *zend_get_object_classname(const zend_object *object TSRMLS_DC);
ZEND_API char *zend_get_type_by_const(int type);
-#define getThis() (Z_OBJ(EG(This)) ? &EG(This) : NULL)
+#define getThis() (Z_OBJ(EX(This)) ? &EX(This) : NULL)
#define WRONG_PARAM_COUNT ZEND_WRONG_PARAM_COUNT()
#define WRONG_PARAM_COUNT_WITH_RETVAL(ret) ZEND_WRONG_PARAM_COUNT_WITH_RETVAL(ret)
-#define ARG_COUNT(dummy) (param_count)
-#define ZEND_NUM_ARGS() (param_count)
+#define ARG_COUNT(dummy) EX(num_args)
+#define ZEND_NUM_ARGS() EX(num_args)
#define ZEND_WRONG_PARAM_COUNT() { zend_wrong_param_count(TSRMLS_C); return; }
#define ZEND_WRONG_PARAM_COUNT_WITH_RETVAL(ret) { zend_wrong_param_count(TSRMLS_C); return ret; }
ZEND_API zend_string *zend_find_alias_name(zend_class_entry *ce, zend_string *name);
ZEND_API zend_string *zend_resolve_method_name(zend_class_entry *ce, zend_function *f);
+ZEND_API void zend_ctor_make_null(zend_execute_data *execute_data);
+
#define add_method(arg, key, method) add_assoc_function((arg), (key), (method))
ZEND_API ZEND_FUNCTION(display_disabled_function);
} while (0)
/* May be used in internal constructors to make them return NULL */
-#if 1 // support for directly called constructors only ???
-#define ZEND_CTOR_MAKE_NULL() do { \
- if (EG(current_execute_data)->return_value) { \
- zval_ptr_dtor(EG(current_execute_data)->return_value); \
- ZVAL_NULL(EG(current_execute_data)->return_value); \
- } \
- } while (0)
-#else // attempt to support calls to parent::__construct() ???
- // see: ext/date/tests/bug67118.phpt
-#define ZEND_CTOR_MAKE_NULL() do { \
- if (EG(current_execute_data)->return_value) { \
- zval_ptr_dtor(EG(current_execute_data)->return_value); \
- ZVAL_NULL(EG(current_execute_data)->return_value); \
- } else if (EG(current_execute_data)->prev_execute_data && \
- EG(current_execute_data)->prev_execute_data->object == \
- EG(current_execute_data)->object) { \
- EG(current_execute_data)->prev_execute_data->object = NULL; \
- } \
- } while (0)
-#endif
+#define ZEND_CTOR_MAKE_NULL() \
+ zend_ctor_make_null(execute_data)
#define RETURN_ZVAL_FAST(z) { RETVAL_ZVAL_FAST(z); return; }
const int _flags = (flags); \
int _min_num_args = (min_num_args); \
int _max_num_args = (max_num_args); \
- int _num_args = EG(current_execute_data)->num_args; \
+ int _num_args = EX(num_args); \
int _i; \
zval *_real_arg, *_arg = NULL; \
zend_expected_type _expected_type = IS_UNDEF; \
break; \
} \
_i = 0; \
- _real_arg = ZEND_CALL_ARG(EG(current_execute_data), 0);
+ _real_arg = ZEND_CALL_ARG(execute_data, 0);
#define ZEND_PARSE_PARAMETERS_START(min_num_args, max_num_args) \
ZEND_PARSE_PARAMETERS_START_EX(0, min_num_args, max_num_args)
Get the number of arguments that were passed to the function */
ZEND_FUNCTION(func_num_args)
{
- zend_execute_data *ex = EG(current_execute_data)->prev_execute_data;
+ zend_execute_data *ex = EX(prev_execute_data);
if (ex->frame_kind == VM_FRAME_NESTED_FUNCTION || ex->frame_kind == VM_FRAME_TOP_FUNCTION) {
RETURN_LONG(ex->num_args);
RETURN_FALSE;
}
- ex = EG(current_execute_data)->prev_execute_data;
+ ex = EX(prev_execute_data);
if (ex->frame_kind != VM_FRAME_NESTED_FUNCTION && ex->frame_kind != VM_FRAME_TOP_FUNCTION) {
zend_error(E_WARNING, "func_get_arg(): Called from the global scope - no function context");
RETURN_FALSE;
zval *p;
uint32_t arg_count, first_extra_arg;
uint32_t i;
- zend_execute_data *ex = EG(current_execute_data)->prev_execute_data;
+ zend_execute_data *ex = EX(prev_execute_data);
if (ex->frame_kind != VM_FRAME_NESTED_FUNCTION && ex->frame_kind != VM_FRAME_TOP_FUNCTION) {
zend_error(E_WARNING, "func_get_args(): Called from the global scope - no function context");
return;
}
- if (EG(current_execute_data)->called_scope) {
- RETURN_STR(zend_string_copy(EG(current_execute_data)->called_scope->name));
+ if (EX(called_scope)) {
+ RETURN_STR(zend_string_copy(EX(called_scope)->name));
} else if (!EG(scope)) {
zend_error(E_WARNING, "get_called_class() called from outside a class");
}
}
ZVAL_UNDEF(&arg_array);
- ptr = EG(current_execute_data)->prev_execute_data;
+ ptr = EX(prev_execute_data);
/* skip debug_backtrace() */
call = ptr;
}
/* $this may be passed into regular internal functions */
- object = call->object;
+ object = Z_OBJ(call->This);
if (object &&
call &&
call->func->type == ZEND_INTERNAL_FUNCTION &&
}
/* $this may be passed into regular internal functions */
- object = call ? call->object : NULL;
+ object = call ? Z_OBJ(call->This) : NULL;
if (object &&
call->func &&
call->func->type == ZEND_INTERNAL_FUNCTION &&
ZEND_METHOD(Closure, __invoke) /* {{{ */
{
- zend_function *func = EG(current_execute_data)->func;
+ zend_function *func = EX(func);
zval *arguments;
arguments = emalloc(sizeof(zval) * ZEND_NUM_ARGS());
void zend_eval_const_expr(zend_ast **ast_ptr TSRMLS_DC);
void zend_const_expr_to_zval(zval *result, zend_ast *ast TSRMLS_DC);
-typedef struct _zend_execute_data zend_execute_data;
-
#define ZEND_OPCODE_HANDLER_ARGS zend_execute_data *execute_data TSRMLS_DC
#define ZEND_OPCODE_HANDLER_ARGS_PASSTHRU execute_data TSRMLS_CC
zend_uchar flags;
zend_uchar frame_kind;
zend_class_entry *called_scope;
- zend_object *object;
+ zval This;
zend_execute_data *prev_execute_data;
zval *return_value;
zend_class_entry *scope; /* function scope (self) */
#define ZEND_CALL_ARG(call, n) \
(((zval*)(call)) + ((n) + (ZEND_CALL_FRAME_SLOT - 1)))
-#define EX(element) execute_data.element
+#define EX(element) ((execute_data)->element)
#define EX_VAR_2(ex, n) ((zval*)(((char*)(ex)) + ((int)(n))))
#define EX_VAR_NUM_2(ex, n) (((zval*)(ex)) + (ZEND_CALL_FRAME_SLOT + ((int)(n))))
#define DECODE_CTOR(ce) \
((zend_class_entry*)(((zend_uintptr_t)(ce)) & ~(CTOR_CALL_BIT|CTOR_USED_BIT)))
-#undef EX
-#define EX(element) execute_data->element
-
ZEND_API zval* zend_get_compiled_variable_value(const zend_execute_data *execute_data, uint32_t var)
{
return EX_VAR(var);
}
}
-static zend_always_inline zval *_get_obj_zval_ptr_unused(TSRMLS_D)
+static zend_always_inline zval *_get_obj_zval_ptr_unused(zend_execute_data *execute_data TSRMLS_DC)
{
- if (EXPECTED(Z_OBJ(EG(This)) != NULL)) {
- return &EG(This);
+ if (EXPECTED(Z_OBJ(EX(This)) != NULL)) {
+ return &EX(This);
} else {
zend_error_noreturn(E_ERROR, "Using $this when not in object context");
return NULL;
}
}
-static inline zval *_get_obj_zval_ptr(int op_type, znode_op *op, const zend_execute_data *execute_data, zend_free_op *should_free, int type TSRMLS_DC)
+static inline zval *_get_obj_zval_ptr(int op_type, znode_op *op, zend_execute_data *execute_data, zend_free_op *should_free, int type TSRMLS_DC)
{
if (op_type == IS_UNUSED) {
- if (EXPECTED(Z_OBJ(EG(This)) != NULL)) {
+ if (EXPECTED(Z_OBJ(EX(This)) != NULL)) {
should_free->var = NULL;
- return &EG(This);
+ return &EX(This);
} else {
zend_error_noreturn(E_ERROR, "Using $this when not in object context");
}
return get_zval_ptr(op_type, op, execute_data, should_free, type);
}
-static inline zval *_get_obj_zval_ptr_ptr(int op_type, const znode_op *node, const zend_execute_data *execute_data, zend_free_op *should_free, int type TSRMLS_DC)
+static inline zval *_get_obj_zval_ptr_ptr(int op_type, const znode_op *node, zend_execute_data *execute_data, zend_free_op *should_free, int type TSRMLS_DC)
{
if (op_type == IS_UNUSED) {
- if (EXPECTED(Z_OBJ(EG(This)) != NULL)) {
+ if (EXPECTED(Z_OBJ(EX(This)) != NULL)) {
should_free->var = NULL;
- return &EG(This);
+ return &EX(This);
} else {
zend_error_noreturn(E_ERROR, "Using $this when not in object context");
}
ZEND_API void execute_internal(zend_execute_data *execute_data, zval *return_value TSRMLS_DC)
{
- execute_data->func->internal_function.handler(execute_data->num_args, return_value TSRMLS_CC);
+ execute_data->func->internal_function.handler(execute_data, return_value TSRMLS_CC);
}
void zend_clean_and_cache_symbol_table(zend_array *symbol_table TSRMLS_DC) /* {{{ */
{
uint32_t first_extra_arg, num_args;
ZEND_ASSERT(EX(func) == (zend_function*)op_array);
- ZEND_ASSERT(EX(object) == Z_OBJ(EG(This)));
EX(opline) = op_array->opcodes;
EX(call) = NULL;
} while (var != end);
}
- if (op_array->this_var != -1 && EX(object)) {
- ZVAL_OBJ(EX_VAR(op_array->this_var), EX(object));
- GC_REFCOUNT(EX(object))++;
+ if (op_array->this_var != -1 && Z_OBJ(EX(This))) {
+ ZVAL_OBJ(EX_VAR(op_array->this_var), Z_OBJ(EX(This)));
+ GC_REFCOUNT(Z_OBJ(EX(This)))++;
}
if (!op_array->run_time_cache && op_array->last_cache_slot) {
static zend_always_inline void i_init_code_execute_data(zend_execute_data *execute_data, zend_op_array *op_array, zval *return_value, vm_frame_kind frame_kind TSRMLS_DC) /* {{{ */
{
ZEND_ASSERT(EX(func) == (zend_function*)op_array);
- ZEND_ASSERT(EX(object) == Z_OBJ(EG(This)));
EX(opline) = op_array->opcodes;
EX(call) = NULL;
static zend_always_inline void i_init_execute_data(zend_execute_data *execute_data, zend_op_array *op_array, zval *return_value, vm_frame_kind frame_kind TSRMLS_DC) /* {{{ */
{
ZEND_ASSERT(EX(func) == (zend_function*)op_array);
- ZEND_ASSERT(EX(object) == Z_OBJ(EG(This)));
EX(opline) = op_array->opcodes;
EX(call) = NULL;
} while (var != end);
}
- if (op_array->this_var != -1 && EX(object)) {
- ZVAL_OBJ(EX_VAR(op_array->this_var), EX(object));
- GC_REFCOUNT(EX(object))++;
+ if (op_array->this_var != -1 && Z_OBJ(EX(This))) {
+ ZVAL_OBJ(EX_VAR(op_array->this_var), Z_OBJ(EX(This)));
+ GC_REFCOUNT(Z_OBJ(EX(This)))++;
}
}
num_args,
call->flags,
call->called_scope,
- call->object,
+ Z_OBJ(call->This),
NULL TSRMLS_CC);
EX(num_args) = num_args;
call->num_args = 0;
call->flags = flags;
call->called_scope = called_scope;
- call->object = object;
+ ZVAL_OBJ(&call->This, object);
call->prev_execute_data = prev;
return call;
}
EG(scope) = NULL;
- ZVAL_OBJ(&EG(This), NULL);
-
EG(active) = 1;
}
/* }}} */
zend_execute_data *call, dummy_execute_data;
zend_fcall_info_cache fci_cache_local;
zend_function *func;
- zend_object *orig_object;
zend_class_entry *orig_scope;
zval tmp;
break;
}
- orig_object = Z_OBJ(EG(This));
orig_scope = EG(scope);
/* Initialize execute_data */
EG(scope) = calling_scope;
if (!fci->object ||
(func->common.fn_flags & ZEND_ACC_STATIC)) {
- Z_OBJ(EG(This)) = call->object = NULL;
+ Z_OBJ(call->This) = NULL;
+ Z_TYPE_INFO(call->This) = IS_UNDEF;
} else {
- Z_OBJ(EG(This)) = fci->object;
- Z_ADDREF(EG(This));
+ ZVAL_OBJ(&call->This, fci->object);
+ GC_REFCOUNT(fci->object)++;
}
if (func->type == ZEND_USER_FUNCTION) {
EG(current_execute_data) = call;
if (EXPECTED(zend_execute_internal == NULL)) {
/* saves one function call if zend_execute_internal is not used */
- func->internal_function.handler(fci->param_count, fci->retval TSRMLS_CC);
+ func->internal_function.handler(call, fci->retval TSRMLS_CC);
} else {
zend_execute_internal(call, fci->retval TSRMLS_CC);
}
if (fci->object) {
call->prev_execute_data = EG(current_execute_data);
EG(current_execute_data) = call;
- fci->object->handlers->call_method(func->common.function_name, fci->object, fci->param_count, fci->retval TSRMLS_CC);
+ fci->object->handlers->call_method(func->common.function_name, fci->object, call, fci->retval TSRMLS_CC);
EG(current_execute_data) = call->prev_execute_data;
} else {
zend_error_noreturn(E_ERROR, "Cannot call overloaded function for non-object");
}
}
- if (Z_OBJ(EG(This))) {
- zval_ptr_dtor(&EG(This));
+ if (fci->object && !(func->common.fn_flags & ZEND_ACC_STATIC)) {
+ OBJ_RELEASE(fci->object);
}
- Z_OBJ(EG(This)) = orig_object;
EG(scope) = orig_scope;
if (EG(current_execute_data) == &dummy_execute_data) {
EG(current_execute_data) = dummy_execute_data.prev_execute_data;
/* If yield was used as a function argument there may be active
* method calls those objects need to be freed */
while (execute_data->call) {
- if (execute_data->call->object) {
- OBJ_RELEASE(execute_data->call->object);
+ if (Z_OBJ(execute_data->call->This)) {
+ OBJ_RELEASE(Z_OBJ(execute_data->call->This));
}
execute_data->call = execute_data->call->prev_execute_data;
}
zend_clean_and_cache_symbol_table(execute_data->symbol_table TSRMLS_CC);
}
- if (execute_data->object) {
- OBJ_RELEASE(execute_data->object);
+ if (Z_OBJ(execute_data->This)) {
+ OBJ_RELEASE(Z_OBJ(execute_data->This));
}
/* A fatal error / die occurred during the generator execution. Trying to clean
object_init_ex(return_value, zend_ce_generator);
- if (Z_OBJ(EG(This))) {
- Z_ADDREF(EG(This));
+ if (Z_OBJ(call->This)) {
+ Z_ADDREF(call->This);
}
/* Save execution context in generator object. */
{
/* Backup executor globals */
zend_execute_data *original_execute_data = EG(current_execute_data);
- zend_object *original_This;
zend_class_entry *original_scope = EG(scope);
zend_vm_stack original_stack = EG(argument_stack);
- original_This = Z_OBJ(EG(This));
-
/* Set executor globals */
EG(current_execute_data) = generator->execute_data;
- Z_OBJ(EG(This)) = generator->execute_data->object;
EG(scope) = generator->execute_data->scope;
EG(argument_stack) = generator->stack;
/* Restore executor globals */
EG(current_execute_data) = original_execute_data;
- Z_OBJ(EG(This)) = original_This;
EG(scope) = original_scope;
EG(argument_stack) = original_stack;
zend_class_entry *scope;
- zval This;
-
zend_long precision;
int ticks_count;
ZEND_API void zend_std_call_user_call(INTERNAL_FUNCTION_PARAMETERS) /* {{{ */
{
- zend_internal_function *func = (zend_internal_function *)EG(current_execute_data)->func;
+ zend_internal_function *func = (zend_internal_function *)EX(func);
zval method_name, method_args;
zval method_result;
zend_class_entry *ce = Z_OBJCE_P(getThis());
ZEND_API void zend_std_callstatic_user_call(INTERNAL_FUNCTION_PARAMETERS) /* {{{ */
{
- zend_internal_function *func = (zend_internal_function *)EG(current_execute_data)->func;
+ zend_internal_function *func = (zend_internal_function *)EX(func);
zval method_name, method_args;
zval method_result;
zend_class_entry *ce = EG(scope);
zend_string_free(lc_function_name);
}
if (ce->__call &&
- Z_OBJ(EG(This)) &&
- Z_OBJ_HT(EG(This))->get_class_entry &&
- instanceof_function(Z_OBJCE(EG(This)), ce TSRMLS_CC)) {
+ Z_OBJ(EG(current_execute_data)->This) &&
+ Z_OBJ_HT(EG(current_execute_data)->This)->get_class_entry &&
+ instanceof_function(Z_OBJCE(EG(current_execute_data)->This), ce TSRMLS_CC)) {
return zend_get_user_call_function(ce, function_name);
} else if (ce->__callstatic) {
return zend_get_user_callstatic_function(ce, function_name);
typedef struct _zend_object_handlers zend_object_handlers;
typedef struct _zend_class_entry zend_class_entry;
typedef union _zend_function zend_function;
+typedef struct _zend_execute_data zend_execute_data;
typedef struct _zval_struct zval;
vm_frame_kind frame_kind = EX(frame_kind);
if (frame_kind == VM_FRAME_NESTED_FUNCTION) {
+ zend_object *object;
+
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(func)->op_array.fn_flags & ZEND_ACC_CLOSURE) != 0) && EX(func)->op_array.prototype) {
OBJ_RELEASE((zend_object*)EX(func)->op_array.prototype);
}
+ object = Z_OBJ(EX(This));
zend_vm_stack_free_call_frame(execute_data TSRMLS_CC);
execute_data = EG(current_execute_data);
- if (Z_OBJ(EG(This))) {
+ if (object) {
if (UNEXPECTED(EG(exception) != NULL) && (EX(opline)->op1.num & ZEND_CALL_CTOR)) {
if (!(EX(opline)->op1.num & ZEND_CALL_CTOR_RESULT_UNUSED)) {
- Z_DELREF(EG(This));
+ GC_REFCOUNT(object)--;
}
- if (Z_REFCOUNT(EG(This)) == 1) {
- zend_object_store_ctor_failed(Z_OBJ(EG(This)) TSRMLS_CC);
+ if (GC_REFCOUNT(object) == 1) {
+ zend_object_store_ctor_failed(object TSRMLS_CC);
}
}
- if (!Z_DELREF(EG(This))) {
- _zval_dtor_func_for_ptr(Z_COUNTED(EG(This)) ZEND_FILE_LINE_CC);
- } else if (UNEXPECTED(!Z_GC_INFO(EG(This)))) {
- gc_possible_root(Z_COUNTED(EG(This)) TSRMLS_CC);
- }
+ OBJ_RELEASE(object);
}
- Z_OBJ(EG(This)) = EX(object);
EG(scope) = EX(scope);
if (UNEXPECTED(EG(exception) != NULL)) {
if (UNEXPECTED(ce->constructor == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot call constructor");
}
- if (EX(object) && zend_get_class_entry(EX(object) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
+ if (Z_OBJ(EX(This)) && zend_get_class_entry(Z_OBJ(EX(This)) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name->val);
}
fbc = ce->constructor;
object = NULL;
if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
- if (EX(object)) {
- object = EX(object);
+ if (Z_OBJ(EX(This))) {
+ object = Z_OBJ(EX(This));
GC_REFCOUNT(object)++;
if (object->handlers->get_class_entry &&
!instanceof_function(zend_get_class_entry(object TSRMLS_CC), ce TSRMLS_CC)) {
USE_OPLINE
zend_execute_data *call = EX(call);
zend_function *fbc = call->func;
+ zend_object *object = Z_OBJ(call->This);
SAVE_OPLINE();
EX(call) = call->prev_execute_data;
}
if (fbc->common.scope &&
!(fbc->common.fn_flags & ZEND_ACC_STATIC) &&
- !call->object) {
+ !object) {
if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
/* FIXME: output identifiers properly */
if (fbc->common.scope) {
should_change_scope = 1;
- Z_OBJ(EG(This)) = call->object;
/* TODO: we don't set scope if we call an object method ??? */
/* See: ext/pdo_sqlite/tests/pdo_fetch_func_001.phpt */
#if 1
- EG(scope) = (call->object) ? NULL : fbc->common.scope;
+ EG(scope) = object ? NULL : fbc->common.scope;
#else
EG(scope) = fbc->common.scope;
#endif
- } else {
+ } else {
call->called_scope = EX(called_scope);
+ Z_OBJ(call->This) = Z_OBJ(EX(This));
}
call->prev_execute_data = execute_data;
if (!zend_execute_internal) {
/* saves one function call if zend_execute_internal is not used */
- fbc->internal_function.handler(call->num_args, ret TSRMLS_CC);
+ fbc->internal_function.handler(call, ret TSRMLS_CC);
} else {
zend_execute_internal(call, ret TSRMLS_CC);
}
} else if (EXPECTED(fbc->type == ZEND_USER_FUNCTION)) {
zval *return_value = NULL;
- Z_OBJ(EG(This)) = call->object;
EG(scope) = fbc->common.scope;
call->symbol_table = NULL;
if (RETURN_VALUE_USED(opline)) {
}
}
} else { /* ZEND_OVERLOADED_FUNCTION */
- Z_OBJ(EG(This)) = call->object;
EG(scope) = fbc->common.scope;
ZVAL_NULL(EX_VAR(opline->result.var));
/* Not sure what should be done here if it's a static method */
- if (EXPECTED(call->object != NULL)) {
+ if (EXPECTED(object != NULL)) {
call->prev_execute_data = execute_data;
EG(current_execute_data) = call;
- call->object->handlers->call_method(fbc->common.function_name, call->object, call->num_args, EX_VAR(opline->result.var) TSRMLS_CC);
+ object->handlers->call_method(fbc->common.function_name, object, call, EX_VAR(opline->result.var) TSRMLS_CC);
EG(current_execute_data) = call->prev_execute_data;
} else {
zend_error_noreturn(E_ERROR, "Cannot call overloaded function for non-object");
}
ZEND_VM_C_LABEL(fcall_end_change_scope):
- if (Z_OBJ(EG(This))) {
+ if (object) {
if (UNEXPECTED(EG(exception) != NULL) && (opline->op1.num & ZEND_CALL_CTOR)) {
if (!(opline->op1.num & ZEND_CALL_CTOR_RESULT_UNUSED)) {
- Z_DELREF(EG(This));
+ GC_REFCOUNT(object)--;
}
- if (Z_REFCOUNT(EG(This)) == 1) {
- zend_object_store_ctor_failed(Z_OBJ(EG(This)) TSRMLS_CC);
+ if (GC_REFCOUNT(object) == 1) {
+ zend_object_store_ctor_failed(object TSRMLS_CC);
}
}
- OBJ_RELEASE(Z_OBJ(EG(This)));
+ OBJ_RELEASE(object);
}
- Z_OBJ(EG(This)) = EX(object);
EG(scope) = EX(scope);
ZEND_VM_C_LABEL(fcall_end):
if (EX(call)->func->common.fn_flags & ZEND_ACC_CLOSURE) {
OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype);
}
- if (EX(call)->object) {
- OBJ_RELEASE(EX(call)->object);
+ if (Z_OBJ(EX(call)->This)) {
+ OBJ_RELEASE(Z_OBJ(EX(call)->This));
}
EX(call)->func = (zend_function*)&zend_pass_function;
EX(call)->called_scope = NULL;
- EX(call)->object = NULL;
+ Z_OBJ(EX(call)->This) = NULL;
} else {
uint32_t arg_num = 1;
if (EX(call)->func->common.fn_flags & ZEND_ACC_CLOSURE) {
OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype);
}
- if (EX(call)->object) {
- OBJ_RELEASE(EX(call)->object);
+ if (Z_OBJ(EX(call)->This)) {
+ OBJ_RELEASE(Z_OBJ(EX(call)->This));
}
EX(call)->func = (zend_function*)&zend_pass_function;
EX(call)->called_scope = NULL;
- EX(call)->object = NULL;
+ Z_OBJ(EX(call)->This) = NULL;
break;
}
if (EX(call)->func->common.fn_flags & ZEND_ACC_CLOSURE) {
OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype);
}
- if (EX(call)->object) {
- OBJ_RELEASE(EX(call)->object);
+ if (Z_OBJ(EX(call)->This)) {
+ OBJ_RELEASE(Z_OBJ(EX(call)->This));
}
EX(call)->func = (zend_function*)&zend_pass_function;
EX(call)->called_scope = NULL;
- EX(call)->object = NULL;
+ Z_OBJ(EX(call)->This) = NULL;
FREE_OP1();
CHECK_EXCEPTION();
}
call = zend_vm_stack_push_call_frame(
- (zend_function*)new_op_array, 0, 0, EX(called_scope), EX(object), NULL TSRMLS_CC);
+ (zend_function*)new_op_array, 0, 0, EX(called_scope), Z_OBJ(EX(This)), NULL TSRMLS_CC);
if (EX(symbol_table)) {
call->symbol_table = EX(symbol_table);
* arguments pushed to the stack that have to be dtor'ed. */
zend_vm_stack_free_args(EX(call) TSRMLS_CC);
- if (call->object) {
+ if (Z_OBJ(call->This)) {
if (call->flags & ZEND_CALL_CTOR) {
if (!(call->flags & ZEND_CALL_CTOR_RESULT_UNUSED)) {
- GC_REFCOUNT(call->object)--;
+ GC_REFCOUNT(Z_OBJ(call->This))--;
}
- if (GC_REFCOUNT(call->object) == 1) {
- zend_object_store_ctor_failed(call->object TSRMLS_CC);
+ if (GC_REFCOUNT(Z_OBJ(call->This)) == 1) {
+ zend_object_store_ctor_failed(Z_OBJ(call->This) TSRMLS_CC);
}
}
- OBJ_RELEASE(call->object);
+ OBJ_RELEASE(Z_OBJ(call->This));
}
EX(call) = call->prev_execute_data;
zend_vm_stack_free_call_frame(call TSRMLS_CC);
if (closure_is_static || closure_is_being_defined_inside_static_context) {
zend_create_closure(EX_VAR(opline->result.var), Z_FUNC_P(zfunc), EX(called_scope), NULL TSRMLS_CC);
} else {
- zend_create_closure(EX_VAR(opline->result.var), Z_FUNC_P(zfunc), EX(scope), Z_OBJ(EG(This)) ? &EG(This) : NULL TSRMLS_CC);
+ zend_create_closure(EX_VAR(opline->result.var), Z_FUNC_P(zfunc), EX(scope), Z_OBJ(EX(This)) ? &EX(This) : NULL TSRMLS_CC);
}
CHECK_EXCEPTION();
}
execute_data = zend_vm_stack_push_call_frame(
- (zend_function*)op_array, 0, 0, EG(current_execute_data) ? EG(current_execute_data)->called_scope : NULL, Z_OBJ(EG(This)), NULL TSRMLS_CC);
+ (zend_function*)op_array, 0, 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 TSRMLS_CC);
if (EG(current_execute_data)) {
execute_data->symbol_table = zend_rebuild_symbol_table(TSRMLS_C);
} else {
vm_frame_kind frame_kind = EX(frame_kind);
if (frame_kind == VM_FRAME_NESTED_FUNCTION) {
+ zend_object *object;
+
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(func)->op_array.fn_flags & ZEND_ACC_CLOSURE) != 0) && EX(func)->op_array.prototype) {
OBJ_RELEASE((zend_object*)EX(func)->op_array.prototype);
}
+ object = Z_OBJ(EX(This));
zend_vm_stack_free_call_frame(execute_data TSRMLS_CC);
execute_data = EG(current_execute_data);
- if (Z_OBJ(EG(This))) {
+ if (object) {
if (UNEXPECTED(EG(exception) != NULL) && (EX(opline)->op1.num & ZEND_CALL_CTOR)) {
if (!(EX(opline)->op1.num & ZEND_CALL_CTOR_RESULT_UNUSED)) {
- Z_DELREF(EG(This));
+ GC_REFCOUNT(object)--;
}
- if (Z_REFCOUNT(EG(This)) == 1) {
- zend_object_store_ctor_failed(Z_OBJ(EG(This)) TSRMLS_CC);
+ if (GC_REFCOUNT(object) == 1) {
+ zend_object_store_ctor_failed(object TSRMLS_CC);
}
}
- if (!Z_DELREF(EG(This))) {
- _zval_dtor_func_for_ptr(Z_COUNTED(EG(This)) ZEND_FILE_LINE_CC);
- } else if (UNEXPECTED(!Z_GC_INFO(EG(This)))) {
- gc_possible_root(Z_COUNTED(EG(This)) TSRMLS_CC);
- }
+ OBJ_RELEASE(object);
}
- Z_OBJ(EG(This)) = EX(object);
EG(scope) = EX(scope);
if (UNEXPECTED(EG(exception) != NULL)) {
USE_OPLINE
zend_execute_data *call = EX(call);
zend_function *fbc = call->func;
+ zend_object *object = Z_OBJ(call->This);
SAVE_OPLINE();
EX(call) = call->prev_execute_data;
}
if (fbc->common.scope &&
!(fbc->common.fn_flags & ZEND_ACC_STATIC) &&
- !call->object) {
+ !object) {
if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
/* FIXME: output identifiers properly */
if (fbc->common.scope) {
should_change_scope = 1;
- Z_OBJ(EG(This)) = call->object;
/* TODO: we don't set scope if we call an object method ??? */
/* See: ext/pdo_sqlite/tests/pdo_fetch_func_001.phpt */
#if 1
- EG(scope) = (call->object) ? NULL : fbc->common.scope;
+ EG(scope) = object ? NULL : fbc->common.scope;
#else
EG(scope) = fbc->common.scope;
#endif
} else {
call->called_scope = EX(called_scope);
+ Z_OBJ(call->This) = Z_OBJ(EX(This));
}
call->prev_execute_data = execute_data;
if (!zend_execute_internal) {
/* saves one function call if zend_execute_internal is not used */
- fbc->internal_function.handler(call->num_args, ret TSRMLS_CC);
+ fbc->internal_function.handler(call, ret TSRMLS_CC);
} else {
zend_execute_internal(call, ret TSRMLS_CC);
}
} else if (EXPECTED(fbc->type == ZEND_USER_FUNCTION)) {
zval *return_value = NULL;
- Z_OBJ(EG(This)) = call->object;
EG(scope) = fbc->common.scope;
call->symbol_table = NULL;
if (RETURN_VALUE_USED(opline)) {
}
}
} else { /* ZEND_OVERLOADED_FUNCTION */
- Z_OBJ(EG(This)) = call->object;
EG(scope) = fbc->common.scope;
ZVAL_NULL(EX_VAR(opline->result.var));
/* Not sure what should be done here if it's a static method */
- if (EXPECTED(call->object != NULL)) {
+ if (EXPECTED(object != NULL)) {
call->prev_execute_data = execute_data;
EG(current_execute_data) = call;
- call->object->handlers->call_method(fbc->common.function_name, call->object, call->num_args, EX_VAR(opline->result.var) TSRMLS_CC);
+ object->handlers->call_method(fbc->common.function_name, object, call, EX_VAR(opline->result.var) TSRMLS_CC);
EG(current_execute_data) = call->prev_execute_data;
} else {
zend_error_noreturn(E_ERROR, "Cannot call overloaded function for non-object");
}
fcall_end_change_scope:
- if (Z_OBJ(EG(This))) {
+ if (object) {
if (UNEXPECTED(EG(exception) != NULL) && (opline->op1.num & ZEND_CALL_CTOR)) {
if (!(opline->op1.num & ZEND_CALL_CTOR_RESULT_UNUSED)) {
- Z_DELREF(EG(This));
+ GC_REFCOUNT(object)--;
}
- if (Z_REFCOUNT(EG(This)) == 1) {
- zend_object_store_ctor_failed(Z_OBJ(EG(This)) TSRMLS_CC);
+ if (GC_REFCOUNT(object) == 1) {
+ zend_object_store_ctor_failed(object TSRMLS_CC);
}
}
- OBJ_RELEASE(Z_OBJ(EG(This)));
+ OBJ_RELEASE(object);
}
- Z_OBJ(EG(This)) = EX(object);
EG(scope) = EX(scope);
fcall_end:
if (EX(call)->func->common.fn_flags & ZEND_ACC_CLOSURE) {
OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype);
}
- if (EX(call)->object) {
- OBJ_RELEASE(EX(call)->object);
+ if (Z_OBJ(EX(call)->This)) {
+ OBJ_RELEASE(Z_OBJ(EX(call)->This));
}
EX(call)->func = (zend_function*)&zend_pass_function;
EX(call)->called_scope = NULL;
- EX(call)->object = NULL;
+ Z_OBJ(EX(call)->This) = NULL;
} else {
uint32_t arg_num = 1;
if (EX(call)->func->common.fn_flags & ZEND_ACC_CLOSURE) {
OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype);
}
- if (EX(call)->object) {
- OBJ_RELEASE(EX(call)->object);
+ if (Z_OBJ(EX(call)->This)) {
+ OBJ_RELEASE(Z_OBJ(EX(call)->This));
}
EX(call)->func = (zend_function*)&zend_pass_function;
EX(call)->called_scope = NULL;
- EX(call)->object = NULL;
+ Z_OBJ(EX(call)->This) = NULL;
break;
}
* arguments pushed to the stack that have to be dtor'ed. */
zend_vm_stack_free_args(EX(call) TSRMLS_CC);
- if (call->object) {
+ if (Z_OBJ(call->This)) {
if (call->flags & ZEND_CALL_CTOR) {
if (!(call->flags & ZEND_CALL_CTOR_RESULT_UNUSED)) {
- GC_REFCOUNT(call->object)--;
+ GC_REFCOUNT(Z_OBJ(call->This))--;
}
- if (GC_REFCOUNT(call->object) == 1) {
- zend_object_store_ctor_failed(call->object TSRMLS_CC);
+ if (GC_REFCOUNT(Z_OBJ(call->This)) == 1) {
+ zend_object_store_ctor_failed(Z_OBJ(call->This) TSRMLS_CC);
}
}
- OBJ_RELEASE(call->object);
+ OBJ_RELEASE(Z_OBJ(call->This));
}
EX(call) = call->prev_execute_data;
zend_vm_stack_free_call_frame(call TSRMLS_CC);
}
call = zend_vm_stack_push_call_frame(
- (zend_function*)new_op_array, 0, 0, EX(called_scope), EX(object), NULL TSRMLS_CC);
+ (zend_function*)new_op_array, 0, 0, EX(called_scope), Z_OBJ(EX(This)), NULL TSRMLS_CC);
if (EX(symbol_table)) {
call->symbol_table = EX(symbol_table);
if (UNEXPECTED(ce->constructor == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot call constructor");
}
- if (EX(object) && zend_get_class_entry(EX(object) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
+ if (Z_OBJ(EX(This)) && zend_get_class_entry(Z_OBJ(EX(This)) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name->val);
}
fbc = ce->constructor;
object = NULL;
if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
- if (EX(object)) {
- object = EX(object);
+ if (Z_OBJ(EX(This))) {
+ object = Z_OBJ(EX(This));
GC_REFCOUNT(object)++;
if (object->handlers->get_class_entry &&
!instanceof_function(zend_get_class_entry(object TSRMLS_CC), ce TSRMLS_CC)) {
if (UNEXPECTED(ce->constructor == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot call constructor");
}
- if (EX(object) && zend_get_class_entry(EX(object) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
+ if (Z_OBJ(EX(This)) && zend_get_class_entry(Z_OBJ(EX(This)) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name->val);
}
fbc = ce->constructor;
object = NULL;
if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
- if (EX(object)) {
- object = EX(object);
+ if (Z_OBJ(EX(This))) {
+ object = Z_OBJ(EX(This));
GC_REFCOUNT(object)++;
if (object->handlers->get_class_entry &&
!instanceof_function(zend_get_class_entry(object TSRMLS_CC), ce TSRMLS_CC)) {
if (UNEXPECTED(ce->constructor == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot call constructor");
}
- if (EX(object) && zend_get_class_entry(EX(object) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
+ if (Z_OBJ(EX(This)) && zend_get_class_entry(Z_OBJ(EX(This)) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name->val);
}
fbc = ce->constructor;
object = NULL;
if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
- if (EX(object)) {
- object = EX(object);
+ if (Z_OBJ(EX(This))) {
+ object = Z_OBJ(EX(This));
GC_REFCOUNT(object)++;
if (object->handlers->get_class_entry &&
!instanceof_function(zend_get_class_entry(object TSRMLS_CC), ce TSRMLS_CC)) {
if (UNEXPECTED(ce->constructor == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot call constructor");
}
- if (EX(object) && zend_get_class_entry(EX(object) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
+ if (Z_OBJ(EX(This)) && zend_get_class_entry(Z_OBJ(EX(This)) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name->val);
}
fbc = ce->constructor;
object = NULL;
if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
- if (EX(object)) {
- object = EX(object);
+ if (Z_OBJ(EX(This))) {
+ object = Z_OBJ(EX(This));
GC_REFCOUNT(object)++;
if (object->handlers->get_class_entry &&
!instanceof_function(zend_get_class_entry(object TSRMLS_CC), ce TSRMLS_CC)) {
if (closure_is_static || closure_is_being_defined_inside_static_context) {
zend_create_closure(EX_VAR(opline->result.var), Z_FUNC_P(zfunc), EX(called_scope), NULL TSRMLS_CC);
} else {
- zend_create_closure(EX_VAR(opline->result.var), Z_FUNC_P(zfunc), EX(scope), Z_OBJ(EG(This)) ? &EG(This) : NULL TSRMLS_CC);
+ zend_create_closure(EX_VAR(opline->result.var), Z_FUNC_P(zfunc), EX(scope), Z_OBJ(EX(This)) ? &EX(This) : NULL TSRMLS_CC);
}
CHECK_EXCEPTION();
if (UNEXPECTED(ce->constructor == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot call constructor");
}
- if (EX(object) && zend_get_class_entry(EX(object) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
+ if (Z_OBJ(EX(This)) && zend_get_class_entry(Z_OBJ(EX(This)) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name->val);
}
fbc = ce->constructor;
object = NULL;
if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
- if (EX(object)) {
- object = EX(object);
+ if (Z_OBJ(EX(This))) {
+ object = Z_OBJ(EX(This));
GC_REFCOUNT(object)++;
if (object->handlers->get_class_entry &&
!instanceof_function(zend_get_class_entry(object TSRMLS_CC), ce TSRMLS_CC)) {
}
call = zend_vm_stack_push_call_frame(
- (zend_function*)new_op_array, 0, 0, EX(called_scope), EX(object), NULL TSRMLS_CC);
+ (zend_function*)new_op_array, 0, 0, EX(called_scope), Z_OBJ(EX(This)), NULL TSRMLS_CC);
if (EX(symbol_table)) {
call->symbol_table = EX(symbol_table);
if (EX(call)->func->common.fn_flags & ZEND_ACC_CLOSURE) {
OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype);
}
- if (EX(call)->object) {
- OBJ_RELEASE(EX(call)->object);
+ if (Z_OBJ(EX(call)->This)) {
+ OBJ_RELEASE(Z_OBJ(EX(call)->This));
}
EX(call)->func = (zend_function*)&zend_pass_function;
EX(call)->called_scope = NULL;
- EX(call)->object = NULL;
+ Z_OBJ(EX(call)->This) = NULL;
zval_ptr_dtor_nogc(free_op1.var);
CHECK_EXCEPTION();
}
call = zend_vm_stack_push_call_frame(
- (zend_function*)new_op_array, 0, 0, EX(called_scope), EX(object), NULL TSRMLS_CC);
+ (zend_function*)new_op_array, 0, 0, EX(called_scope), Z_OBJ(EX(This)), NULL TSRMLS_CC);
if (EX(symbol_table)) {
call->symbol_table = EX(symbol_table);
if (UNEXPECTED(ce->constructor == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot call constructor");
}
- if (EX(object) && zend_get_class_entry(EX(object) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
+ if (Z_OBJ(EX(This)) && zend_get_class_entry(Z_OBJ(EX(This)) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name->val);
}
fbc = ce->constructor;
object = NULL;
if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
- if (EX(object)) {
- object = EX(object);
+ if (Z_OBJ(EX(This))) {
+ object = Z_OBJ(EX(This));
GC_REFCOUNT(object)++;
if (object->handlers->get_class_entry &&
!instanceof_function(zend_get_class_entry(object TSRMLS_CC), ce TSRMLS_CC)) {
if (UNEXPECTED(ce->constructor == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot call constructor");
}
- if (EX(object) && zend_get_class_entry(EX(object) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
+ if (Z_OBJ(EX(This)) && zend_get_class_entry(Z_OBJ(EX(This)) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name->val);
}
fbc = ce->constructor;
object = NULL;
if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
- if (EX(object)) {
- object = EX(object);
+ if (Z_OBJ(EX(This))) {
+ object = Z_OBJ(EX(This));
GC_REFCOUNT(object)++;
if (object->handlers->get_class_entry &&
!instanceof_function(zend_get_class_entry(object TSRMLS_CC), ce TSRMLS_CC)) {
if (UNEXPECTED(ce->constructor == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot call constructor");
}
- if (EX(object) && zend_get_class_entry(EX(object) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
+ if (Z_OBJ(EX(This)) && zend_get_class_entry(Z_OBJ(EX(This)) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name->val);
}
fbc = ce->constructor;
object = NULL;
if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
- if (EX(object)) {
- object = EX(object);
+ if (Z_OBJ(EX(This))) {
+ object = Z_OBJ(EX(This));
GC_REFCOUNT(object)++;
if (object->handlers->get_class_entry &&
!instanceof_function(zend_get_class_entry(object TSRMLS_CC), ce TSRMLS_CC)) {
if (UNEXPECTED(ce->constructor == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot call constructor");
}
- if (EX(object) && zend_get_class_entry(EX(object) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
+ if (Z_OBJ(EX(This)) && zend_get_class_entry(Z_OBJ(EX(This)) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name->val);
}
fbc = ce->constructor;
object = NULL;
if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
- if (EX(object)) {
- object = EX(object);
+ if (Z_OBJ(EX(This))) {
+ object = Z_OBJ(EX(This));
GC_REFCOUNT(object)++;
if (object->handlers->get_class_entry &&
!instanceof_function(zend_get_class_entry(object TSRMLS_CC), ce TSRMLS_CC)) {
if (UNEXPECTED(ce->constructor == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot call constructor");
}
- if (EX(object) && zend_get_class_entry(EX(object) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
+ if (Z_OBJ(EX(This)) && zend_get_class_entry(Z_OBJ(EX(This)) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name->val);
}
fbc = ce->constructor;
object = NULL;
if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
- if (EX(object)) {
- object = EX(object);
+ if (Z_OBJ(EX(This))) {
+ object = Z_OBJ(EX(This));
GC_REFCOUNT(object)++;
if (object->handlers->get_class_entry &&
!instanceof_function(zend_get_class_entry(object TSRMLS_CC), ce TSRMLS_CC)) {
zend_object_clone_obj_t clone_call;
SAVE_OPLINE();
- obj = _get_obj_zval_ptr_unused(TSRMLS_C);
+ obj = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
if (IS_UNUSED == IS_CONST ||
UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT)) {
{
USE_OPLINE
zend_free_op free_op_data1;
- zval *object = _get_obj_zval_ptr_unused(TSRMLS_C);
+ zval *object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
zval *property = opline->op2.zv;
zval *value;
int have_get_ptr = 0;
zval *value, *container;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
} else if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
int have_get_ptr = 0;
SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(TSRMLS_C);
+ object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
property = opline->op2.zv;
retval = EX_VAR(opline->result.var);
int have_get_ptr = 0;
SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(TSRMLS_C);
+ object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
property = opline->op2.zv;
retval = EX_VAR(opline->result.var);
zval *offset;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
offset = opline->op2.zv;
if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
SAVE_OPLINE();
property = opline->op2.zv;
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
SAVE_OPLINE();
property = opline->op2.zv;
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
zval *offset;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
offset = opline->op2.zv;
if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
SAVE_OPLINE();
property = opline->op2.zv;
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
if (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR) {
zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
zval *container, *property;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
property = opline->op2.zv;
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
zval *property_name;
SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(TSRMLS_C);
+ object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
property_name = opline->op2.zv;
if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) {
zend_error_noreturn(E_ERROR, "Method name must be a string");
}
- object = _get_obj_zval_ptr_unused(TSRMLS_C);
+ object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
if (UNEXPECTED(EG(exception) != NULL)) {
zend_ulong hval;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
}
zval *offset;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
}
zval *offset;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
offset = opline->op2.zv;
if (Z_TYPE_P(container) == IS_ARRAY) {
zval *offset;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
offset = opline->op2.zv;
if (Z_TYPE_P(container) == IS_OBJECT) {
{
USE_OPLINE
zend_free_op free_op2, free_op_data1;
- zval *object = _get_obj_zval_ptr_unused(TSRMLS_C);
+ zval *object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
zval *property = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
zval *value;
int have_get_ptr = 0;
zval *value, *container;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
} else if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
int have_get_ptr = 0;
SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(TSRMLS_C);
+ object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
property = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
retval = EX_VAR(opline->result.var);
int have_get_ptr = 0;
SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(TSRMLS_C);
+ object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
property = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
retval = EX_VAR(opline->result.var);
zval *offset;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
SAVE_OPLINE();
property = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
SAVE_OPLINE();
property = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
zval *offset;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
SAVE_OPLINE();
property = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
if (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR) {
zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
zval *container, *property;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
property = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
zval *property_name;
SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(TSRMLS_C);
+ object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
property_name = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) {
zend_error_noreturn(E_ERROR, "Method name must be a string");
}
- object = _get_obj_zval_ptr_unused(TSRMLS_C);
+ object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
if (UNEXPECTED(EG(exception) != NULL)) {
zend_ulong hval;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
}
zval *offset;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
}
zval *offset;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
if (Z_TYPE_P(container) == IS_ARRAY) {
zval *offset;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
if (Z_TYPE_P(container) == IS_OBJECT) {
{
USE_OPLINE
zend_free_op free_op2, free_op_data1;
- zval *object = _get_obj_zval_ptr_unused(TSRMLS_C);
+ zval *object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
zval *property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
zval *value;
int have_get_ptr = 0;
zval *value, *container;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
} else if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
int have_get_ptr = 0;
SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(TSRMLS_C);
+ object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
retval = EX_VAR(opline->result.var);
int have_get_ptr = 0;
SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(TSRMLS_C);
+ object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
retval = EX_VAR(opline->result.var);
zval *offset;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
SAVE_OPLINE();
property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
SAVE_OPLINE();
property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
zval *offset;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
SAVE_OPLINE();
property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
if (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR) {
zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
zval *container, *property;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
zval *property_name;
SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(TSRMLS_C);
+ object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
property_name = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) {
zend_error_noreturn(E_ERROR, "Method name must be a string");
}
- object = _get_obj_zval_ptr_unused(TSRMLS_C);
+ object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
if (UNEXPECTED(EG(exception) != NULL)) {
zend_ulong hval;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
}
zval *offset;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
}
zval *offset;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
if (Z_TYPE_P(container) == IS_ARRAY) {
zval *offset;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
if (Z_TYPE_P(container) == IS_OBJECT) {
{
USE_OPLINE
zend_free_op free_op_data1;
- zval *object = _get_obj_zval_ptr_unused(TSRMLS_C);
+ zval *object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
zval *property = NULL;
zval *value;
int have_get_ptr = 0;
zval *value, *container;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
} else if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
{
USE_OPLINE
zend_free_op free_op_data1;
- zval *object = _get_obj_zval_ptr_unused(TSRMLS_C);
+ zval *object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
zval *property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
zval *value;
int have_get_ptr = 0;
zval *value, *container;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
} else if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
int have_get_ptr = 0;
SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(TSRMLS_C);
+ object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
retval = EX_VAR(opline->result.var);
int have_get_ptr = 0;
SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(TSRMLS_C);
+ object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
retval = EX_VAR(opline->result.var);
zval *offset;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
SAVE_OPLINE();
property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
SAVE_OPLINE();
property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
zval *offset;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
SAVE_OPLINE();
property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
if (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR) {
zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
zval *container, *property;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
zval *property_name;
SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(TSRMLS_C);
+ object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
property_name = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) {
zend_error_noreturn(E_ERROR, "Method name must be a string");
}
- object = _get_obj_zval_ptr_unused(TSRMLS_C);
+ object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
if (UNEXPECTED(EG(exception) != NULL)) {
zend_ulong hval;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
}
zval *offset;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
}
zval *offset;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
if (Z_TYPE_P(container) == IS_ARRAY) {
zval *offset;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
if (Z_TYPE_P(container) == IS_OBJECT) {
if (EX(call)->func->common.fn_flags & ZEND_ACC_CLOSURE) {
OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype);
}
- if (EX(call)->object) {
- OBJ_RELEASE(EX(call)->object);
+ if (Z_OBJ(EX(call)->This)) {
+ OBJ_RELEASE(Z_OBJ(EX(call)->This));
}
EX(call)->func = (zend_function*)&zend_pass_function;
EX(call)->called_scope = NULL;
- EX(call)->object = NULL;
+ Z_OBJ(EX(call)->This) = NULL;
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
call = zend_vm_stack_push_call_frame(
- (zend_function*)new_op_array, 0, 0, EX(called_scope), EX(object), NULL TSRMLS_CC);
+ (zend_function*)new_op_array, 0, 0, EX(called_scope), Z_OBJ(EX(This)), NULL TSRMLS_CC);
if (EX(symbol_table)) {
call->symbol_table = EX(symbol_table);
}
execute_data = zend_vm_stack_push_call_frame(
- (zend_function*)op_array, 0, 0, EG(current_execute_data) ? EG(current_execute_data)->called_scope : NULL, Z_OBJ(EG(This)), NULL TSRMLS_CC);
+ (zend_function*)op_array, 0, 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 TSRMLS_CC);
if (EG(current_execute_data)) {
execute_data->symbol_table = zend_rebuild_symbol_table(TSRMLS_C);
} else {
"TMP" => "_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC)",
"VAR" => "_get_zval_ptr_var_deref(opline->op1.var, execute_data, &free_op1 TSRMLS_CC)",
"CONST" => "opline->op1.zv",
- "UNUSED" => "_get_obj_zval_ptr_unused(TSRMLS_C)",
+ "UNUSED" => "_get_obj_zval_ptr_unused(execute_data TSRMLS_CC)",
"CV" => "_get_zval_ptr_cv_deref_\\1(execute_data, opline->op1.var TSRMLS_CC)",
);
"TMP" => "_get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC)",
"VAR" => "_get_zval_ptr_var_deref(opline->op2.var, execute_data, &free_op2 TSRMLS_CC)",
"CONST" => "opline->op2.zv",
- "UNUSED" => "_get_obj_zval_ptr_unused(TSRMLS_C)",
+ "UNUSED" => "_get_obj_zval_ptr_unused(execute_data TSRMLS_CC)",
"CV" => "_get_zval_ptr_cv_deref_\\1(execute_data, opline->op2.var TSRMLS_CC)",
);
"TMP" => "NULL",
"VAR" => "_get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC)",
"CONST" => "NULL",
- "UNUSED" => "_get_obj_zval_ptr_unused(TSRMLS_C)",
+ "UNUSED" => "_get_obj_zval_ptr_unused(execute_data TSRMLS_CC)",
"CV" => "_get_zval_ptr_cv_\\1(execute_data, opline->op1.var TSRMLS_CC)",
);
"TMP" => "NULL",
"VAR" => "_get_zval_ptr_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC)",
"CONST" => "NULL",
- "UNUSED" => "_get_obj_zval_ptr_unused(TSRMLS_C)",
+ "UNUSED" => "_get_obj_zval_ptr_unused(execute_data TSRMLS_CC)",
"CV" => "_get_zval_ptr_cv_\\1(execute_data, opline->op2.var TSRMLS_CC)",
);
HRESULT hr;
VARIANT *vargs = NULL, *byref_vals = NULL;
int i, byref_count = 0, j;
- zend_internal_function *f = (zend_internal_function*)EG(current_execute_data)->func;
+ zend_internal_function *f = (zend_internal_function*)EX(func);
/* assumption: that the active function (f) is the function we generated for the engine */
if (!f || f->arg_info == NULL) {
zval *object = getThis();
Z_OBJ_HANDLER_P(object, call_method)(
- ((zend_internal_function*)EG(current_execute_data)->func)->function_name,
+ ((zend_internal_function*)EX(func))->function_name,
Z_OBJ_P(object),
INTERNAL_FUNCTION_PARAM_PASSTHRU);
}
return object;
} /* }}} */
-static void pdo_stmt_construct(pdo_stmt_t *stmt, zval *object, zend_class_entry *dbstmt_ce, zval *ctor_args TSRMLS_DC) /* {{{ */
+static void pdo_stmt_construct(zend_execute_data *execute_data, pdo_stmt_t *stmt, zval *object, zend_class_entry *dbstmt_ce, zval *ctor_args TSRMLS_DC) /* {{{ */
{
zval query_string;
zval z_key;
ZVAL_UNDEF(&stmt->lazy_object_ref);
if (dbh->methods->preparer(dbh, statement, statement_len, stmt, options TSRMLS_CC)) {
- pdo_stmt_construct(stmt, return_value, dbstmt_ce, &ctor_args TSRMLS_CC);
+ pdo_stmt_construct(execute_data, stmt, return_value, dbstmt_ce, &ctor_args TSRMLS_CC);
return;
}
stmt->executed = 1;
}
if (ret) {
- pdo_stmt_construct(stmt, return_value, dbh->def_stmt_ce, &dbh->def_stmt_ctor_args TSRMLS_CC);
+ pdo_stmt_construct(execute_data, stmt, return_value, dbh->def_stmt_ce, &dbh->def_stmt_ctor_args TSRMLS_CC);
return;
}
}
/* Method macros */
#define METHOD_NOTSTATIC(ce) \
- if (!Z_OBJ(EG(This)) || !instanceof_function(Z_OBJCE(EG(This)), ce TSRMLS_CC)) { \
+ if (!Z_OBJ(EX(This)) || !instanceof_function(Z_OBJCE(EX(This)), ce TSRMLS_CC)) { \
php_error_docref(NULL TSRMLS_CC, E_ERROR, "%s() cannot be called statically", get_active_function_name(TSRMLS_C)); \
return; \
} \
int _old_soap_version = SOAP_GLOBAL(soap_version);\
SOAP_GLOBAL(use_soap_error_handler) = 1;\
SOAP_GLOBAL(error_code) = "Server";\
- Z_OBJ(SOAP_GLOBAL(error_object)) = Z_OBJ(EG(This));
+ Z_OBJ(SOAP_GLOBAL(error_object)) = Z_OBJ(EX(This));
#define SOAP_SERVER_END_CODE() \
SOAP_GLOBAL(use_soap_error_handler) = _old_handler;\
int _bailout = 0;\
SOAP_GLOBAL(use_soap_error_handler) = 1;\
SOAP_GLOBAL(error_code) = "Client";\
- Z_OBJ(SOAP_GLOBAL(error_object)) = Z_OBJ(EG(This));\
+ Z_OBJ(SOAP_GLOBAL(error_object)) = Z_OBJ(EX(This));\
zend_try {
#define SOAP_CLIENT_END_CODE() \
fci.function_table = &Z_OBJCE_P(getThis())->function_table;
ZVAL_STRINGL(&fci.function_name, "gettraceasstring", sizeof("gettraceasstring")-1);
fci.symbol_table = NULL;
- fci.object = Z_OBJ(EG(This));
+ fci.object = Z_OBJ(EX(This));
fci.retval = &trace;
fci.param_count = 0;
fci.params = NULL;
return ret;
}
-static void do_soap_call(zval* this_ptr,
+static void do_soap_call(zend_execute_data *execute_data,
+ zval* this_ptr,
char* function,
size_t function_len,
int arg_count,
if (output_headers) {
array_init(output_headers);
}
- do_soap_call(this_ptr, function, function_len, arg_count, real_args, return_value, location, soap_action, uri, soap_headers, output_headers TSRMLS_CC);
+ do_soap_call(execute_data, this_ptr, function, function_len, arg_count, real_args, return_value, location, soap_action, uri, soap_headers, output_headers TSRMLS_CC);
if (arg_count > 0) {
efree(real_args);
}
* The "scope" is determined by an opcode, if it is ZEND_FETCH_CLASS we know function was called indirectly by
* the Zend engine.
*/
- zend_execute_data *ex = EG(current_execute_data);
+ zend_execute_data *ex = EX(prev_execute_data);
while (ex && (!ex->func || !ZEND_USER_CODE(ex->func->type))) {
ex = ex->prev_execute_data;
if (intern->u.dir.index > pos) {
/* we first rewind */
- zend_call_method_with_0_params(&EG(This), Z_OBJCE(EG(This)), &intern->u.dir.func_rewind, "rewind", NULL);
+ zend_call_method_with_0_params(&EX(This), Z_OBJCE(EX(This)), &intern->u.dir.func_rewind, "rewind", NULL);
}
while (intern->u.dir.index < pos) {
int valid = 0;
- zend_call_method_with_0_params(&EG(This), Z_OBJCE(EG(This)), &intern->u.dir.func_valid, "valid", &retval);
+ zend_call_method_with_0_params(&EX(This), Z_OBJCE(EX(This)), &intern->u.dir.func_valid, "valid", &retval);
if (!Z_ISUNDEF(retval)) {
valid = zend_is_true(&retval TSRMLS_CC);
zval_ptr_dtor(&retval);
if (!valid) {
break;
}
- zend_call_method_with_0_params(&EG(This), Z_OBJCE(EG(This)), &intern->u.dir.func_next, "next", NULL);
+ zend_call_method_with_0_params(&EX(This), Z_OBJCE(EX(This)), &intern->u.dir.func_next, "next", NULL);
}
} /* }}} */
if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_CSV)) {
return spl_filesystem_file_read_csv(intern, intern->u.file.delimiter, intern->u.file.enclosure, intern->u.file.escape, NULL TSRMLS_CC);
} else {
- zend_call_method_with_0_params(this_ptr, Z_OBJCE_P(getThis()), &intern->u.file.func_getCurr, "getCurrentLine", &retval);
+ zend_execute_data *execute_data = EG(current_execute_data);
+ zend_call_method_with_0_params(this_ptr, Z_OBJCE(EX(This)), &intern->u.file.func_getCurr, "getCurrentLine", &retval);
}
if (!Z_ISUNDEF(retval)) {
if (intern->u.file.current_line || !Z_ISUNDEF(intern->u.file.current_zval)) {
return;
}
- if (!EG(current_execute_data)->prev_execute_data->func->common.scope) {
+ if (!EX(prev_execute_data)->func->common.scope) {
zend_error(E_ERROR, "Cannot call forward_static_call() when no class scope is active");
}
fci.retval = &retval;
- if (EG(current_execute_data)->called_scope &&
- instanceof_function(EG(current_execute_data)->called_scope, fci_cache.calling_scope TSRMLS_CC)) {
- fci_cache.called_scope = EG(current_execute_data)->called_scope;
+ if (EX(called_scope) &&
+ instanceof_function(EX(called_scope), fci_cache.calling_scope TSRMLS_CC)) {
+ fci_cache.called_scope = EX(called_scope);
}
if (zend_call_function(&fci, &fci_cache TSRMLS_CC) == SUCCESS && Z_TYPE(retval) != IS_UNDEF) {
zend_fcall_info_args(&fci, params TSRMLS_CC);
fci.retval = &retval;
- if (EG(current_execute_data)->called_scope &&
- instanceof_function(EG(current_execute_data)->called_scope, fci_cache.calling_scope TSRMLS_CC)) {
- fci_cache.called_scope = EG(current_execute_data)->called_scope;
+ if (EX(called_scope) &&
+ instanceof_function(EX(called_scope), fci_cache.calling_scope TSRMLS_CC)) {
+ fci_cache.called_scope = EX(called_scope);
}
if (zend_call_function(&fci, &fci_cache TSRMLS_CC) == SUCCESS && Z_TYPE(retval) != IS_UNDEF) {
int always_sign;
int format_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "+", &args, &argc) == FAILURE) {
+ if (zend_parse_parameters(param_count TSRMLS_CC, "+", &args, &argc) == FAILURE) {
return NULL;
}