Skip to content

Commit 560d594

Browse files
committed
decoder: Optimise creating stdClass object
1 parent b712606 commit 560d594

File tree

1 file changed

+8
-6
lines changed

1 file changed

+8
-6
lines changed

src/simdjson_decoder.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,18 +57,21 @@ get_key_with_optional_prefix(simdjson::dom::element &doc, std::string_view json_
5757
return doc.at_pointer(std_pointer);
5858
}
5959

60-
static zend_always_inline zend_object* simdjson_init_object(zval *zv, uint32_t size) {
60+
// Initialize stdClass object and return pointer to propertires HashTable
61+
static zend_always_inline HashTable* simdjson_init_object(zval *zv, uint32_t size) {
6162
#if PHP_VERSION_ID >= 80300
62-
zend_object *object = (zend_object*)emalloc(sizeof(zend_object) + zend_object_properties_size(zend_standard_class_def));
63+
size_t properties_size = zend_object_properties_size(zend_standard_class_def);
64+
ZEND_ASSERT(properties_size == -16);
65+
zend_object *object = (zend_object*)emalloc(sizeof(zend_object) - properties_size);
6366
zend_object_std_init(object, zend_standard_class_def);
6467
// Initialize properties array to expected size
6568
object->properties = zend_new_array(size);
6669
zend_hash_real_init_mixed(object->properties);
6770
ZVAL_OBJ(zv, object);
68-
return object;
71+
return object->properties;
6972
#else
7073
object_init(zv);
71-
return Z_OBJ_P(zv);
74+
return zend_std_get_properties(Z_OBJ_P(zv));
7275
#endif
7376
}
7477

@@ -540,8 +543,7 @@ static simdjson_php_error_code simdjson_create_object(simdjson::dom::element ele
540543
}
541544
case simdjson::dom::element_type::OBJECT : {
542545
const auto json_object = element.get_object().value_unsafe();
543-
zend_object *obj = simdjson_init_object(return_value, json_object.size());
544-
HashTable *ht = zend_std_get_properties(obj);
546+
HashTable *ht = simdjson_init_object(return_value, json_object.size());
545547

546548
for (simdjson::dom::key_value_pair field : json_object) {
547549
const char *data = field.key.data();

0 commit comments

Comments
 (0)