Skip to content

Commit e6fb2ba

Browse files
committed
Fix dumping of protected/private hooks
The name was mangled, so unfortunately we need an allocation. It would probably make sense to store the unmangled name in the property_info at this point, since the name is interned anyway.
1 parent 63be66b commit e6fb2ba

File tree

4 files changed

+42
-33
lines changed

4 files changed

+42
-33
lines changed

Zend/tests/property_hooks/dump.phpt

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,8 @@ array(3) {
8888
'addedHooks' => 'addedHooks',
8989
'virtual' => 'VIRTUAL',
9090
'backed' => 'BACKED',
91-
'private' => NULL,
92-
'changed' => NULL,
91+
'private' => 'PRIVATE',
92+
'changed' => 'CHANGED TEST',
9393
))
9494
{"addedHooks":"addedHooks","virtual":"VIRTUAL","backed":"BACKED"}
9595
array(4) {
@@ -124,10 +124,10 @@ array(3) {
124124
}
125125
\Child::__set_state(array(
126126
'addedHooks' => 'ADDEDHOOKS',
127-
'changed' => NULL,
127+
'changed' => 'CHANGED CHILD',
128128
'virtual' => 'VIRTUAL',
129129
'backed' => 'BACKED',
130-
'private' => NULL,
130+
'private' => 'PRIVATE',
131131
'changed' => 'changed Child',
132132
))
133133
{"addedHooks":"ADDEDHOOKS","virtual":"VIRTUAL","backed":"BACKED"}
@@ -162,6 +162,8 @@ array(4) {
162162
string(7) "VIRTUAL"
163163
["backed"]=>
164164
string(6) "BACKED"
165+
["private"]=>
166+
string(7) "PRIVATE"
165167
}
166168
array(5) {
167169
["addedHooks"]=>
@@ -177,10 +179,10 @@ array(5) {
177179
}
178180
\Child::__set_state(array(
179181
'addedHooks' => 'ADDEDHOOKS',
180-
'changed' => NULL,
182+
'changed' => 'CHANGED CHILD',
181183
'virtual' => 'VIRTUAL',
182184
'backed' => 'BACKED',
183-
'private' => NULL,
185+
'private' => 'PRIVATE',
184186
'changed' => 'changed Child',
185187
))
186188
{"addedHooks":"ADDEDHOOKS","virtual":"VIRTUAL","backed":"BACKED"}
@@ -211,6 +213,8 @@ object(Child)#%d (5) {
211213
array(5) {
212214
["addedHooks"]=>
213215
string(10) "ADDEDHOOKS"
216+
["changed"]=>
217+
string(13) "CHANGED CHILD"
214218
["virtual"]=>
215219
string(7) "VIRTUAL"
216220
["backed"]=>
@@ -220,10 +224,10 @@ array(5) {
220224
}
221225
\Child::__set_state(array(
222226
'addedHooks' => 'ADDEDHOOKS',
223-
'changed' => NULL,
227+
'changed' => 'CHANGED CHILD',
224228
'virtual' => 'VIRTUAL',
225229
'backed' => 'BACKED',
226-
'private' => NULL,
230+
'private' => 'PRIVATE',
227231
'changed' => 'changed Child',
228232
))
229233
{"addedHooks":"ADDEDHOOKS","virtual":"VIRTUAL","backed":"BACKED"}

Zend/zend_builtin_functions.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -810,7 +810,10 @@ ZEND_FUNCTION(get_object_vars)
810810
if ((prop_info->flags & ZEND_ACC_VIRTUAL) && !prop_info->hooks[ZEND_PROPERTY_HOOK_GET]) {
811811
continue;
812812
}
813-
zend_read_property_ex(prop_info->ce, zobj, prop_info->name, /* silent */ true, &tmp);
813+
const char *unmangled_name_cstr = zend_get_unmangled_property_name(prop_info->name);
814+
zend_string *unmangled_name = zend_string_init(unmangled_name_cstr, strlen(unmangled_name_cstr), false);
815+
zend_read_property_ex(prop_info->ce, zobj, unmangled_name, /* silent */ true, &tmp);
816+
zend_string_release_ex(unmangled_name, false);
814817
if (EG(exception)) {
815818
zend_release_properties(properties);
816819
zval_ptr_dtor(return_value);

ext/json/json_encoder.c

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -237,33 +237,12 @@ static zend_result php_json_encode_array(smart_str *buf, zval *val, int options,
237237
zend_ulong index;
238238

239239
ZEND_HASH_FOREACH_KEY_VAL_IND(myht, index, key, data) {
240-
if (r == PHP_JSON_OUTPUT_OBJECT
241-
&& key
242-
&& ZSTR_VAL(key)[0] == '\0'
243-
&& ZSTR_LEN(key) > 0
244-
&& Z_TYPE_P(val) == IS_OBJECT) {
245-
/* Skip protected and private members. */
246-
continue;
247-
}
248-
249-
/* data is IS_PTR for properties with hooks. */
250240
zval tmp;
251241
ZVAL_UNDEF(&tmp);
252-
if (UNEXPECTED(Z_TYPE_P(data) == IS_PTR)) {
253-
zend_property_info *prop_info = Z_PTR_P(data);
254-
if ((prop_info->flags & ZEND_ACC_VIRTUAL) && !prop_info->hooks[ZEND_PROPERTY_HOOK_GET]) {
255-
continue;
256-
}
257-
zend_read_property_ex(prop_info->ce, Z_OBJ_P(val), prop_info->name, /* silent */ true, &tmp);
258-
if (EG(exception)) {
259-
PHP_JSON_HASH_UNPROTECT_RECURSION(recursion_rc);
260-
zend_release_properties(prop_ht);
261-
return FAILURE;
262-
}
263-
data = &tmp;
264-
}
265242

266243
if (r == PHP_JSON_OUTPUT_ARRAY) {
244+
ZEND_ASSERT(Z_TYPE_P(data) != IS_PTR);
245+
267246
if (need_comma) {
268247
smart_str_appendc(buf, ',');
269248
} else {
@@ -274,6 +253,26 @@ static zend_result php_json_encode_array(smart_str *buf, zval *val, int options,
274253
php_json_pretty_print_indent(buf, options, encoder);
275254
} else if (r == PHP_JSON_OUTPUT_OBJECT) {
276255
if (key) {
256+
if (ZSTR_VAL(key)[0] == '\0' && ZSTR_LEN(key) > 0 && Z_TYPE_P(val) == IS_OBJECT) {
257+
/* Skip protected and private members. */
258+
continue;
259+
}
260+
261+
/* data is IS_PTR for properties with hooks. */
262+
if (UNEXPECTED(Z_TYPE_P(data) == IS_PTR)) {
263+
zend_property_info *prop_info = Z_PTR_P(data);
264+
if ((prop_info->flags & ZEND_ACC_VIRTUAL) && !prop_info->hooks[ZEND_PROPERTY_HOOK_GET]) {
265+
continue;
266+
}
267+
zend_read_property_ex(prop_info->ce, Z_OBJ_P(val), prop_info->name, /* silent */ true, &tmp);
268+
if (EG(exception)) {
269+
PHP_JSON_HASH_UNPROTECT_RECURSION(recursion_rc);
270+
zend_release_properties(prop_ht);
271+
return FAILURE;
272+
}
273+
data = &tmp;
274+
}
275+
277276
if (need_comma) {
278277
smart_str_appendc(buf, ',');
279278
} else {

ext/standard/var.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,10 @@ PHPAPI zend_result php_var_export_ex(zval *struc, int level, smart_str *buf) /*
617617
if ((prop_info->flags & ZEND_ACC_VIRTUAL) && !prop_info->hooks[ZEND_PROPERTY_HOOK_GET]) {
618618
continue;
619619
}
620-
val = zend_read_property_ex(prop_info->ce, zobj, prop_info->name, /* silent */ true, &tmp);
620+
const char *unmangled_name_cstr = zend_get_unmangled_property_name(prop_info->name);
621+
zend_string *unmangled_name = zend_string_init(unmangled_name_cstr, strlen(unmangled_name_cstr), false);
622+
val = zend_read_property_ex(prop_info->ce, zobj, unmangled_name, /* silent */ true, &tmp);
623+
zend_string_release_ex(unmangled_name, false);
621624
if (EG(exception)) {
622625
ZEND_GUARD_OR_GC_UNPROTECT_RECURSION(guard, EXPORT, zobj);
623626
zend_release_properties(myht);

0 commit comments

Comments
 (0)