summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
Diffstat (limited to 'Zend')
-rw-r--r--Zend/zend_object_handlers.c53
-rw-r--r--Zend/zend_vm_def.h2
-rw-r--r--Zend/zend_vm_execute.h40
3 files changed, 45 insertions, 50 deletions
diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c
index 43b7524f2f..862ba99bdc 100644
--- a/Zend/zend_object_handlers.c
+++ b/Zend/zend_object_handlers.c
@@ -464,13 +464,12 @@ zval *zend_std_read_property(zval *object, zval *member, int type, const zend_li
if (zobj->ce->__get) {
long *guard = zend_get_property_guard(zobj, property_info, member);
if (!((*guard) & IN_GET)) {
+ zval tmp_object;
+
/* have getter - try with it! */
- Z_ADDREF_P(object);
- if (Z_ISREF_P(object)) {
- SEPARATE_ZVAL(object);
- }
+ ZVAL_COPY(&tmp_object, object);
*guard |= IN_GET; /* prevent circular getting */
- zend_std_call_getter(object, member, rv TSRMLS_CC);
+ zend_std_call_getter(&tmp_object, member, rv TSRMLS_CC);
*guard &= ~IN_GET;
if (Z_TYPE_P(rv) != IS_UNDEF) {
@@ -485,11 +484,11 @@ zval *zend_std_read_property(zval *object, zval *member, int type, const zend_li
} else {
retval = &EG(uninitialized_zval);
}
- if (EXPECTED(retval != object)) {
- zval_ptr_dtor(object);
- } else {
- Z_DELREF_P(object);
- }
+//??? if (EXPECTED(retval != object)) {
+ zval_ptr_dtor(&tmp_object);
+//??? } else {
+//??? Z_DELREF_P(object);
+//??? }
} else {
if (Z_STRVAL_P(member)[0] == '\0') {
if (Z_STRLEN_P(member) == 0) {
@@ -590,16 +589,15 @@ found:
long *guard = zend_get_property_guard(zobj, property_info, member);
if (!((*guard) & IN_SET)) {
- Z_ADDREF_P(object);
- if (Z_ISREF_P(object)) {
- SEPARATE_ZVAL(object);
- }
+ zval tmp_object;
+
+ ZVAL_COPY(&tmp_object, object);
(*guard) |= IN_SET; /* prevent circular setting */
- if (zend_std_call_setter(object, member, value TSRMLS_CC) != SUCCESS) {
+ if (zend_std_call_setter(&tmp_object, member, value TSRMLS_CC) != SUCCESS) {
/* for now, just ignore it - __set should take care of warnings, etc. */
}
(*guard) &= ~IN_SET;
- zval_ptr_dtor(object);
+ zval_ptr_dtor(&tmp_object);
} else if (EXPECTED(property_info != NULL)) {
goto write_std_property;
} else {
@@ -830,15 +828,14 @@ static void zend_std_unset_property(zval *object, zval *member, const zend_liter
if (zobj->ce->__unset) {
long *guard = zend_get_property_guard(zobj, property_info, member);
if (!((*guard) & IN_UNSET)) {
+ zval tmp_object;
+
/* have unseter - try with it! */
- Z_ADDREF_P(object);
- if (Z_ISREF_P(object)) {
- SEPARATE_ZVAL(object);
- }
+ ZVAL_COPY(&tmp_object, object);
(*guard) |= IN_UNSET; /* prevent circular unsetting */
- zend_std_call_unsetter(object, member TSRMLS_CC);
+ zend_std_call_unsetter(&tmp_object, member TSRMLS_CC);
(*guard) &= ~IN_UNSET;
- zval_ptr_dtor(object);
+ zval_ptr_dtor(&tmp_object);
} else {
if (Z_STRVAL_P(member)[0] == '\0') {
if (Z_STRLEN_P(member) == 0) {
@@ -1443,15 +1440,13 @@ found:
if (!((*guard) & IN_ISSET)) {
zval rv;
+ zval tmp_object;
/* have issetter - try with it! */
- Z_ADDREF_P(object);
- if (Z_ISREF_P(object)) {
- SEPARATE_ZVAL(object);
- }
+ ZVAL_COPY(&tmp_object, object);
(*guard) |= IN_ISSET; /* prevent circular getting */
ZVAL_UNDEF(&rv);
- zend_std_call_issetter(object, member, &rv TSRMLS_CC);
+ zend_std_call_issetter(&tmp_object, member, &rv TSRMLS_CC);
if (Z_TYPE(rv) != IS_UNDEF) {
result = zend_is_true(&rv TSRMLS_CC);
zval_ptr_dtor(&rv);
@@ -1459,7 +1454,7 @@ found:
if (EXPECTED(!EG(exception)) && zobj->ce->__get && !((*guard) & IN_GET)) {
(*guard) |= IN_GET;
ZVAL_UNDEF(&rv);
- zend_std_call_getter(object, member, &rv TSRMLS_CC);
+ zend_std_call_getter(&tmp_object, member, &rv TSRMLS_CC);
(*guard) &= ~IN_GET;
if (Z_TYPE(rv) != IS_UNDEF) {
result = i_zend_is_true(&rv TSRMLS_CC);
@@ -1473,7 +1468,7 @@ found:
}
}
(*guard) &= ~IN_ISSET;
- zval_ptr_dtor(object);
+ zval_ptr_dtor(&tmp_object);
}
}
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index fa606eb0ea..d214459603 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -5326,7 +5326,7 @@ ZEND_VM_HANDLER(160, ZEND_YIELD, CONST|TMP|VAR|CV|UNUSED, CONST|TMP|VAR|CV|UNUSE
ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
FREE_OP2_IF_VAR();
} else {
- if (OP1_TYPE == IS_CV) {
+ if (OP2_TYPE == IS_CV) {
if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key);
}
ZVAL_COPY_VALUE(&generator->key, key);
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index fa5f6a074e..adc978ecda 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -4923,7 +4923,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_
ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
} else {
- if (IS_CONST == IS_CV) {
+ if (IS_TMP_VAR == IS_CV) {
if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key);
}
ZVAL_COPY_VALUE(&generator->key, key);
@@ -5864,7 +5864,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_
ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
zval_ptr_dtor_nogc(free_op2.var);
} else {
- if (IS_CONST == IS_CV) {
+ if (IS_VAR == IS_CV) {
if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key);
}
ZVAL_COPY_VALUE(&generator->key, key);
@@ -6514,7 +6514,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDL
ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
} else {
- if (IS_CONST == IS_CV) {
+ if (IS_UNUSED == IS_CV) {
if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key);
}
ZVAL_COPY_VALUE(&generator->key, key);
@@ -7210,7 +7210,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_A
ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
} else {
- if (IS_CONST == IS_CV) {
+ if (IS_CV == IS_CV) {
if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key);
}
ZVAL_COPY_VALUE(&generator->key, key);
@@ -9127,7 +9127,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_
ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
} else {
- if (IS_TMP_VAR == IS_CV) {
+ if (IS_CONST == IS_CV) {
if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key);
}
ZVAL_COPY_VALUE(&generator->key, key);
@@ -10712,7 +10712,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
zval_ptr_dtor_nogc(free_op2.var);
} else {
- if (IS_TMP_VAR == IS_CV) {
+ if (IS_VAR == IS_CV) {
if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key);
}
ZVAL_COPY_VALUE(&generator->key, key);
@@ -11230,7 +11230,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER
ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
} else {
- if (IS_TMP_VAR == IS_CV) {
+ if (IS_UNUSED == IS_CV) {
if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key);
}
ZVAL_COPY_VALUE(&generator->key, key);
@@ -11871,7 +11871,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG
ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
} else {
- if (IS_TMP_VAR == IS_CV) {
+ if (IS_CV == IS_CV) {
if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key);
}
ZVAL_COPY_VALUE(&generator->key, key);
@@ -15557,7 +15557,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_
ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
} else {
- if (IS_VAR == IS_CV) {
+ if (IS_CONST == IS_CV) {
if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key);
}
ZVAL_COPY_VALUE(&generator->key, key);
@@ -17466,7 +17466,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR
ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
} else {
- if (IS_VAR == IS_CV) {
+ if (IS_TMP_VAR == IS_CV) {
if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key);
}
ZVAL_COPY_VALUE(&generator->key, key);
@@ -20883,7 +20883,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER
ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
} else {
- if (IS_VAR == IS_CV) {
+ if (IS_UNUSED == IS_CV) {
if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key);
}
ZVAL_COPY_VALUE(&generator->key, key);
@@ -22845,7 +22845,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG
ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
} else {
- if (IS_VAR == IS_CV) {
+ if (IS_CV == IS_CV) {
if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key);
}
ZVAL_COPY_VALUE(&generator->key, key);
@@ -24237,7 +24237,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDL
ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
} else {
- if (IS_UNUSED == IS_CV) {
+ if (IS_CONST == IS_CV) {
if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key);
}
ZVAL_COPY_VALUE(&generator->key, key);
@@ -25466,7 +25466,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER
ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
} else {
- if (IS_UNUSED == IS_CV) {
+ if (IS_TMP_VAR == IS_CV) {
if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key);
}
ZVAL_COPY_VALUE(&generator->key, key);
@@ -26695,7 +26695,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER
ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
zval_ptr_dtor_nogc(free_op2.var);
} else {
- if (IS_UNUSED == IS_CV) {
+ if (IS_VAR == IS_CV) {
if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key);
}
ZVAL_COPY_VALUE(&generator->key, key);
@@ -28412,7 +28412,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_
ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
} else {
- if (IS_UNUSED == IS_CV) {
+ if (IS_CV == IS_CV) {
if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key);
}
ZVAL_COPY_VALUE(&generator->key, key);
@@ -31711,7 +31711,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
} else {
- if (IS_CV == IS_CV) {
+ if (IS_CONST == IS_CV) {
if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key);
}
ZVAL_COPY_VALUE(&generator->key, key);
@@ -33503,7 +33503,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
} else {
- if (IS_CV == IS_CV) {
+ if (IS_TMP_VAR == IS_CV) {
if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key);
}
ZVAL_COPY_VALUE(&generator->key, key);
@@ -35655,7 +35655,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
zval_ptr_dtor_nogc(free_op2.var);
} else {
- if (IS_CV == IS_CV) {
+ if (IS_VAR == IS_CV) {
if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key);
}
ZVAL_COPY_VALUE(&generator->key, key);
@@ -36668,7 +36668,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_
ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
} else {
- if (IS_CV == IS_CV) {
+ if (IS_UNUSED == IS_CV) {
if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key);
}
ZVAL_COPY_VALUE(&generator->key, key);