Skip to content

Commit e5ebc1f

Browse files
committed
decoder: Pass whole parser struct to simdjson_create_array and simdjson_create_object methods
1 parent 1d3922b commit e5ebc1f

File tree

1 file changed

+18
-20
lines changed

1 file changed

+18
-20
lines changed

src/simdjson_decoder.cpp

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ static zend_always_inline Bucket *simdjson_hash_str_find_bucket(const HashTable
231231
return NULL;
232232
}
233233

234-
static zend_always_inline void simdjson_dedup_key_strings_release(HashTable *ht) {
234+
static zend_always_inline void simdjson_dedup_key_strings_release(const HashTable *ht) {
235235
ZEND_ASSERT(ht->nNumUsed > 0);
236236
Bucket *p = ht->arData;
237237
Bucket *end = p + ht->nNumUsed;
@@ -423,7 +423,7 @@ static zend_always_inline void simdjson_set_zval_to_int64(zval *zv, int64_t valu
423423
ZVAL_LONG(zv, value);
424424
}
425425

426-
static void simdjson_create_array(simdjson::dom::element element, zval *return_value, HashTable *dedup_key_strings) {
426+
static void simdjson_create_array(simdjson_php_parser *parser, simdjson::dom::element element, zval *return_value) {
427427
switch (element.type()) {
428428
//ASCII sort
429429
case simdjson::dom::element_type::STRING :
@@ -456,7 +456,7 @@ static void simdjson_create_array(simdjson::dom::element element, zval *return_v
456456
zend_array *arr = simdjson_init_packed_array(return_value, 0xFFFFFF);
457457
for (simdjson::dom::element child : json_array) {
458458
zval array_element;
459-
simdjson_create_array(child, &array_element, dedup_key_strings);
459+
simdjson_create_array(parser, child, &array_element);
460460
zend_hash_next_index_insert_new(arr, &array_element);
461461
}
462462
break;
@@ -467,14 +467,14 @@ static void simdjson_create_array(simdjson::dom::element element, zval *return_v
467467
/* Optimised variant of adding elements to array with known size available since PHP 8.2 */
468468
ZEND_HASH_FILL_PACKED(arr) {
469469
for (simdjson::dom::element child : json_array) {
470-
simdjson_create_array(child, __fill_val, dedup_key_strings);
470+
simdjson_create_array(parser, child, __fill_val);
471471
ZEND_HASH_FILL_NEXT();
472472
}
473473
} ZEND_HASH_FILL_END();
474474
#else
475475
for (simdjson::dom::element child : json_array) {
476476
zval array_element;
477-
simdjson_create_array(child, &array_element, dedup_key_strings);
477+
simdjson_create_array(parser, child, &array_element);
478478
zend_hash_next_index_insert_new(arr, &array_element);
479479
}
480480
#endif
@@ -492,18 +492,16 @@ static void simdjson_create_array(simdjson::dom::element element, zval *return_v
492492

493493
for (simdjson::dom::key_value_pair field : json_object) {
494494
zval array_element;
495-
simdjson_create_array(field.value, &array_element, dedup_key_strings);
496-
simdjson_add_key_to_symtable(ht, field.key.data(), field.key.size(), &array_element, dedup_key_strings);
495+
simdjson_create_array(parser, field.value, &array_element);
496+
simdjson_add_key_to_symtable(ht, field.key.data(), field.key.size(), &array_element, &parser->dedup_key_strings);
497497
}
498498
break;
499499
}
500500
EMPTY_SWITCH_DEFAULT_CASE();
501501
}
502502
}
503503

504-
/* }}} */
505-
506-
static simdjson_php_error_code simdjson_create_object(simdjson::dom::element element, zval *return_value, HashTable *dedup_key_strings) /* {{{ */ {
504+
static simdjson_php_error_code simdjson_create_object(simdjson_php_parser *parser, simdjson::dom::element element, zval *return_value) {
507505
switch (element.type()) {
508506
//ASCII sort
509507
case simdjson::dom::element_type::STRING :
@@ -537,7 +535,7 @@ static simdjson_php_error_code simdjson_create_object(simdjson::dom::element ele
537535

538536
for (simdjson::dom::element child : json_array) {
539537
zval value;
540-
simdjson_php_error_code error = simdjson_create_object(child, &value, dedup_key_strings);
538+
simdjson_php_error_code error = simdjson_create_object(parser, child, &value);
541539
if (UNEXPECTED(error)) {
542540
zval_ptr_dtor(return_value);
543541
ZVAL_NULL(return_value);
@@ -561,14 +559,14 @@ static simdjson_php_error_code simdjson_create_object(simdjson::dom::element ele
561559
return SIMDJSON_PHP_ERR_INVALID_PHP_PROPERTY;
562560
}
563561
zval value;
564-
simdjson_php_error_code error = simdjson_create_object(field.value, &value, dedup_key_strings);
562+
simdjson_php_error_code error = simdjson_create_object(parser, field.value, &value);
565563
if (UNEXPECTED(error)) {
566564
zval_ptr_dtor(return_value);
567565
ZVAL_NULL(return_value);
568566
return error;
569567
}
570568

571-
simdjson_add_key_to_object(ht, data, size, &value, dedup_key_strings);
569+
simdjson_add_key_to_object(ht, data, size, &value, &parser->dedup_key_strings);
572570
}
573571
break;
574572
}
@@ -596,17 +594,17 @@ PHP_SIMDJSON_API void php_simdjson_free_parser(simdjson_php_parser* parser) /* {
596594
delete parser;
597595
}
598596

599-
static simdjson_php_error_code simdjson_convert_element(simdjson::dom::element element, zval *return_value, bool associative, HashTable *dedup_key_strings) {
597+
static simdjson_php_error_code simdjson_convert_element(simdjson::dom::element element, zval *return_value, bool associative, simdjson_php_parser *parser) {
600598
#if PHP_VERSION_ID >= 80200
601599
// Allocate table for reusing already allocated keys
602-
simdjson_dedup_key_strings_init(dedup_key_strings);
600+
simdjson_dedup_key_strings_init(&parser->dedup_key_strings);
603601
#endif
604602
simdjson_php_error_code resp;
605603
if (associative) {
606-
simdjson_create_array(element, return_value, dedup_key_strings);
604+
simdjson_create_array(parser, element, return_value);
607605
resp = simdjson::SUCCESS;
608606
} else {
609-
resp = simdjson_create_object(element, return_value, dedup_key_strings);
607+
resp = simdjson_create_object(parser, element, return_value);
610608
}
611609
return resp;
612610
}
@@ -623,14 +621,14 @@ PHP_SIMDJSON_API simdjson_php_error_code php_simdjson_parse(simdjson_php_parser*
623621
simdjson::dom::element doc;
624622

625623
SIMDJSON_PHP_TRY(build_parsed_json_cust(parser, doc, ZSTR_VAL(json), ZSTR_LEN(json), simdjson_realloc_needed(json), depth));
626-
return simdjson_convert_element(doc, return_value, associative, &parser->dedup_key_strings);
624+
return simdjson_convert_element(doc, return_value, associative, parser);
627625
}
628626

629627
PHP_SIMDJSON_API simdjson_php_error_code php_simdjson_parse_buffer(simdjson_php_parser* parser, const char *json, size_t len, zval *return_value, bool associative, size_t depth) /* {{{ */ {
630628
simdjson::dom::element doc;
631629

632630
SIMDJSON_PHP_TRY(build_parsed_json_cust(parser, doc, json, len, false, depth));
633-
return simdjson_convert_element(doc, return_value, associative, &parser->dedup_key_strings);
631+
return simdjson_convert_element(doc, return_value, associative, parser);
634632
}
635633

636634
/* }}} */
@@ -640,7 +638,7 @@ PHP_SIMDJSON_API simdjson_php_error_code php_simdjson_key_value(simdjson_php_par
640638
simdjson::dom::element element;
641639
SIMDJSON_PHP_TRY(build_parsed_json_cust(parser, doc, ZSTR_VAL(json), ZSTR_LEN(json), simdjson_realloc_needed(json), depth));
642640
SIMDJSON_PHP_TRY(get_key_with_optional_prefix(doc, key).get(element));
643-
return simdjson_convert_element(element, return_value, associative, &parser->dedup_key_strings);
641+
return simdjson_convert_element(element, return_value, associative, parser);
644642
}
645643

646644
/* }}} */

0 commit comments

Comments
 (0)