summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/zend_vm_def.h26
-rw-r--r--Zend/zend_vm_execute.h26
2 files changed, 36 insertions, 16 deletions
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index 795078085e..7e374e5392 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -7628,20 +7628,30 @@ ZEND_VM_C_LABEL(check_indirect):
}
}
- variable_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
-
do {
zend_reference *ref;
if (UNEXPECTED(!Z_ISREF_P(value))) {
- ZVAL_NEW_REF(value, value);
- } else if (UNEXPECTED(variable_ptr == value)) {
- break;
+ ref = (zend_reference*)emalloc(sizeof(zend_reference));
+ GC_REFCOUNT(ref) = 2;
+ GC_TYPE_INFO(ref) = IS_REFERENCE;
+ ZVAL_COPY_VALUE(&ref->val, value);
+ Z_REF_P(value) = ref;
+ Z_TYPE_INFO_P(value) = IS_REFERENCE_EX;
+ } else {
+ ref = Z_REF_P(value);
+ GC_REFCOUNT(ref)++;
}
- ref = Z_REF_P(value);
- GC_REFCOUNT(ref)++;
+
+ variable_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
+
if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr))) {
- if (!Z_DELREF_P(variable_ptr)) {
+ uint32_t refcnt = Z_DELREF_P(variable_ptr);
+
+ if (UNEXPECTED(variable_ptr == value)) {
+ break;
+ }
+ if (refcnt == 0) {
SAVE_OPLINE();
zval_dtor_func_for_ptr(Z_COUNTED_P(variable_ptr));
if (UNEXPECTED(EG(exception))) {
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 3f54a01e8b..fef3e96bc7 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -32798,20 +32798,30 @@ check_indirect:
}
}
- variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
-
do {
zend_reference *ref;
if (UNEXPECTED(!Z_ISREF_P(value))) {
- ZVAL_NEW_REF(value, value);
- } else if (UNEXPECTED(variable_ptr == value)) {
- break;
+ ref = (zend_reference*)emalloc(sizeof(zend_reference));
+ GC_REFCOUNT(ref) = 2;
+ GC_TYPE_INFO(ref) = IS_REFERENCE;
+ ZVAL_COPY_VALUE(&ref->val, value);
+ Z_REF_P(value) = ref;
+ Z_TYPE_INFO_P(value) = IS_REFERENCE_EX;
+ } else {
+ ref = Z_REF_P(value);
+ GC_REFCOUNT(ref)++;
}
- ref = Z_REF_P(value);
- GC_REFCOUNT(ref)++;
+
+ variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
+
if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr))) {
- if (!Z_DELREF_P(variable_ptr)) {
+ uint32_t refcnt = Z_DELREF_P(variable_ptr);
+
+ if (UNEXPECTED(variable_ptr == value)) {
+ break;
+ }
+ if (refcnt == 0) {
SAVE_OPLINE();
zval_dtor_func_for_ptr(Z_COUNTED_P(variable_ptr));
if (UNEXPECTED(EG(exception))) {