Use zend_std_build_properties() to access zend_object.properties

The zend_object.properties HashTable needs to be built just in time by calling
rebuild_object_properties() on the object before accessing it. Normally this is
done automatically in zend_std_get_properties(), but we do it manually in a few
places.

In this change I introduce an inline variant of zend_std_build_properties(), and
refactor these places to use it instead of calling rebuild_object_properties()
manually.

rebuild_object_properties() renamed as rebuild_object_properties_internal(), to
enforce usage of zend_std_get_properties() or zend_std_build_properties_ex().

Closes GH-14996
This commit is contained in:
Arnaud Le Blanc 2024-07-17 20:41:36 +02:00
parent 436baae172
commit 1fbb666545
No known key found for this signature in database
GPG key ID: 0098C05DD15ABC13
14 changed files with 124 additions and 257 deletions

View file

@ -94,6 +94,11 @@ PHP 8.4 INTERNALS UPGRADE NOTES
* Added zend_hash_get_current_pos_ex() variant of zend_hash_get_current_pos().
* Renamed rebuild_object_properties() to rebuild_object_properties_internal().
This function should not be used outside of zend_std_get_properties_ex() and
zend_std_get_properties(). Use zend_std_get_properties_ex() or
zend_std_get_properties() instead.
========================
2. Build system changes
========================

View file

@ -31,6 +31,7 @@
#include "zend_inheritance.h"
#include "zend_ini.h"
#include "zend_enum.h"
#include "zend_object_handlers.h"
#include "zend_observer.h"
#include <stdarg.h>
@ -1764,10 +1765,7 @@ ZEND_API void object_properties_load(zend_object *object, HashTable *properties)
ZSTR_VAL(object->ce->name), property_info != ZEND_WRONG_PROPERTY_INFO ? zend_get_unmangled_property_name(key): "");
}
if (!object->properties) {
rebuild_object_properties(object);
}
prop = zend_hash_update(object->properties, key, prop);
prop = zend_hash_update(zend_std_get_properties_ex(object), key, prop);
zval_add_ref(prop);
}
} else {
@ -1779,10 +1777,7 @@ ZEND_API void object_properties_load(zend_object *object, HashTable *properties)
ZSTR_VAL(object->ce->name), h);
}
if (!object->properties) {
rebuild_object_properties(object);
}
prop = zend_hash_index_update(object->properties, h, prop);
prop = zend_hash_index_update(zend_std_get_properties_ex(object), h, prop);
zval_add_ref(prop);
}
} ZEND_HASH_FOREACH_END();

View file

@ -62,7 +62,7 @@
called, we cal __call handler.
*/
ZEND_API void rebuild_object_properties(zend_object *zobj) /* {{{ */
ZEND_API void rebuild_object_properties_internal(zend_object *zobj) /* {{{ */
{
if (!zobj->properties) {
zend_property_info *prop_info;
@ -130,7 +130,7 @@ ZEND_API HashTable *zend_std_build_object_properties_array(zend_object *zobj) /*
ZEND_API HashTable *zend_std_get_properties(zend_object *zobj) /* {{{ */
{
if (!zobj->properties) {
rebuild_object_properties(zobj);
rebuild_object_properties_internal(zobj);
}
return zobj->properties;
}
@ -1124,10 +1124,7 @@ write_std_property:
}
Z_TRY_ADDREF_P(value);
if (!zobj->properties) {
rebuild_object_properties(zobj);
}
variable_ptr = zend_hash_add_new(zobj->properties, name, value);
variable_ptr = zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
}
}
@ -1312,7 +1309,7 @@ ZEND_API zval *zend_std_get_property_ptr_ptr(zend_object *zobj, zend_string *nam
}
}
if (UNEXPECTED(!zobj->properties)) {
rebuild_object_properties(zobj);
rebuild_object_properties_internal(zobj);
}
if (UNEXPECTED(type == BP_VAR_RW || type == BP_VAR_R)) {
zend_error(E_WARNING, "Undefined property: %s::$%s", ZSTR_VAL(zobj->ce->name), ZSTR_VAL(name));
@ -2028,13 +2025,9 @@ ZEND_API int zend_std_compare_objects(zval *o1, zval *o2) /* {{{ */
Z_UNPROTECT_RECURSION_P(o1);
return 0;
} else {
if (!zobj1->properties) {
rebuild_object_properties(zobj1);
}
if (!zobj2->properties) {
rebuild_object_properties(zobj2);
}
return zend_compare_symbol_tables(zobj1->properties, zobj2->properties);
return zend_compare_symbol_tables(
zend_std_get_properties_ex(zobj1),
zend_std_get_properties_ex(zobj2));
}
}
/* }}} */

View file

@ -267,7 +267,16 @@ ZEND_API zend_function *zend_std_get_method(zend_object **obj_ptr, zend_string *
ZEND_API zend_string *zend_std_get_class_name(const zend_object *zobj);
ZEND_API int zend_std_compare_objects(zval *o1, zval *o2);
ZEND_API zend_result zend_std_get_closure(zend_object *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zend_object **obj_ptr, bool check_only);
ZEND_API void rebuild_object_properties(zend_object *zobj);
/* Use zend_std_get_properties_ex() */
ZEND_API void rebuild_object_properties_internal(zend_object *zobj);
static inline HashTable *zend_std_get_properties_ex(zend_object *object)
{
if (!object->properties) {
rebuild_object_properties_internal(object);
}
return object->properties;
}
ZEND_API HashTable *zend_std_build_object_properties_array(zend_object *zobj);

View file

@ -2495,9 +2495,6 @@ ZEND_VM_C_LABEL(fast_assign_obj):
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (OP_DATA_TYPE == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -2521,8 +2518,8 @@ ZEND_VM_C_LABEL(fast_assign_obj):
} else if (OP_DATA_TYPE == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}

252
Zend/zend_vm_execute.h generated
View file

@ -24072,9 +24072,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_CONST == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -24098,8 +24095,8 @@ fast_assign_obj:
} else if (IS_CONST == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -24219,9 +24216,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_TMP_VAR == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -24245,8 +24239,8 @@ fast_assign_obj:
} else if (IS_TMP_VAR == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -24366,9 +24360,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_VAR == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -24392,8 +24383,8 @@ fast_assign_obj:
} else if (IS_VAR == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -24513,9 +24504,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_CV == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -24539,8 +24527,8 @@ fast_assign_obj:
} else if (IS_CV == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -27050,9 +27038,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_CONST == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -27076,8 +27061,8 @@ fast_assign_obj:
} else if (IS_CONST == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -27197,9 +27182,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_TMP_VAR == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -27223,8 +27205,8 @@ fast_assign_obj:
} else if (IS_TMP_VAR == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -27344,9 +27326,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_VAR == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -27370,8 +27349,8 @@ fast_assign_obj:
} else if (IS_VAR == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -27491,9 +27470,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_CV == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -27517,8 +27493,8 @@ fast_assign_obj:
} else if (IS_CV == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -31394,9 +31370,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_CONST == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -31420,8 +31393,8 @@ fast_assign_obj:
} else if (IS_CONST == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -31541,9 +31514,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_TMP_VAR == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -31567,8 +31537,8 @@ fast_assign_obj:
} else if (IS_TMP_VAR == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -31688,9 +31658,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_VAR == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -31714,8 +31681,8 @@ fast_assign_obj:
} else if (IS_VAR == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -31835,9 +31802,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_CV == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -31861,8 +31825,8 @@ fast_assign_obj:
} else if (IS_CV == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -34128,9 +34092,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_CONST == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -34154,8 +34115,8 @@ fast_assign_obj:
} else if (IS_CONST == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -34275,9 +34236,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_TMP_VAR == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -34301,8 +34259,8 @@ fast_assign_obj:
} else if (IS_TMP_VAR == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -34422,9 +34380,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_VAR == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -34448,8 +34403,8 @@ fast_assign_obj:
} else if (IS_VAR == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -34569,9 +34524,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_CV == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -34595,8 +34547,8 @@ fast_assign_obj:
} else if (IS_CV == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -36283,9 +36235,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_CONST == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -36309,8 +36258,8 @@ fast_assign_obj:
} else if (IS_CONST == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -36430,9 +36379,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_TMP_VAR == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -36456,8 +36402,8 @@ fast_assign_obj:
} else if (IS_TMP_VAR == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -36577,9 +36523,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_VAR == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -36603,8 +36546,8 @@ fast_assign_obj:
} else if (IS_VAR == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -36724,9 +36667,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_CV == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -36750,8 +36690,8 @@ fast_assign_obj:
} else if (IS_CV == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -38920,9 +38860,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_CONST == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -38946,8 +38883,8 @@ fast_assign_obj:
} else if (IS_CONST == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -39067,9 +39004,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_TMP_VAR == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -39093,8 +39027,8 @@ fast_assign_obj:
} else if (IS_TMP_VAR == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -39214,9 +39148,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_VAR == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -39240,8 +39171,8 @@ fast_assign_obj:
} else if (IS_VAR == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -39361,9 +39292,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_CV == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -39387,8 +39315,8 @@ fast_assign_obj:
} else if (IS_CV == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -43296,9 +43224,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_CONST == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -43322,8 +43247,8 @@ fast_assign_obj:
} else if (IS_CONST == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -43443,9 +43368,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_TMP_VAR == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -43469,8 +43391,8 @@ fast_assign_obj:
} else if (IS_TMP_VAR == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -43590,9 +43512,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_VAR == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -43616,8 +43535,8 @@ fast_assign_obj:
} else if (IS_VAR == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -43737,9 +43656,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_CV == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -43763,8 +43679,8 @@ fast_assign_obj:
} else if (IS_CV == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -47236,9 +47152,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_CONST == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -47262,8 +47175,8 @@ fast_assign_obj:
} else if (IS_CONST == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -47383,9 +47296,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_TMP_VAR == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -47409,8 +47319,8 @@ fast_assign_obj:
} else if (IS_TMP_VAR == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -47530,9 +47440,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_VAR == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -47556,8 +47463,8 @@ fast_assign_obj:
} else if (IS_VAR == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -47677,9 +47584,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_CV == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -47703,8 +47607,8 @@ fast_assign_obj:
} else if (IS_CV == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -52727,9 +52631,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_CONST == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -52753,8 +52654,8 @@ fast_assign_obj:
} else if (IS_CONST == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -52874,9 +52775,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_TMP_VAR == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -52900,8 +52798,8 @@ fast_assign_obj:
} else if (IS_TMP_VAR == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -53021,9 +52919,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_VAR == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -53047,8 +52942,8 @@ fast_assign_obj:
} else if (IS_VAR == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@ -53168,9 +53063,6 @@ fast_assign_obj:
}
if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
if (IS_CV == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
Z_ADDREF_P(value);
@ -53194,8 +53086,8 @@ fast_assign_obj:
} else if (IS_CV == IS_CV) {
Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, name, value);
}
zend_hash_add_new(zend_std_get_properties_ex(zobj), name, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}

View file

@ -1515,9 +1515,8 @@ static void initialize_date_period_properties(php_period_obj *period_obj)
{
zval zv;
if (UNEXPECTED(!period_obj->std.properties)) {
rebuild_object_properties(&period_obj->std);
}
/* rebuild properties */
zend_std_get_properties_ex(&period_obj->std);
create_date_period_datetime(period_obj->start, period_obj->start_ce, &zv);
write_date_period_property(&period_obj->std, "start", sizeof("start") - 1, &zv);
@ -1652,9 +1651,8 @@ static void date_period_it_move_forward(zend_object_iterator *iter)
date_period_advance(it_time, object->interval);
if (UNEXPECTED(!object->std.properties)) {
rebuild_object_properties(&object->std);
}
/* rebuild properties */
zend_std_get_properties_ex(&object->std);
create_date_period_datetime(object->current, object->start_ce, &current_zv);
zend_string *property_name = ZSTR_INIT_LITERAL("current", 0);

View file

@ -1505,7 +1505,8 @@ zend_object *pdo_dbh_new(zend_class_entry *ce)
dbh = zend_object_alloc(sizeof(pdo_dbh_object_t), ce);
zend_object_std_init(&dbh->std, ce);
object_properties_init(&dbh->std, ce);
rebuild_object_properties(&dbh->std);
/* rebuild properties */
zend_std_get_properties_ex(&dbh->std);
dbh->inner = ecalloc(1, sizeof(pdo_dbh_t));
dbh->inner->def_stmt_ce = pdo_dbstmt_ce;

View file

@ -2426,10 +2426,7 @@ static HashTable *row_get_properties_for(zend_object *object, zend_prop_purpose
return zend_std_get_properties_for(object, purpose);
}
if (!stmt->std.properties) {
rebuild_object_properties(&stmt->std);
}
props = zend_array_dup(stmt->std.properties);
props = zend_array_dup(zend_std_get_properties_ex(&stmt->std));
for (i = 0; i < stmt->column_count; i++) {
if (zend_string_equals_literal(stmt->columns[i].name, "queryString")) {
continue;

View file

@ -388,10 +388,7 @@ PHP_METHOD(Random_Engine_Mt19937, __debugInfo)
ZEND_PARSE_PARAMETERS_NONE();
if (!engine->std.properties) {
rebuild_object_properties(&engine->std);
}
ZVAL_ARR(return_value, zend_array_dup(engine->std.properties));
ZVAL_ARR(return_value, zend_array_dup(zend_std_get_properties_ex(&engine->std)));
if (engine->engine.algo->serialize) {
array_init(&t);

View file

@ -64,9 +64,8 @@ static inline spl_array_object *spl_array_from_obj(zend_object *obj) /* {{{ */ {
static inline HashTable **spl_array_get_hash_table_ptr(spl_array_object* intern) { /* {{{ */
//??? TODO: Delay duplication for arrays; only duplicate for write operations
if (intern->ar_flags & SPL_ARRAY_IS_SELF) {
if (!intern->std.properties) {
rebuild_object_properties(&intern->std);
}
/* rebuild properties */
zend_std_get_properties_ex(&intern->std);
return &intern->std.properties;
} else if (intern->ar_flags & SPL_ARRAY_USE_OTHER) {
spl_array_object *other = Z_SPLARRAY_P(&intern->array);
@ -75,9 +74,9 @@ static inline HashTable **spl_array_get_hash_table_ptr(spl_array_object* intern)
return &Z_ARRVAL(intern->array);
} else {
zend_object *obj = Z_OBJ(intern->array);
if (!obj->properties) {
rebuild_object_properties(obj);
} else if (GC_REFCOUNT(obj->properties) > 1) {
/* rebuild properties */
zend_std_get_properties_ex(obj);
if (GC_REFCOUNT(obj->properties) > 1) {
if (EXPECTED(!(GC_FLAGS(obj->properties) & IS_ARRAY_IMMUTABLE))) {
GC_DELREF(obj->properties);
}
@ -770,18 +769,15 @@ static HashTable *spl_array_get_properties_for(zend_object *object, zend_prop_pu
static inline HashTable* spl_array_get_debug_info(zend_object *obj) /* {{{ */
{
spl_array_object *intern = spl_array_from_obj(obj);
if (!intern->std.properties) {
rebuild_object_properties(&intern->std);
}
HashTable *properties = zend_std_get_properties_ex(&intern->std);
if (intern->ar_flags & SPL_ARRAY_IS_SELF) {
return zend_array_dup(intern->std.properties);
return zend_array_dup(properties);
} else {
HashTable *debug_info;
debug_info = zend_new_array(zend_hash_num_elements(intern->std.properties) + 1);
zend_hash_copy(debug_info, intern->std.properties, (copy_ctor_func_t) zval_add_ref);
debug_info = zend_new_array(zend_hash_num_elements(properties) + 1);
zend_hash_copy(debug_info, properties, (copy_ctor_func_t) zval_add_ref);
zval *storage = &intern->array;
Z_TRY_ADDREF_P(storage);
@ -1266,11 +1262,8 @@ PHP_METHOD(ArrayObject, serialize)
/* members */
smart_str_appendl(&buf, "m:", 2);
if (!intern->std.properties) {
rebuild_object_properties(&intern->std);
}
ZVAL_ARR(&members, intern->std.properties);
ZVAL_ARR(&members, zend_std_get_properties_ex(&intern->std));
php_var_serialize(&buf, &members, &var_hash); /* finishes the string */

View file

@ -601,12 +601,8 @@ static inline HashTable *spl_filesystem_object_get_debug_info(zend_object *objec
HashTable *debug_info;
zend_string *path_name;
if (!intern->std.properties) {
rebuild_object_properties(&intern->std);
}
// TODO Do zend_new_array() + zend_hash_copy() trick?
debug_info = zend_array_dup(intern->std.properties);
debug_info = zend_array_dup(zend_std_get_properties_ex(&intern->std));
path_name = spl_filesystem_object_get_pathname(intern);
if (path_name) {

View file

@ -427,14 +427,11 @@ static inline HashTable* spl_dllist_object_get_debug_info(zend_object *obj) /* {
spl_ptr_llist_element *current = intern->llist->head;
zval tmp, dllist_array;
HashTable *debug_info;
if (!intern->std.properties) {
rebuild_object_properties(&intern->std);
}
HashTable *properties = zend_std_get_properties_ex(&intern->std);
/* +2 As we are adding 2 additional key-entries */
debug_info = zend_new_array(zend_hash_num_elements(intern->std.properties) + 2);
zend_hash_copy(debug_info, intern->std.properties, (copy_ctor_func_t) zval_add_ref);
debug_info = zend_new_array(zend_hash_num_elements(properties) + 2);
zend_hash_copy(debug_info, properties, (copy_ctor_func_t) zval_add_ref);
ZVAL_LONG(&tmp, intern->flags);
spl_set_private_debug_info_property(spl_ce_SplDoublyLinkedList, "flags", strlen("flags"), debug_info, &tmp);

View file

@ -507,14 +507,11 @@ static inline HashTable* spl_heap_object_get_debug_info(const zend_class_entry *
spl_heap_object *intern = spl_heap_from_obj(obj);
zval tmp, heap_array;
HashTable *debug_info;
if (!intern->std.properties) {
rebuild_object_properties(&intern->std);
}
HashTable *properties = zend_std_get_properties_ex(&intern->std);
/* +3 As we are adding 3 additional key-entries */
debug_info = zend_new_array(zend_hash_num_elements(intern->std.properties) + 3);
zend_hash_copy(debug_info, intern->std.properties, (copy_ctor_func_t) zval_add_ref);
debug_info = zend_new_array(zend_hash_num_elements(properties) + 3);
zend_hash_copy(debug_info, properties, (copy_ctor_func_t) zval_add_ref);
ZVAL_LONG(&tmp, intern->flags);
spl_set_private_debug_info_property(ce, "flags", strlen("flags"), debug_info, &tmp);