From 1fbb6665458cd0639c6a695557f909755129e919 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Wed, 17 Jul 2024 20:41:36 +0200 Subject: [PATCH] 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 --- UPGRADING.INTERNALS | 5 + Zend/zend_API.c | 11 +- Zend/zend_object_handlers.c | 21 +-- Zend/zend_object_handlers.h | 11 +- Zend/zend_vm_def.h | 7 +- Zend/zend_vm_execute.h | 252 +++++++++++------------------------- ext/date/php_date.c | 10 +- ext/pdo/pdo_dbh.c | 3 +- ext/pdo/pdo_stmt.c | 5 +- ext/random/engine_mt19937.c | 5 +- ext/spl/spl_array.c | 27 ++-- ext/spl/spl_directory.c | 6 +- ext/spl/spl_dllist.c | 9 +- ext/spl/spl_heap.c | 9 +- 14 files changed, 124 insertions(+), 257 deletions(-) diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS index 496188d3f4f4d..0e737854077da 100644 --- a/UPGRADING.INTERNALS +++ b/UPGRADING.INTERNALS @@ -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 ======================== diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 6a07e99202d0d..00a4df3de3fef 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -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 @@ -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(); diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index e354e2e69a417..2b9e43425ef85 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -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 @@ found:; } 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)); } } /* }}} */ diff --git a/Zend/zend_object_handlers.h b/Zend/zend_object_handlers.h index 7483f85202a4c..2619b34ef2f7e 100644 --- a/Zend/zend_object_handlers.h +++ b/Zend/zend_object_handlers.h @@ -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); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 06fd3d576cf87..77c1487b65c62 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -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); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 6e6c7c9aa6657..b32ef2a6cc132 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -24072,9 +24072,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } 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 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } 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); } diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 8a77974b8b905..bfff54c2b6d23 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -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, ¤t_zv); zend_string *property_name = ZSTR_INIT_LITERAL("current", 0); diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c index cc4977b2c1081..c67b0eb24e5b4 100644 --- a/ext/pdo/pdo_dbh.c +++ b/ext/pdo/pdo_dbh.c @@ -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; diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c index da3714a8f5465..4674e901da5a5 100644 --- a/ext/pdo/pdo_stmt.c +++ b/ext/pdo/pdo_stmt.c @@ -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; diff --git a/ext/random/engine_mt19937.c b/ext/random/engine_mt19937.c index d44fd7c93b742..7c9d1741d81f1 100644 --- a/ext/random/engine_mt19937.c +++ b/ext/random/engine_mt19937.c @@ -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); diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c index 9205b523079ea..3b238569b82be 100644 --- a/ext/spl/spl_array.c +++ b/ext/spl/spl_array.c @@ -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 */ diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index c705e9261ba5c..3b0023a628622 100644 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -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) { diff --git a/ext/spl/spl_dllist.c b/ext/spl/spl_dllist.c index c73ba47b46049..5c3fb0dd74879 100644 --- a/ext/spl/spl_dllist.c +++ b/ext/spl/spl_dllist.c @@ -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); diff --git a/ext/spl/spl_heap.c b/ext/spl/spl_heap.c index 24819a5d1e72f..dd7e7ddd92b54 100644 --- a/ext/spl/spl_heap.c +++ b/ext/spl/spl_heap.c @@ -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);