@@ -26,6 +26,10 @@ extern "C" {
2626#define zend_string_release_ex (s, persistent ) zend_string_release((s))
2727#endif
2828
29+ #ifndef ZVAL_EMPTY_ARRAY
30+ #define ZVAL_EMPTY_ARRAY (value ) array_init(value)
31+ #endif
32+
2933#define SIMDJSON_DEPTH_CHECK_THRESHOLD 100000
3034
3135PHP_SIMDJSON_API const char * php_simdjson_error_msg (simdjson_php_error_code error)
@@ -54,6 +58,15 @@ get_key_with_optional_prefix(simdjson::dom::element &doc, std::string_view json_
5458 return doc.at_pointer (std_pointer);
5559}
5660
61+ /* * Init packed array with expected size */
62+ static zend_always_inline zend_array* simdjson_init_packed_array (zval *zv, uint32_t size) {
63+ zend_array *arr;
64+ array_init_size (zv, size);
65+ arr = Z_ARR_P (zv);
66+ zend_hash_real_init_packed (arr);
67+ return arr;
68+ }
69+
5770static simdjson::error_code
5871build_parsed_json_cust (simdjson_php_parser* parser, simdjson::dom::element &doc, const char *buf, size_t len, bool realloc_if_needed,
5972 size_t depth = simdjson::DEFAULT_MAX_DEPTH) {
@@ -163,16 +176,13 @@ static simdjson_php_error_code create_array(simdjson::dom::element element, zval
163176 break ;
164177 case simdjson::dom::element_type::ARRAY : {
165178 const auto json_array = element.get_array ().value_unsafe ();
166- #if PHP_VERSION_ID >= 70300
167179 if (json_array.size () == 0 ) {
168180 /* Reuse the immutable empty array to save memory */
169181 ZVAL_EMPTY_ARRAY (return_value);
170182 break ;
171183 }
172- #endif
173- zend_array *arr;
174- array_init (return_value);
175- arr = Z_ARR_P (return_value);
184+
185+ zend_array *arr = simdjson_init_packed_array (return_value, json_array.size ());
176186
177187 for (simdjson::dom::element child : json_array) {
178188 zval array_element;
@@ -189,15 +199,14 @@ static simdjson_php_error_code create_array(simdjson::dom::element element, zval
189199 }
190200 case simdjson::dom::element_type::OBJECT : {
191201 const auto json_object = element.get_object ().value_unsafe ();
192- #if PHP_VERSION_ID >= 70300
193202 if (json_object.size () == 0 ) {
194203 /* Reuse the immutable empty array to save memory */
195204 ZVAL_EMPTY_ARRAY (return_value);
196205 break ;
197206 }
198- # endif
207+
199208 zend_array *arr;
200- array_init (return_value);
209+ array_init_size (return_value, json_object. size () );
201210 arr = Z_ARR_P (return_value);
202211
203212 for (simdjson::dom::key_value_pair field : json_object) {
@@ -243,16 +252,13 @@ static simdjson_php_error_code create_object(simdjson::dom::element element, zva
243252 break ;
244253 case simdjson::dom::element_type::ARRAY : {
245254 const auto json_array = element.get_array ().value_unsafe ();
246- #if PHP_VERSION_ID >= 70300
247255 if (json_array.size () == 0 ) {
248256 /* Reuse the immutable empty array to save memory */
249257 ZVAL_EMPTY_ARRAY (return_value);
250258 return simdjson::SUCCESS;
251259 }
252- #endif
253- zend_array *arr;
254- array_init (return_value);
255- arr = Z_ARR_P (return_value);
260+
261+ zend_array *arr = simdjson_init_packed_array (return_value, json_array.size ());
256262
257263 for (simdjson::dom::element child : json_array) {
258264 zval value;
0 commit comments