@@ -231,7 +231,7 @@ static zend_always_inline Bucket *simdjson_hash_str_find_bucket(const HashTable
231
231
return NULL ;
232
232
}
233
233
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) {
235
235
ZEND_ASSERT (ht->nNumUsed > 0 );
236
236
Bucket *p = ht->arData ;
237
237
Bucket *end = p + ht->nNumUsed ;
@@ -423,7 +423,7 @@ static zend_always_inline void simdjson_set_zval_to_int64(zval *zv, int64_t valu
423
423
ZVAL_LONG (zv, value);
424
424
}
425
425
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) {
427
427
switch (element.type ()) {
428
428
// ASCII sort
429
429
case simdjson::dom::element_type::STRING :
@@ -456,7 +456,7 @@ static void simdjson_create_array(simdjson::dom::element element, zval *return_v
456
456
zend_array *arr = simdjson_init_packed_array (return_value, 0xFFFFFF );
457
457
for (simdjson::dom::element child : json_array) {
458
458
zval array_element;
459
- simdjson_create_array (child, &array_element, dedup_key_strings );
459
+ simdjson_create_array (parser, child, &array_element);
460
460
zend_hash_next_index_insert_new (arr, &array_element);
461
461
}
462
462
break ;
@@ -467,14 +467,14 @@ static void simdjson_create_array(simdjson::dom::element element, zval *return_v
467
467
/* Optimised variant of adding elements to array with known size available since PHP 8.2 */
468
468
ZEND_HASH_FILL_PACKED (arr) {
469
469
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 );
471
471
ZEND_HASH_FILL_NEXT ();
472
472
}
473
473
} ZEND_HASH_FILL_END ();
474
474
#else
475
475
for (simdjson::dom::element child : json_array) {
476
476
zval array_element;
477
- simdjson_create_array (child, &array_element, dedup_key_strings );
477
+ simdjson_create_array (parser, child, &array_element);
478
478
zend_hash_next_index_insert_new (arr, &array_element);
479
479
}
480
480
#endif
@@ -492,18 +492,16 @@ static void simdjson_create_array(simdjson::dom::element element, zval *return_v
492
492
493
493
for (simdjson::dom::key_value_pair field : json_object) {
494
494
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 );
497
497
}
498
498
break ;
499
499
}
500
500
EMPTY_SWITCH_DEFAULT_CASE ();
501
501
}
502
502
}
503
503
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) {
507
505
switch (element.type ()) {
508
506
// ASCII sort
509
507
case simdjson::dom::element_type::STRING :
@@ -537,7 +535,7 @@ static simdjson_php_error_code simdjson_create_object(simdjson::dom::element ele
537
535
538
536
for (simdjson::dom::element child : json_array) {
539
537
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);
541
539
if (UNEXPECTED (error)) {
542
540
zval_ptr_dtor (return_value);
543
541
ZVAL_NULL (return_value);
@@ -561,14 +559,14 @@ static simdjson_php_error_code simdjson_create_object(simdjson::dom::element ele
561
559
return SIMDJSON_PHP_ERR_INVALID_PHP_PROPERTY;
562
560
}
563
561
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);
565
563
if (UNEXPECTED (error)) {
566
564
zval_ptr_dtor (return_value);
567
565
ZVAL_NULL (return_value);
568
566
return error;
569
567
}
570
568
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 );
572
570
}
573
571
break ;
574
572
}
@@ -596,17 +594,17 @@ PHP_SIMDJSON_API void php_simdjson_free_parser(simdjson_php_parser* parser) /* {
596
594
delete parser;
597
595
}
598
596
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 ) {
600
598
#if PHP_VERSION_ID >= 80200
601
599
// 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 );
603
601
#endif
604
602
simdjson_php_error_code resp;
605
603
if (associative) {
606
- simdjson_create_array (element, return_value, dedup_key_strings );
604
+ simdjson_create_array (parser, element, return_value );
607
605
resp = simdjson::SUCCESS;
608
606
} else {
609
- resp = simdjson_create_object (element, return_value, dedup_key_strings );
607
+ resp = simdjson_create_object (parser, element, return_value );
610
608
}
611
609
return resp;
612
610
}
@@ -623,14 +621,14 @@ PHP_SIMDJSON_API simdjson_php_error_code php_simdjson_parse(simdjson_php_parser*
623
621
simdjson::dom::element doc;
624
622
625
623
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);
627
625
}
628
626
629
627
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) /* {{{ */ {
630
628
simdjson::dom::element doc;
631
629
632
630
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);
634
632
}
635
633
636
634
/* }}} */
@@ -640,7 +638,7 @@ PHP_SIMDJSON_API simdjson_php_error_code php_simdjson_key_value(simdjson_php_par
640
638
simdjson::dom::element element;
641
639
SIMDJSON_PHP_TRY (build_parsed_json_cust (parser, doc, ZSTR_VAL (json), ZSTR_LEN (json), simdjson_realloc_needed (json), depth));
642
640
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);
644
642
}
645
643
646
644
/* }}} */
0 commit comments