diff options
Diffstat (limited to 'Zend')
-rw-r--r-- | Zend/zend_object_handlers.c | 53 | ||||
-rw-r--r-- | Zend/zend_vm_def.h | 2 | ||||
-rw-r--r-- | Zend/zend_vm_execute.h | 40 |
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); |