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) {
} 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) {
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 {
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) {
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);
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);
}
}
(*guard) &= ~IN_ISSET;
- zval_ptr_dtor(object);
+ zval_ptr_dtor(&tmp_object);
}
}