diff options
author | Dmitry Stogov <dmitry@zend.com> | 2017-10-06 01:34:50 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2017-10-06 01:34:50 +0300 |
commit | cb9d81ef4f07f82835273800b0cb3d6a67816050 (patch) | |
tree | dad640422674e3eb45a2577f5b29fcd7ad9c8676 /sapi/phpdbg/phpdbg_utils.c | |
parent | 39ea632f7468e1001b15b9c43afc6aba9debdc9c (diff) | |
download | php-git-cb9d81ef4f07f82835273800b0cb3d6a67816050.tar.gz |
Refactored recursion pretection
Diffstat (limited to 'sapi/phpdbg/phpdbg_utils.c')
-rw-r--r-- | sapi/phpdbg/phpdbg_utils.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/sapi/phpdbg/phpdbg_utils.c b/sapi/phpdbg/phpdbg_utils.c index 9326b79b6c..bdcb173c24 100644 --- a/sapi/phpdbg/phpdbg_utils.c +++ b/sapi/phpdbg/phpdbg_utils.c @@ -687,10 +687,12 @@ PHPDBG_API void phpdbg_xml_var_dump(zval *zv) { break; case IS_ARRAY: myht = Z_ARRVAL_P(zv); - if (ZEND_HASH_APPLY_PROTECTION(myht) && ++myht->u.v.nApplyCount > 1) { - phpdbg_xml("<recursion />"); - --myht->u.v.nApplyCount; - break; + if (!(GC_FLAGS(myht) & GC_IMMUTABLE)) { + if (GC_IS_RECURSIVE(myht)) { + phpdbg_xml("<recursion />"); + break; + } + GC_PROTECT_RECURSION(myht); } phpdbg_xml("<array refstatus=\"%s\" num=\"%d\">", COMMON, zend_hash_num_elements(myht)); element_dump_func = phpdbg_xml_array_element_dump; @@ -698,9 +700,8 @@ PHPDBG_API void phpdbg_xml_var_dump(zval *zv) { goto head_done; case IS_OBJECT: myht = Z_OBJDEBUG_P(zv, is_temp); - if (myht && ++myht->u.v.nApplyCount > 1) { + if (myht && GC_IS_RECURSIVE(myht)) { phpdbg_xml("<recursion />"); - --myht->u.v.nApplyCount; break; } @@ -715,7 +716,7 @@ head_done: element_dump_func(val, key, num); } ZEND_HASH_FOREACH_END(); zend_hash_apply_with_arguments(myht, (apply_func_args_t) element_dump_func, 0); - --myht->u.v.nApplyCount; + GC_UNPROTECT_RECURSION(myht); if (is_temp) { zend_hash_destroy(myht); efree(myht); |