ext/json: Refactor php_json_encode_array()

Stop relying on internal flags which were published in the header
Use a more descriptive variable name and have it be a boolean
This commit is contained in:
Gina Peter Banyard 2025-04-26 01:00:49 +01:00
parent 17328ef86b
commit 5b3d0e4c09
2 changed files with 6 additions and 17 deletions

View file

@ -41,12 +41,6 @@ static zend_always_inline bool php_json_check_stack_limit(void)
#endif #endif
} }
static int php_json_determine_array_type(const HashTable *ht) /* {{{ */
{
return zend_array_is_list(ht) ? PHP_JSON_OUTPUT_ARRAY : PHP_JSON_OUTPUT_OBJECT;
}
/* }}} */
/* {{{ Pretty printing support functions */ /* {{{ Pretty printing support functions */
static inline void php_json_pretty_print_char(smart_str *buf, int options, char c) /* {{{ */ static inline void php_json_pretty_print_char(smart_str *buf, int options, char c) /* {{{ */
@ -114,7 +108,7 @@ static inline void php_json_encode_double(smart_str *buf, double d, int options)
static zend_result php_json_encode_array(smart_str *buf, zval *val, int options, php_json_encoder *encoder) /* {{{ */ static zend_result php_json_encode_array(smart_str *buf, zval *val, int options, php_json_encoder *encoder) /* {{{ */
{ {
int r; bool encode_as_object = options & PHP_JSON_FORCE_OBJECT;
bool need_comma = false; bool need_comma = false;
HashTable *myht, *prop_ht; HashTable *myht, *prop_ht;
zend_refcounted *recursion_rc; zend_refcounted *recursion_rc;
@ -131,7 +125,7 @@ static zend_result php_json_encode_array(smart_str *buf, zval *val, int options,
myht = Z_ARRVAL_P(val); myht = Z_ARRVAL_P(val);
recursion_rc = (zend_refcounted *)myht; recursion_rc = (zend_refcounted *)myht;
prop_ht = NULL; prop_ht = NULL;
r = (options & PHP_JSON_FORCE_OBJECT) ? PHP_JSON_OUTPUT_OBJECT : php_json_determine_array_type(myht); encode_as_object = encode_as_object || !zend_array_is_list(myht);
} else if (Z_OBJ_P(val)->properties == NULL } else if (Z_OBJ_P(val)->properties == NULL
&& Z_OBJ_HT_P(val)->get_properties_for == NULL && Z_OBJ_HT_P(val)->get_properties_for == NULL
&& Z_OBJ_HT_P(val)->get_properties == zend_std_get_properties && Z_OBJ_HT_P(val)->get_properties == zend_std_get_properties
@ -219,7 +213,7 @@ static zend_result php_json_encode_array(smart_str *buf, zval *val, int options,
* referenced from a different place in the object graph. */ * referenced from a different place in the object graph. */
recursion_rc = (zend_refcounted *)obj; recursion_rc = (zend_refcounted *)obj;
} }
r = PHP_JSON_OUTPUT_OBJECT; encode_as_object = true;
} }
if (recursion_rc && GC_IS_RECURSIVE(recursion_rc)) { if (recursion_rc && GC_IS_RECURSIVE(recursion_rc)) {
@ -231,7 +225,7 @@ static zend_result php_json_encode_array(smart_str *buf, zval *val, int options,
PHP_JSON_HASH_PROTECT_RECURSION(recursion_rc); PHP_JSON_HASH_PROTECT_RECURSION(recursion_rc);
if (r == PHP_JSON_OUTPUT_ARRAY) { if (!encode_as_object) {
smart_str_appendc(buf, '['); smart_str_appendc(buf, '[');
} else { } else {
smart_str_appendc(buf, '{'); smart_str_appendc(buf, '{');
@ -250,7 +244,7 @@ static zend_result php_json_encode_array(smart_str *buf, zval *val, int options,
zval tmp; zval tmp;
ZVAL_UNDEF(&tmp); ZVAL_UNDEF(&tmp);
if (r == PHP_JSON_OUTPUT_ARRAY) { if (!encode_as_object) {
ZEND_ASSERT(Z_TYPE_P(data) != IS_PTR); ZEND_ASSERT(Z_TYPE_P(data) != IS_PTR);
if (need_comma) { if (need_comma) {
@ -262,7 +256,6 @@ static zend_result php_json_encode_array(smart_str *buf, zval *val, int options,
php_json_pretty_print_char(buf, options, '\n'); php_json_pretty_print_char(buf, options, '\n');
php_json_pretty_print_indent(buf, options, encoder); php_json_pretty_print_indent(buf, options, encoder);
} else { } else {
ZEND_ASSERT(r == PHP_JSON_OUTPUT_OBJECT);
if (key) { if (key) {
if (ZSTR_VAL(key)[0] == '\0' && ZSTR_LEN(key) > 0 && Z_TYPE_P(val) == IS_OBJECT) { if (ZSTR_VAL(key)[0] == '\0' && ZSTR_LEN(key) > 0 && Z_TYPE_P(val) == IS_OBJECT) {
/* Skip protected and private members. */ /* Skip protected and private members. */
@ -346,7 +339,7 @@ static zend_result php_json_encode_array(smart_str *buf, zval *val, int options,
php_json_pretty_print_indent(buf, options, encoder); php_json_pretty_print_indent(buf, options, encoder);
} }
if (r == PHP_JSON_OUTPUT_ARRAY) { if (!encode_as_object) {
smart_str_appendc(buf, ']'); smart_str_appendc(buf, ']');
} else { } else {
smart_str_appendc(buf, '}'); smart_str_appendc(buf, '}');

View file

@ -79,10 +79,6 @@ typedef enum {
#define PHP_JSON_INVALID_UTF8_SUBSTITUTE (1<<21) #define PHP_JSON_INVALID_UTF8_SUBSTITUTE (1<<21)
#define PHP_JSON_THROW_ON_ERROR (1<<22) #define PHP_JSON_THROW_ON_ERROR (1<<22)
/* Internal flags */
#define PHP_JSON_OUTPUT_ARRAY 0
#define PHP_JSON_OUTPUT_OBJECT 1
/* default depth */ /* default depth */
#define PHP_JSON_PARSER_DEFAULT_DEPTH 512 #define PHP_JSON_PARSER_DEFAULT_DEPTH 512