diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index e6f1e44fca1ac..1c65f0801ee43 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -552,7 +552,7 @@ ZEND_API uint32_t zend_get_executed_lineno(void) /* {{{ */ while (ex && (!ex->func || !ZEND_USER_CODE(ex->func->type))) { ex = ex->prev_execute_data; } - if (ex) { + if (ex && ex->opline) { if (EG(exception) && ex->opline->opcode == ZEND_HANDLE_EXCEPTION && ex->opline->lineno == 0 && EG(opline_before_exception)) { return EG(opline_before_exception)->lineno; diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index ebec6921cb9db..ba153e612e072 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -545,7 +545,7 @@ ZEND_API uint32_t *zend_get_property_guard(zend_object *zobj, zend_string *membe } /* }}} */ -ZEND_API zval *zend_std_read_property(zend_object *zobj, zend_string *name, int type, void **cache_slot, zval *rv) /* {{{ */ +ZEND_API zval *zend_std_read_property(zend_object *zobj, zend_string *name, int type, void **cache_slot, zval *getter_return) /* {{{ */ { zval *retval; uintptr_t property_offset; @@ -642,14 +642,14 @@ ZEND_API zval *zend_std_read_property(zend_object *zobj, zend_string *name, int GC_ADDREF(zobj); call_getter: *guard |= IN_GET; /* prevent circular getting */ - zend_std_call_getter(zobj, name, rv); + zend_std_call_getter(zobj, name, getter_return); *guard &= ~IN_GET; - if (Z_TYPE_P(rv) != IS_UNDEF) { - retval = rv; - if (!Z_ISREF_P(rv) && + if (Z_TYPE_P(getter_return) != IS_UNDEF) { + retval = getter_return; + if (!Z_ISREF_P(getter_return) && (type == BP_VAR_W || type == BP_VAR_RW || type == BP_VAR_UNSET)) { - if (UNEXPECTED(Z_TYPE_P(rv) != IS_OBJECT)) { + if (UNEXPECTED(Z_TYPE_P(getter_return) != IS_OBJECT)) { zend_error(E_NOTICE, "Indirect modification of overloaded property %s::$%s has no effect", ZSTR_VAL(zobj->ce->name), ZSTR_VAL(name)); } } diff --git a/Zend/zend_object_handlers.h b/Zend/zend_object_handlers.h index b401d72ca294a..46438a0fc6dbd 100644 --- a/Zend/zend_object_handlers.h +++ b/Zend/zend_object_handlers.h @@ -193,7 +193,10 @@ ZEND_API HashTable *zend_std_get_gc(zend_object *object, zval **table, int *n); ZEND_API HashTable *zend_std_get_debug_info(zend_object *object, int *is_temp); ZEND_API int zend_std_cast_object_tostring(zend_object *object, zval *writeobj, int type); ZEND_API zval *zend_std_get_property_ptr_ptr(zend_object *object, zend_string *member, int type, void **cache_slot); -ZEND_API zval *zend_std_read_property(zend_object *object, zend_string *member, int type, void **cache_slot, zval *rv); +/* +When the object has "__get" method, you must pass the getter_return parameter, which points to the memory used to hold the return value of the getter function +*/ +ZEND_API zval *zend_std_read_property(zend_object *object, zend_string *member, int type, void **cache_slot, zval *getter_return); ZEND_API zval *zend_std_write_property(zend_object *object, zend_string *member, zval *value, void **cache_slot); ZEND_API int zend_std_has_property(zend_object *object, zend_string *member, int has_set_exists, void **cache_slot); ZEND_API void zend_std_unset_property(zend_object *object, zend_string *member, void **cache_slot);