if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
OBJ_RELEASE((zend_object*)old_execute_data->func->op_array.prototype);
}
- object = Z_OBJ(old_execute_data->This);
- zend_vm_stack_free_call_frame(old_execute_data);
-
- if (object) {
+ if (call_info & ZEND_CALL_RELEASE_THIS) {
+ object = Z_OBJ(old_execute_data->This);
+#if 0
if (UNEXPECTED(EG(exception) != NULL) && (EX(opline)->op1.num & ZEND_CALL_CTOR)) {
if (!(EX(opline)->op1.num & ZEND_CALL_CTOR_RESULT_UNUSED)) {
+#else
+ if (UNEXPECTED(EG(exception) != NULL) && (call_info & ZEND_CALL_CTOR)) {
+ if (!(call_info & ZEND_CALL_CTOR_RESULT_UNUSED)) {
+#endif
GC_REFCOUNT(object)--;
}
if (GC_REFCOUNT(object) == 1) {
}
EG(scope) = EX(func)->op_array.scope;
+ zend_vm_stack_free_call_frame(old_execute_data);
+
if (UNEXPECTED(EG(exception) != NULL)) {
const zend_op *old_opline = EX(opline);
zend_throw_exception_internal(NULL);
zend_class_entry *called_scope;
zend_object *obj;
zend_execute_data *call;
+ uint32_t call_info;
SAVE_OPLINE();
}
}
+ call_info = ZEND_CALL_NESTED_FUNCTION;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
obj = NULL;
- } else {
+ } else if (OP1_TYPE & (IS_VAR|IS_TMP_VAR)) {
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_RELEASE_THIS;
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ call = zend_vm_stack_push_call_frame(call_info,
fbc, opline->extended_value, called_scope, obj);
call->prev_execute_data = EX(call);
EX(call) = call;
if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
if (Z_OBJ(EX(This)) && instanceof_function(Z_OBJCE(EX(This)), ce)) {
object = Z_OBJ(EX(This));
- GC_REFCOUNT(object)++;
}
if (!object) {
if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
EXPECTED(Z_TYPE_P(function_name) == IS_OBJECT) &&
Z_OBJ_HANDLER_P(function_name, get_closure) &&
Z_OBJ_HANDLER_P(function_name, get_closure)(function_name, &called_scope, &fbc, &object) == SUCCESS) {
- if (object) {
- GC_REFCOUNT(object)++;
- }
if (fbc->common.fn_flags & ZEND_ACC_CLOSURE) {
/* Delay closure destruction until its invocation */
ZEND_ASSERT(GC_TYPE(fbc->common.prototype) == IS_OBJECT);
if ((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0) {
object = NULL;
} else {
+ call_info |= ZEND_CALL_RELEASE_THIS;
GC_REFCOUNT(object)++; /* For $this pointer */
}
}
called_scope = fcc.called_scope;
object = fcc.object;
if (object) {
+ call_info |= ZEND_CALL_RELEASE_THIS;
GC_REFCOUNT(object)++; /* For $this pointer */
} else if (func->common.scope &&
!(func->common.fn_flags & ZEND_ACC_STATIC)) {
USE_OPLINE
zend_execute_data *call = EX(call);
zend_function *fbc = call->func;
- zend_object *object = Z_OBJ(call->This);
+ zend_object *object;
zval *ret;
SAVE_OPLINE();
} else {
zend_vm_stack_free_args(call);
}
-
- zend_vm_stack_free_call_frame(call);
} else {
ret = NULL;
call->symbol_table = NULL;
if (UNEXPECTED(EG(exception) != NULL)) {
EG(current_execute_data) = call->prev_execute_data;
zend_vm_stack_free_args(call);
- zend_vm_stack_free_call_frame(call);
if (RETURN_VALUE_USED(opline)) {
ZVAL_UNDEF(EX_VAR(opline->result.var));
}
EG(current_execute_data) = call->prev_execute_data;
zend_vm_stack_free_args(call);
- zend_vm_stack_free_call_frame(call);
if (!RETURN_VALUE_USED(opline)) {
zval_ptr_dtor(EX_VAR(opline->result.var));
ZVAL_NULL(EX_VAR(opline->result.var));
/* Not sure what should be done here if it's a static method */
+ object = Z_OBJ(call->This);
if (EXPECTED(object != NULL)) {
call->prev_execute_data = execute_data;
EG(current_execute_data) = call;
zend_vm_stack_free_args(call);
- zend_vm_stack_free_call_frame(call);
-
if (fbc->type == ZEND_OVERLOADED_FUNCTION_TEMPORARY) {
zend_string_release(fbc->common.function_name);
}
}
ZEND_VM_C_LABEL(fcall_end_change_scope):
- if (object) {
+ if (ZEND_CALL_INFO(call) & ZEND_CALL_RELEASE_THIS) {
+ object = Z_OBJ(call->This);
+#if 0
if (UNEXPECTED(EG(exception) != NULL) && (opline->op1.num & ZEND_CALL_CTOR)) {
if (!(opline->op1.num & ZEND_CALL_CTOR_RESULT_UNUSED)) {
+#else
+ if (UNEXPECTED(EG(exception) != NULL) && (ZEND_CALL_INFO(call) & ZEND_CALL_CTOR)) {
+ if (!(ZEND_CALL_INFO(call) & ZEND_CALL_CTOR_RESULT_UNUSED)) {
+#endif
GC_REFCOUNT(object)--;
}
if (GC_REFCOUNT(object) == 1) {
EG(scope) = EX(func)->op_array.scope;
ZEND_VM_C_LABEL(fcall_end):
+ zend_vm_stack_free_call_frame(call);
if (UNEXPECTED(EG(exception) != NULL)) {
zend_throw_exception_internal(NULL);
if (RETURN_VALUE_USED(opline)) {
} else {
/* We are not handling overloaded classes right now */
zend_execute_data *call = zend_vm_stack_push_call_frame(
- ZEND_CALL_FUNCTION | ZEND_CALL_CTOR |
+ ZEND_CALL_FUNCTION | ZEND_CALL_RELEASE_THIS | ZEND_CALL_CTOR |
(EXPECTED(RETURN_VALUE_USED(opline)) ? 0 : ZEND_CALL_CTOR_RESULT_UNUSED),
constructor,
opline->extended_value,
zend_vm_stack_free_args(EX(call));
- if (Z_OBJ(call->This)) {
+ if (ZEND_CALL_INFO(call) & ZEND_CALL_RELEASE_THIS) {
if (ZEND_CALL_INFO(call) & ZEND_CALL_CTOR) {
if (!(ZEND_CALL_INFO(call) & ZEND_CALL_CTOR_RESULT_UNUSED)) {
GC_REFCOUNT(Z_OBJ(call->This))--;
zend_function *fbc = EX(func);
zend_object *object = Z_OBJ(EX(This));
zval *ret = EX(return_value);
- zend_call_kind call_kind = EX_CALL_KIND();
+ uint32_t call_info = EX_CALL_INFO() & (ZEND_CALL_NESTED | ZEND_CALL_TOP | ZEND_CALL_RELEASE_THIS);
zend_class_entry *scope = EX(called_scope);
uint32_t num_args = EX_NUM_ARGS();
zend_execute_data *call;
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);
+ call = zend_vm_stack_push_call_frame(call_info, fbc->common.prototype, 2, scope, object);
call->prev_execute_data = execute_data;
ZVAL_STR(ZEND_CALL_ARG(call, 1), fbc->common.function_name);
EG(current_execute_data) = call->prev_execute_data;
zend_vm_stack_free_args(call);
- zend_vm_stack_free_call_frame(call);
if (ret == &retval) {
zval_ptr_dtor(ret);
ZEND_VM_C_LABEL(call_trampoline_end):
execute_data = EG(current_execute_data);
- if (!EX(func) || !ZEND_USER_CODE(EX(func)->type) || (call_kind & ZEND_CALL_TOP)) {
+ if (!EX(func) || !ZEND_USER_CODE(EX(func)->type) || (call_info & ZEND_CALL_TOP)) {
ZEND_VM_RETURN();
}
opline = EX(opline);
- if (object) {
+ if (call_info & ZEND_CALL_RELEASE_THIS) {
+ object = Z_OBJ(call->This);
OBJ_RELEASE(object);
}
EG(scope) = EX(func)->op_array.scope;
+ zend_vm_stack_free_call_frame(call);
if (UNEXPECTED(EG(exception) != NULL)) {
zend_throw_exception_internal(NULL);
if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
OBJ_RELEASE((zend_object*)old_execute_data->func->op_array.prototype);
}
- object = Z_OBJ(old_execute_data->This);
- zend_vm_stack_free_call_frame(old_execute_data);
-
- if (object) {
+ if (call_info & ZEND_CALL_RELEASE_THIS) {
+ object = Z_OBJ(old_execute_data->This);
+#if 0
if (UNEXPECTED(EG(exception) != NULL) && (EX(opline)->op1.num & ZEND_CALL_CTOR)) {
if (!(EX(opline)->op1.num & ZEND_CALL_CTOR_RESULT_UNUSED)) {
+#else
+ if (UNEXPECTED(EG(exception) != NULL) && (call_info & ZEND_CALL_CTOR)) {
+ if (!(call_info & ZEND_CALL_CTOR_RESULT_UNUSED)) {
+#endif
GC_REFCOUNT(object)--;
}
if (GC_REFCOUNT(object) == 1) {
}
EG(scope) = EX(func)->op_array.scope;
+ zend_vm_stack_free_call_frame(old_execute_data);
+
if (UNEXPECTED(EG(exception) != NULL)) {
const zend_op *old_opline = EX(opline);
zend_throw_exception_internal(NULL);
USE_OPLINE
zend_execute_data *call = EX(call);
zend_function *fbc = call->func;
- zend_object *object = Z_OBJ(call->This);
+ zend_object *object;
zval *ret;
SAVE_OPLINE();
} else {
zend_vm_stack_free_args(call);
}
-
- zend_vm_stack_free_call_frame(call);
} else {
ret = NULL;
call->symbol_table = NULL;
if (UNEXPECTED(EG(exception) != NULL)) {
EG(current_execute_data) = call->prev_execute_data;
zend_vm_stack_free_args(call);
- zend_vm_stack_free_call_frame(call);
if (RETURN_VALUE_USED(opline)) {
ZVAL_UNDEF(EX_VAR(opline->result.var));
}
EG(current_execute_data) = call->prev_execute_data;
zend_vm_stack_free_args(call);
- zend_vm_stack_free_call_frame(call);
if (!RETURN_VALUE_USED(opline)) {
zval_ptr_dtor(EX_VAR(opline->result.var));
ZVAL_NULL(EX_VAR(opline->result.var));
/* Not sure what should be done here if it's a static method */
+ object = Z_OBJ(call->This);
if (EXPECTED(object != NULL)) {
call->prev_execute_data = execute_data;
EG(current_execute_data) = call;
zend_vm_stack_free_args(call);
- zend_vm_stack_free_call_frame(call);
-
if (fbc->type == ZEND_OVERLOADED_FUNCTION_TEMPORARY) {
zend_string_release(fbc->common.function_name);
}
}
fcall_end_change_scope:
- if (object) {
+ if (ZEND_CALL_INFO(call) & ZEND_CALL_RELEASE_THIS) {
+ object = Z_OBJ(call->This);
+#if 0
if (UNEXPECTED(EG(exception) != NULL) && (opline->op1.num & ZEND_CALL_CTOR)) {
if (!(opline->op1.num & ZEND_CALL_CTOR_RESULT_UNUSED)) {
+#else
+ if (UNEXPECTED(EG(exception) != NULL) && (ZEND_CALL_INFO(call) & ZEND_CALL_CTOR)) {
+ if (!(ZEND_CALL_INFO(call) & ZEND_CALL_CTOR_RESULT_UNUSED)) {
+#endif
GC_REFCOUNT(object)--;
}
if (GC_REFCOUNT(object) == 1) {
EG(scope) = EX(func)->op_array.scope;
fcall_end:
+ zend_vm_stack_free_call_frame(call);
if (UNEXPECTED(EG(exception) != NULL)) {
zend_throw_exception_internal(NULL);
if (RETURN_VALUE_USED(opline)) {
zend_vm_stack_free_args(EX(call));
- if (Z_OBJ(call->This)) {
+ if (ZEND_CALL_INFO(call) & ZEND_CALL_RELEASE_THIS) {
if (ZEND_CALL_INFO(call) & ZEND_CALL_CTOR) {
if (!(ZEND_CALL_INFO(call) & ZEND_CALL_CTOR_RESULT_UNUSED)) {
GC_REFCOUNT(Z_OBJ(call->This))--;
zend_function *fbc = EX(func);
zend_object *object = Z_OBJ(EX(This));
zval *ret = EX(return_value);
- zend_call_kind call_kind = EX_CALL_KIND();
+ uint32_t call_info = EX_CALL_INFO() & (ZEND_CALL_NESTED | ZEND_CALL_TOP | ZEND_CALL_RELEASE_THIS);
zend_class_entry *scope = EX(called_scope);
uint32_t num_args = EX_NUM_ARGS();
zend_execute_data *call;
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);
+ call = zend_vm_stack_push_call_frame(call_info, fbc->common.prototype, 2, scope, object);
call->prev_execute_data = execute_data;
ZVAL_STR(ZEND_CALL_ARG(call, 1), fbc->common.function_name);
EG(current_execute_data) = call->prev_execute_data;
zend_vm_stack_free_args(call);
- zend_vm_stack_free_call_frame(call);
if (ret == &retval) {
zval_ptr_dtor(ret);
call_trampoline_end:
execute_data = EG(current_execute_data);
- if (!EX(func) || !ZEND_USER_CODE(EX(func)->type) || (call_kind & ZEND_CALL_TOP)) {
+ if (!EX(func) || !ZEND_USER_CODE(EX(func)->type) || (call_info & ZEND_CALL_TOP)) {
ZEND_VM_RETURN();
}
opline = EX(opline);
- if (object) {
+ if (call_info & ZEND_CALL_RELEASE_THIS) {
+ object = Z_OBJ(call->This);
OBJ_RELEASE(object);
}
EG(scope) = EX(func)->op_array.scope;
+ zend_vm_stack_free_call_frame(call);
if (UNEXPECTED(EG(exception) != NULL)) {
zend_throw_exception_internal(NULL);
EXPECTED(Z_TYPE_P(function_name) == IS_OBJECT) &&
Z_OBJ_HANDLER_P(function_name, get_closure) &&
Z_OBJ_HANDLER_P(function_name, get_closure)(function_name, &called_scope, &fbc, &object) == SUCCESS) {
- if (object) {
- GC_REFCOUNT(object)++;
- }
if (fbc->common.fn_flags & ZEND_ACC_CLOSURE) {
/* Delay closure destruction until its invocation */
ZEND_ASSERT(GC_TYPE(fbc->common.prototype) == IS_OBJECT);
if ((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0) {
object = NULL;
} else {
+ call_info |= ZEND_CALL_RELEASE_THIS;
GC_REFCOUNT(object)++; /* For $this pointer */
}
}
EXPECTED(Z_TYPE_P(function_name) == IS_OBJECT) &&
Z_OBJ_HANDLER_P(function_name, get_closure) &&
Z_OBJ_HANDLER_P(function_name, get_closure)(function_name, &called_scope, &fbc, &object) == SUCCESS) {
- if (object) {
- GC_REFCOUNT(object)++;
- }
if (fbc->common.fn_flags & ZEND_ACC_CLOSURE) {
/* Delay closure destruction until its invocation */
ZEND_ASSERT(GC_TYPE(fbc->common.prototype) == IS_OBJECT);
if ((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0) {
object = NULL;
} else {
+ call_info |= ZEND_CALL_RELEASE_THIS;
GC_REFCOUNT(object)++; /* For $this pointer */
}
}
EXPECTED(Z_TYPE_P(function_name) == IS_OBJECT) &&
Z_OBJ_HANDLER_P(function_name, get_closure) &&
Z_OBJ_HANDLER_P(function_name, get_closure)(function_name, &called_scope, &fbc, &object) == SUCCESS) {
- if (object) {
- GC_REFCOUNT(object)++;
- }
if (fbc->common.fn_flags & ZEND_ACC_CLOSURE) {
/* Delay closure destruction until its invocation */
ZEND_ASSERT(GC_TYPE(fbc->common.prototype) == IS_OBJECT);
if ((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0) {
object = NULL;
} else {
+ call_info |= ZEND_CALL_RELEASE_THIS;
GC_REFCOUNT(object)++; /* For $this pointer */
}
}
} else {
/* We are not handling overloaded classes right now */
zend_execute_data *call = zend_vm_stack_push_call_frame(
- ZEND_CALL_FUNCTION | ZEND_CALL_CTOR |
+ ZEND_CALL_FUNCTION | ZEND_CALL_RELEASE_THIS | ZEND_CALL_CTOR |
(EXPECTED(RETURN_VALUE_USED(opline)) ? 0 : ZEND_CALL_CTOR_RESULT_UNUSED),
constructor,
opline->extended_value,
zend_class_entry *called_scope;
zend_object *obj;
zend_execute_data *call;
+ uint32_t call_info;
SAVE_OPLINE();
}
}
+ call_info = ZEND_CALL_NESTED_FUNCTION;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
obj = NULL;
- } else {
+ } else if (IS_CONST & (IS_VAR|IS_TMP_VAR)) {
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_RELEASE_THIS;
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ call = zend_vm_stack_push_call_frame(call_info,
fbc, opline->extended_value, called_scope, obj);
call->prev_execute_data = EX(call);
EX(call) = call;
if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
if (Z_OBJ(EX(This)) && instanceof_function(Z_OBJCE(EX(This)), ce)) {
object = Z_OBJ(EX(This));
- GC_REFCOUNT(object)++;
}
if (!object) {
if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
called_scope = fcc.called_scope;
object = fcc.object;
if (object) {
+ call_info |= ZEND_CALL_RELEASE_THIS;
GC_REFCOUNT(object)++; /* For $this pointer */
} else if (func->common.scope &&
!(func->common.fn_flags & ZEND_ACC_STATIC)) {
if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
if (Z_OBJ(EX(This)) && instanceof_function(Z_OBJCE(EX(This)), ce)) {
object = Z_OBJ(EX(This));
- GC_REFCOUNT(object)++;
}
if (!object) {
if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
zend_class_entry *called_scope;
zend_object *obj;
zend_execute_data *call;
+ uint32_t call_info;
SAVE_OPLINE();
}
}
+ call_info = ZEND_CALL_NESTED_FUNCTION;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
obj = NULL;
- } else {
+ } else if (IS_CONST & (IS_VAR|IS_TMP_VAR)) {
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_RELEASE_THIS;
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ call = zend_vm_stack_push_call_frame(call_info,
fbc, opline->extended_value, called_scope, obj);
call->prev_execute_data = EX(call);
EX(call) = call;
if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
if (Z_OBJ(EX(This)) && instanceof_function(Z_OBJCE(EX(This)), ce)) {
object = Z_OBJ(EX(This));
- GC_REFCOUNT(object)++;
}
if (!object) {
if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
called_scope = fcc.called_scope;
object = fcc.object;
if (object) {
+ call_info |= ZEND_CALL_RELEASE_THIS;
GC_REFCOUNT(object)++; /* For $this pointer */
} else if (func->common.scope &&
!(func->common.fn_flags & ZEND_ACC_STATIC)) {
zend_class_entry *called_scope;
zend_object *obj;
zend_execute_data *call;
+ uint32_t call_info;
SAVE_OPLINE();
}
}
+ call_info = ZEND_CALL_NESTED_FUNCTION;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
obj = NULL;
- } else {
+ } else if (IS_CONST & (IS_VAR|IS_TMP_VAR)) {
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_RELEASE_THIS;
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ call = zend_vm_stack_push_call_frame(call_info,
fbc, opline->extended_value, called_scope, obj);
call->prev_execute_data = EX(call);
EX(call) = call;
if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
if (Z_OBJ(EX(This)) && instanceof_function(Z_OBJCE(EX(This)), ce)) {
object = Z_OBJ(EX(This));
- GC_REFCOUNT(object)++;
}
if (!object) {
if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
called_scope = fcc.called_scope;
object = fcc.object;
if (object) {
+ call_info |= ZEND_CALL_RELEASE_THIS;
GC_REFCOUNT(object)++; /* For $this pointer */
} else if (func->common.scope &&
!(func->common.fn_flags & ZEND_ACC_STATIC)) {
} else {
/* We are not handling overloaded classes right now */
zend_execute_data *call = zend_vm_stack_push_call_frame(
- ZEND_CALL_FUNCTION | ZEND_CALL_CTOR |
+ ZEND_CALL_FUNCTION | ZEND_CALL_RELEASE_THIS | ZEND_CALL_CTOR |
(EXPECTED(RETURN_VALUE_USED(opline)) ? 0 : ZEND_CALL_CTOR_RESULT_UNUSED),
constructor,
opline->extended_value,
if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
if (Z_OBJ(EX(This)) && instanceof_function(Z_OBJCE(EX(This)), ce)) {
object = Z_OBJ(EX(This));
- GC_REFCOUNT(object)++;
}
if (!object) {
if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
if (Z_OBJ(EX(This)) && instanceof_function(Z_OBJCE(EX(This)), ce)) {
object = Z_OBJ(EX(This));
- GC_REFCOUNT(object)++;
}
if (!object) {
if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
if (Z_OBJ(EX(This)) && instanceof_function(Z_OBJCE(EX(This)), ce)) {
object = Z_OBJ(EX(This));
- GC_REFCOUNT(object)++;
}
if (!object) {
if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
if (Z_OBJ(EX(This)) && instanceof_function(Z_OBJCE(EX(This)), ce)) {
object = Z_OBJ(EX(This));
- GC_REFCOUNT(object)++;
}
if (!object) {
if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
zend_class_entry *called_scope;
zend_object *obj;
zend_execute_data *call;
+ uint32_t call_info;
SAVE_OPLINE();
}
}
+ call_info = ZEND_CALL_NESTED_FUNCTION;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
obj = NULL;
- } else {
+ } else if (IS_UNUSED & (IS_VAR|IS_TMP_VAR)) {
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_RELEASE_THIS;
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ call = zend_vm_stack_push_call_frame(call_info,
fbc, opline->extended_value, called_scope, obj);
call->prev_execute_data = EX(call);
EX(call) = call;
zend_class_entry *called_scope;
zend_object *obj;
zend_execute_data *call;
+ uint32_t call_info;
SAVE_OPLINE();
}
}
+ call_info = ZEND_CALL_NESTED_FUNCTION;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
obj = NULL;
- } else {
+ } else if (IS_UNUSED & (IS_VAR|IS_TMP_VAR)) {
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_RELEASE_THIS;
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ call = zend_vm_stack_push_call_frame(call_info,
fbc, opline->extended_value, called_scope, obj);
call->prev_execute_data = EX(call);
EX(call) = call;
zend_class_entry *called_scope;
zend_object *obj;
zend_execute_data *call;
+ uint32_t call_info;
SAVE_OPLINE();
}
}
+ call_info = ZEND_CALL_NESTED_FUNCTION;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
obj = NULL;
- } else {
+ } else if (IS_UNUSED & (IS_VAR|IS_TMP_VAR)) {
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_RELEASE_THIS;
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ call = zend_vm_stack_push_call_frame(call_info,
fbc, opline->extended_value, called_scope, obj);
call->prev_execute_data = EX(call);
EX(call) = call;
zend_class_entry *called_scope;
zend_object *obj;
zend_execute_data *call;
+ uint32_t call_info;
SAVE_OPLINE();
}
}
+ call_info = ZEND_CALL_NESTED_FUNCTION;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
obj = NULL;
- } else {
+ } else if (IS_CV & (IS_VAR|IS_TMP_VAR)) {
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_RELEASE_THIS;
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ call = zend_vm_stack_push_call_frame(call_info,
fbc, opline->extended_value, called_scope, obj);
call->prev_execute_data = EX(call);
EX(call) = call;
zend_class_entry *called_scope;
zend_object *obj;
zend_execute_data *call;
+ uint32_t call_info;
SAVE_OPLINE();
}
}
+ call_info = ZEND_CALL_NESTED_FUNCTION;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
obj = NULL;
- } else {
+ } else if (IS_CV & (IS_VAR|IS_TMP_VAR)) {
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_RELEASE_THIS;
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ call = zend_vm_stack_push_call_frame(call_info,
fbc, opline->extended_value, called_scope, obj);
call->prev_execute_data = EX(call);
EX(call) = call;
zend_class_entry *called_scope;
zend_object *obj;
zend_execute_data *call;
+ uint32_t call_info;
SAVE_OPLINE();
}
}
+ call_info = ZEND_CALL_NESTED_FUNCTION;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
obj = NULL;
- } else {
+ } else if (IS_CV & (IS_VAR|IS_TMP_VAR)) {
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_RELEASE_THIS;
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ call = zend_vm_stack_push_call_frame(call_info,
fbc, opline->extended_value, called_scope, obj);
call->prev_execute_data = EX(call);
EX(call) = call;
zend_class_entry *called_scope;
zend_object *obj;
zend_execute_data *call;
+ uint32_t call_info;
SAVE_OPLINE();
}
}
+ call_info = ZEND_CALL_NESTED_FUNCTION;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
obj = NULL;
- } else {
+ } else if ((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)) {
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_RELEASE_THIS;
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ call = zend_vm_stack_push_call_frame(call_info,
fbc, opline->extended_value, called_scope, obj);
call->prev_execute_data = EX(call);
EX(call) = call;
zend_class_entry *called_scope;
zend_object *obj;
zend_execute_data *call;
+ uint32_t call_info;
SAVE_OPLINE();
}
}
+ call_info = ZEND_CALL_NESTED_FUNCTION;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
obj = NULL;
- } else {
+ } else if ((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)) {
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_RELEASE_THIS;
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ call = zend_vm_stack_push_call_frame(call_info,
fbc, opline->extended_value, called_scope, obj);
call->prev_execute_data = EX(call);
EX(call) = call;
zend_class_entry *called_scope;
zend_object *obj;
zend_execute_data *call;
+ uint32_t call_info;
SAVE_OPLINE();
}
}
+ call_info = ZEND_CALL_NESTED_FUNCTION;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
obj = NULL;
- } else {
+ } else if ((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)) {
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_RELEASE_THIS;
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ call = zend_vm_stack_push_call_frame(call_info,
fbc, opline->extended_value, called_scope, obj);
call->prev_execute_data = EX(call);
EX(call) = call;