do {
if (IS_CONST == IS_CONST || UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
if ((IS_CONST & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(object))) {
- object = Z_REFVAL_P(object);
+ zend_reference *ref = Z_REF_P(object);
+
+ object = &ref->val;
if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ if (IS_CONST & IS_VAR) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+ efree_size(ref, sizeof(zend_reference));
+ } else {
+ Z_ADDREF_P(object);
+ }
+ }
break;
}
}
zend_undefined_method(obj->ce, Z_STR_P(function_name));
}
-
+ if ((IS_CONST & (IS_VAR|IS_TMP_VAR)) && GC_DELREF(orig_obj) == 0) {
+ zend_objects_store_del(orig_obj);
+ }
HANDLE_EXCEPTION();
}
if (IS_CONST == IS_CONST &&
CACHE_POLYMORPHIC_PTR(opline->result.num, called_scope, fbc);
}
if ((IS_CONST & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(obj != orig_obj)) {
- /* Reset "object" to trigger reference counting */
- object = NULL;
+ GC_ADDREF(obj); /* For $this pointer */
+ if (GC_DELREF(orig_obj) == 0) {
+ zend_objects_store_del(orig_obj);
+ }
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
-
- if ((IS_CONST & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
+ if ((IS_CONST & (IS_VAR|IS_TMP_VAR)) && GC_DELREF(obj) == 0) {
+ zend_objects_store_del(obj);
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
}
/* call static method */
obj = (zend_object*)called_scope;
} else if (IS_CONST & (IS_VAR|IS_TMP_VAR|IS_CV)) {
if (IS_CONST == IS_CV) {
GC_ADDREF(obj); /* For $this pointer */
- } else {
- zval *free_op1 = EX_VAR(opline->op1.var);
- if (free_op1 != object) {
- GC_ADDREF(obj); /* For $this pointer */
- zval_ptr_dtor_nogc(free_op1);
- }
}
/* CV may be changed indirectly (e.g. when it's a reference) */
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS;
do {
if (IS_CONST == IS_CONST || UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
if ((IS_CONST & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(object))) {
- object = Z_REFVAL_P(object);
+ zend_reference *ref = Z_REF_P(object);
+
+ object = &ref->val;
if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ if (IS_CONST & IS_VAR) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+ efree_size(ref, sizeof(zend_reference));
+ } else {
+ Z_ADDREF_P(object);
+ }
+ }
break;
}
}
zend_undefined_method(obj->ce, Z_STR_P(function_name));
}
zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
-
+ if ((IS_CONST & (IS_VAR|IS_TMP_VAR)) && GC_DELREF(orig_obj) == 0) {
+ zend_objects_store_del(orig_obj);
+ }
HANDLE_EXCEPTION();
}
if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
CACHE_POLYMORPHIC_PTR(opline->result.num, called_scope, fbc);
}
if ((IS_CONST & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(obj != orig_obj)) {
- /* Reset "object" to trigger reference counting */
- object = NULL;
+ GC_ADDREF(obj); /* For $this pointer */
+ if (GC_DELREF(orig_obj) == 0) {
+ zend_objects_store_del(orig_obj);
+ }
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
-
- if ((IS_CONST & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
+ if ((IS_CONST & (IS_VAR|IS_TMP_VAR)) && GC_DELREF(obj) == 0) {
+ zend_objects_store_del(obj);
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
}
/* call static method */
obj = (zend_object*)called_scope;
} else if (IS_CONST & (IS_VAR|IS_TMP_VAR|IS_CV)) {
if (IS_CONST == IS_CV) {
GC_ADDREF(obj); /* For $this pointer */
- } else {
- zval *free_op1 = EX_VAR(opline->op1.var);
- if (free_op1 != object) {
- GC_ADDREF(obj); /* For $this pointer */
- zval_ptr_dtor_nogc(free_op1);
- }
}
/* CV may be changed indirectly (e.g. when it's a reference) */
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS;
do {
if (IS_CONST == IS_CONST || UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
if ((IS_CONST & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(object))) {
- object = Z_REFVAL_P(object);
+ zend_reference *ref = Z_REF_P(object);
+
+ object = &ref->val;
if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ if (IS_CONST & IS_VAR) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+ efree_size(ref, sizeof(zend_reference));
+ } else {
+ Z_ADDREF_P(object);
+ }
+ }
break;
}
}
zend_undefined_method(obj->ce, Z_STR_P(function_name));
}
-
+ if ((IS_CONST & (IS_VAR|IS_TMP_VAR)) && GC_DELREF(orig_obj) == 0) {
+ zend_objects_store_del(orig_obj);
+ }
HANDLE_EXCEPTION();
}
if (IS_CV == IS_CONST &&
CACHE_POLYMORPHIC_PTR(opline->result.num, called_scope, fbc);
}
if ((IS_CONST & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(obj != orig_obj)) {
- /* Reset "object" to trigger reference counting */
- object = NULL;
+ GC_ADDREF(obj); /* For $this pointer */
+ if (GC_DELREF(orig_obj) == 0) {
+ zend_objects_store_del(orig_obj);
+ }
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
-
- if ((IS_CONST & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
+ if ((IS_CONST & (IS_VAR|IS_TMP_VAR)) && GC_DELREF(obj) == 0) {
+ zend_objects_store_del(obj);
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
}
/* call static method */
obj = (zend_object*)called_scope;
} else if (IS_CONST & (IS_VAR|IS_TMP_VAR|IS_CV)) {
if (IS_CONST == IS_CV) {
GC_ADDREF(obj); /* For $this pointer */
- } else {
- zval *free_op1 = EX_VAR(opline->op1.var);
- if (free_op1 != object) {
- GC_ADDREF(obj); /* For $this pointer */
- zval_ptr_dtor_nogc(free_op1);
- }
}
/* CV may be changed indirectly (e.g. when it's a reference) */
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS;
do {
if ((IS_TMP_VAR|IS_VAR) == IS_CONST || UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(object))) {
- object = Z_REFVAL_P(object);
+ zend_reference *ref = Z_REF_P(object);
+
+ object = &ref->val;
if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ if ((IS_TMP_VAR|IS_VAR) & IS_VAR) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+ efree_size(ref, sizeof(zend_reference));
+ } else {
+ Z_ADDREF_P(object);
+ }
+ }
break;
}
}
zend_undefined_method(obj->ce, Z_STR_P(function_name));
}
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)) && GC_DELREF(orig_obj) == 0) {
+ zend_objects_store_del(orig_obj);
+ }
HANDLE_EXCEPTION();
}
if (IS_CONST == IS_CONST &&
CACHE_POLYMORPHIC_PTR(opline->result.num, called_scope, fbc);
}
if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(obj != orig_obj)) {
- /* Reset "object" to trigger reference counting */
- object = NULL;
+ GC_ADDREF(obj); /* For $this pointer */
+ if (GC_DELREF(orig_obj) == 0) {
+ zend_objects_store_del(orig_obj);
+ }
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
-
- if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)) && GC_DELREF(obj) == 0) {
+ zend_objects_store_del(obj);
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
}
/* call static method */
obj = (zend_object*)called_scope;
} else if ((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR|IS_CV)) {
if ((IS_TMP_VAR|IS_VAR) == IS_CV) {
GC_ADDREF(obj); /* For $this pointer */
- } else {
- zval *free_op1 = EX_VAR(opline->op1.var);
- if (free_op1 != object) {
- GC_ADDREF(obj); /* For $this pointer */
- zval_ptr_dtor_nogc(free_op1);
- }
}
/* CV may be changed indirectly (e.g. when it's a reference) */
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS;
do {
if ((IS_TMP_VAR|IS_VAR) == IS_CONST || UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(object))) {
- object = Z_REFVAL_P(object);
+ zend_reference *ref = Z_REF_P(object);
+
+ object = &ref->val;
if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ if ((IS_TMP_VAR|IS_VAR) & IS_VAR) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+ efree_size(ref, sizeof(zend_reference));
+ } else {
+ Z_ADDREF_P(object);
+ }
+ }
break;
}
}
zend_undefined_method(obj->ce, Z_STR_P(function_name));
}
zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)) && GC_DELREF(orig_obj) == 0) {
+ zend_objects_store_del(orig_obj);
+ }
HANDLE_EXCEPTION();
}
if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
CACHE_POLYMORPHIC_PTR(opline->result.num, called_scope, fbc);
}
if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(obj != orig_obj)) {
- /* Reset "object" to trigger reference counting */
- object = NULL;
+ GC_ADDREF(obj); /* For $this pointer */
+ if (GC_DELREF(orig_obj) == 0) {
+ zend_objects_store_del(orig_obj);
+ }
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
-
- if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)) && GC_DELREF(obj) == 0) {
+ zend_objects_store_del(obj);
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
}
/* call static method */
obj = (zend_object*)called_scope;
} else if ((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR|IS_CV)) {
if ((IS_TMP_VAR|IS_VAR) == IS_CV) {
GC_ADDREF(obj); /* For $this pointer */
- } else {
- zval *free_op1 = EX_VAR(opline->op1.var);
- if (free_op1 != object) {
- GC_ADDREF(obj); /* For $this pointer */
- zval_ptr_dtor_nogc(free_op1);
- }
}
/* CV may be changed indirectly (e.g. when it's a reference) */
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS;
do {
if ((IS_TMP_VAR|IS_VAR) == IS_CONST || UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(object))) {
- object = Z_REFVAL_P(object);
+ zend_reference *ref = Z_REF_P(object);
+
+ object = &ref->val;
if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ if ((IS_TMP_VAR|IS_VAR) & IS_VAR) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+ efree_size(ref, sizeof(zend_reference));
+ } else {
+ Z_ADDREF_P(object);
+ }
+ }
break;
}
}
zend_undefined_method(obj->ce, Z_STR_P(function_name));
}
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)) && GC_DELREF(orig_obj) == 0) {
+ zend_objects_store_del(orig_obj);
+ }
HANDLE_EXCEPTION();
}
if (IS_CV == IS_CONST &&
CACHE_POLYMORPHIC_PTR(opline->result.num, called_scope, fbc);
}
if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(obj != orig_obj)) {
- /* Reset "object" to trigger reference counting */
- object = NULL;
+ GC_ADDREF(obj); /* For $this pointer */
+ if (GC_DELREF(orig_obj) == 0) {
+ zend_objects_store_del(orig_obj);
+ }
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
-
- if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)) && GC_DELREF(obj) == 0) {
+ zend_objects_store_del(obj);
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
}
/* call static method */
obj = (zend_object*)called_scope;
} else if ((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR|IS_CV)) {
if ((IS_TMP_VAR|IS_VAR) == IS_CV) {
GC_ADDREF(obj); /* For $this pointer */
- } else {
- zval *free_op1 = EX_VAR(opline->op1.var);
- if (free_op1 != object) {
- GC_ADDREF(obj); /* For $this pointer */
- zval_ptr_dtor_nogc(free_op1);
- }
}
/* CV may be changed indirectly (e.g. when it's a reference) */
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS;
do {
if (IS_UNUSED == IS_CONST || UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
if ((IS_UNUSED & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(object))) {
- object = Z_REFVAL_P(object);
+ zend_reference *ref = Z_REF_P(object);
+
+ object = &ref->val;
if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ if (IS_UNUSED & IS_VAR) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+ efree_size(ref, sizeof(zend_reference));
+ } else {
+ Z_ADDREF_P(object);
+ }
+ }
break;
}
}
zend_undefined_method(obj->ce, Z_STR_P(function_name));
}
-
+ if ((IS_UNUSED & (IS_VAR|IS_TMP_VAR)) && GC_DELREF(orig_obj) == 0) {
+ zend_objects_store_del(orig_obj);
+ }
HANDLE_EXCEPTION();
}
if (IS_CONST == IS_CONST &&
CACHE_POLYMORPHIC_PTR(opline->result.num, called_scope, fbc);
}
if ((IS_UNUSED & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(obj != orig_obj)) {
- /* Reset "object" to trigger reference counting */
- object = NULL;
+ GC_ADDREF(obj); /* For $this pointer */
+ if (GC_DELREF(orig_obj) == 0) {
+ zend_objects_store_del(orig_obj);
+ }
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
-
- if ((IS_UNUSED & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
+ if ((IS_UNUSED & (IS_VAR|IS_TMP_VAR)) && GC_DELREF(obj) == 0) {
+ zend_objects_store_del(obj);
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
}
/* call static method */
obj = (zend_object*)called_scope;
} else if (IS_UNUSED & (IS_VAR|IS_TMP_VAR|IS_CV)) {
if (IS_UNUSED == IS_CV) {
GC_ADDREF(obj); /* For $this pointer */
- } else {
- zval *free_op1 = EX_VAR(opline->op1.var);
- if (free_op1 != object) {
- GC_ADDREF(obj); /* For $this pointer */
- zval_ptr_dtor_nogc(free_op1);
- }
}
/* CV may be changed indirectly (e.g. when it's a reference) */
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS;
do {
if (IS_UNUSED == IS_CONST || UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
if ((IS_UNUSED & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(object))) {
- object = Z_REFVAL_P(object);
+ zend_reference *ref = Z_REF_P(object);
+
+ object = &ref->val;
if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ if (IS_UNUSED & IS_VAR) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+ efree_size(ref, sizeof(zend_reference));
+ } else {
+ Z_ADDREF_P(object);
+ }
+ }
break;
}
}
zend_undefined_method(obj->ce, Z_STR_P(function_name));
}
zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
-
+ if ((IS_UNUSED & (IS_VAR|IS_TMP_VAR)) && GC_DELREF(orig_obj) == 0) {
+ zend_objects_store_del(orig_obj);
+ }
HANDLE_EXCEPTION();
}
if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
CACHE_POLYMORPHIC_PTR(opline->result.num, called_scope, fbc);
}
if ((IS_UNUSED & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(obj != orig_obj)) {
- /* Reset "object" to trigger reference counting */
- object = NULL;
+ GC_ADDREF(obj); /* For $this pointer */
+ if (GC_DELREF(orig_obj) == 0) {
+ zend_objects_store_del(orig_obj);
+ }
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
-
- if ((IS_UNUSED & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
+ if ((IS_UNUSED & (IS_VAR|IS_TMP_VAR)) && GC_DELREF(obj) == 0) {
+ zend_objects_store_del(obj);
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
}
/* call static method */
obj = (zend_object*)called_scope;
} else if (IS_UNUSED & (IS_VAR|IS_TMP_VAR|IS_CV)) {
if (IS_UNUSED == IS_CV) {
GC_ADDREF(obj); /* For $this pointer */
- } else {
- zval *free_op1 = EX_VAR(opline->op1.var);
- if (free_op1 != object) {
- GC_ADDREF(obj); /* For $this pointer */
- zval_ptr_dtor_nogc(free_op1);
- }
}
/* CV may be changed indirectly (e.g. when it's a reference) */
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS;
do {
if (IS_UNUSED == IS_CONST || UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
if ((IS_UNUSED & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(object))) {
- object = Z_REFVAL_P(object);
+ zend_reference *ref = Z_REF_P(object);
+
+ object = &ref->val;
if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ if (IS_UNUSED & IS_VAR) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+ efree_size(ref, sizeof(zend_reference));
+ } else {
+ Z_ADDREF_P(object);
+ }
+ }
break;
}
}
zend_undefined_method(obj->ce, Z_STR_P(function_name));
}
-
+ if ((IS_UNUSED & (IS_VAR|IS_TMP_VAR)) && GC_DELREF(orig_obj) == 0) {
+ zend_objects_store_del(orig_obj);
+ }
HANDLE_EXCEPTION();
}
if (IS_CV == IS_CONST &&
CACHE_POLYMORPHIC_PTR(opline->result.num, called_scope, fbc);
}
if ((IS_UNUSED & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(obj != orig_obj)) {
- /* Reset "object" to trigger reference counting */
- object = NULL;
+ GC_ADDREF(obj); /* For $this pointer */
+ if (GC_DELREF(orig_obj) == 0) {
+ zend_objects_store_del(orig_obj);
+ }
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
-
- if ((IS_UNUSED & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
+ if ((IS_UNUSED & (IS_VAR|IS_TMP_VAR)) && GC_DELREF(obj) == 0) {
+ zend_objects_store_del(obj);
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
}
/* call static method */
obj = (zend_object*)called_scope;
} else if (IS_UNUSED & (IS_VAR|IS_TMP_VAR|IS_CV)) {
if (IS_UNUSED == IS_CV) {
GC_ADDREF(obj); /* For $this pointer */
- } else {
- zval *free_op1 = EX_VAR(opline->op1.var);
- if (free_op1 != object) {
- GC_ADDREF(obj); /* For $this pointer */
- zval_ptr_dtor_nogc(free_op1);
- }
}
/* CV may be changed indirectly (e.g. when it's a reference) */
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS;
do {
if (IS_CV == IS_CONST || UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
if ((IS_CV & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(object))) {
- object = Z_REFVAL_P(object);
+ zend_reference *ref = Z_REF_P(object);
+
+ object = &ref->val;
if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ if (IS_CV & IS_VAR) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+ efree_size(ref, sizeof(zend_reference));
+ } else {
+ Z_ADDREF_P(object);
+ }
+ }
break;
}
}
zend_undefined_method(obj->ce, Z_STR_P(function_name));
}
-
+ if ((IS_CV & (IS_VAR|IS_TMP_VAR)) && GC_DELREF(orig_obj) == 0) {
+ zend_objects_store_del(orig_obj);
+ }
HANDLE_EXCEPTION();
}
if (IS_CONST == IS_CONST &&
CACHE_POLYMORPHIC_PTR(opline->result.num, called_scope, fbc);
}
if ((IS_CV & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(obj != orig_obj)) {
- /* Reset "object" to trigger reference counting */
- object = NULL;
+ GC_ADDREF(obj); /* For $this pointer */
+ if (GC_DELREF(orig_obj) == 0) {
+ zend_objects_store_del(orig_obj);
+ }
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
-
- if ((IS_CV & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
+ if ((IS_CV & (IS_VAR|IS_TMP_VAR)) && GC_DELREF(obj) == 0) {
+ zend_objects_store_del(obj);
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
}
/* call static method */
obj = (zend_object*)called_scope;
} else if (IS_CV & (IS_VAR|IS_TMP_VAR|IS_CV)) {
if (IS_CV == IS_CV) {
GC_ADDREF(obj); /* For $this pointer */
- } else {
- zval *free_op1 = EX_VAR(opline->op1.var);
- if (free_op1 != object) {
- GC_ADDREF(obj); /* For $this pointer */
- zval_ptr_dtor_nogc(free_op1);
- }
}
/* CV may be changed indirectly (e.g. when it's a reference) */
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS;
do {
if (IS_CV == IS_CONST || UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
if ((IS_CV & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(object))) {
- object = Z_REFVAL_P(object);
+ zend_reference *ref = Z_REF_P(object);
+
+ object = &ref->val;
if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ if (IS_CV & IS_VAR) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+ efree_size(ref, sizeof(zend_reference));
+ } else {
+ Z_ADDREF_P(object);
+ }
+ }
break;
}
}
zend_undefined_method(obj->ce, Z_STR_P(function_name));
}
zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
-
+ if ((IS_CV & (IS_VAR|IS_TMP_VAR)) && GC_DELREF(orig_obj) == 0) {
+ zend_objects_store_del(orig_obj);
+ }
HANDLE_EXCEPTION();
}
if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
CACHE_POLYMORPHIC_PTR(opline->result.num, called_scope, fbc);
}
if ((IS_CV & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(obj != orig_obj)) {
- /* Reset "object" to trigger reference counting */
- object = NULL;
+ GC_ADDREF(obj); /* For $this pointer */
+ if (GC_DELREF(orig_obj) == 0) {
+ zend_objects_store_del(orig_obj);
+ }
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
-
- if ((IS_CV & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
+ if ((IS_CV & (IS_VAR|IS_TMP_VAR)) && GC_DELREF(obj) == 0) {
+ zend_objects_store_del(obj);
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
}
/* call static method */
obj = (zend_object*)called_scope;
} else if (IS_CV & (IS_VAR|IS_TMP_VAR|IS_CV)) {
if (IS_CV == IS_CV) {
GC_ADDREF(obj); /* For $this pointer */
- } else {
- zval *free_op1 = EX_VAR(opline->op1.var);
- if (free_op1 != object) {
- GC_ADDREF(obj); /* For $this pointer */
- zval_ptr_dtor_nogc(free_op1);
- }
}
/* CV may be changed indirectly (e.g. when it's a reference) */
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS;
do {
if (IS_CV == IS_CONST || UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
if ((IS_CV & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(object))) {
- object = Z_REFVAL_P(object);
+ zend_reference *ref = Z_REF_P(object);
+
+ object = &ref->val;
if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ if (IS_CV & IS_VAR) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+ efree_size(ref, sizeof(zend_reference));
+ } else {
+ Z_ADDREF_P(object);
+ }
+ }
break;
}
}
zend_undefined_method(obj->ce, Z_STR_P(function_name));
}
-
+ if ((IS_CV & (IS_VAR|IS_TMP_VAR)) && GC_DELREF(orig_obj) == 0) {
+ zend_objects_store_del(orig_obj);
+ }
HANDLE_EXCEPTION();
}
if (IS_CV == IS_CONST &&
CACHE_POLYMORPHIC_PTR(opline->result.num, called_scope, fbc);
}
if ((IS_CV & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(obj != orig_obj)) {
- /* Reset "object" to trigger reference counting */
- object = NULL;
+ GC_ADDREF(obj); /* For $this pointer */
+ if (GC_DELREF(orig_obj) == 0) {
+ zend_objects_store_del(orig_obj);
+ }
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
-
- if ((IS_CV & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
+ if ((IS_CV & (IS_VAR|IS_TMP_VAR)) && GC_DELREF(obj) == 0) {
+ zend_objects_store_del(obj);
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
}
/* call static method */
obj = (zend_object*)called_scope;
} else if (IS_CV & (IS_VAR|IS_TMP_VAR|IS_CV)) {
if (IS_CV == IS_CV) {
GC_ADDREF(obj); /* For $this pointer */
- } else {
- zval *free_op1 = EX_VAR(opline->op1.var);
- if (free_op1 != object) {
- GC_ADDREF(obj); /* For $this pointer */
- zval_ptr_dtor_nogc(free_op1);
- }
}
/* CV may be changed indirectly (e.g. when it's a reference) */
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS;