diff options
Diffstat (limited to 'sapi/phpdbg/phpdbg_btree.c')
-rw-r--r-- | sapi/phpdbg/phpdbg_btree.c | 72 |
1 files changed, 45 insertions, 27 deletions
diff --git a/sapi/phpdbg/phpdbg_btree.c b/sapi/phpdbg/phpdbg_btree.c index 2c56ab2417..9e7dc86e8e 100644 --- a/sapi/phpdbg/phpdbg_btree.c +++ b/sapi/phpdbg/phpdbg_btree.c @@ -1,6 +1,6 @@ /* +----------------------------------------------------------------------+ - | PHP Version 5 | + | PHP Version 7 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2016 The PHP Group | +----------------------------------------------------------------------+ @@ -66,7 +66,6 @@ phpdbg_btree_result *phpdbg_btree_find(phpdbg_btree *tree, zend_ulong idx) { phpdbg_btree_result *phpdbg_btree_find_closest(phpdbg_btree *tree, zend_ulong idx) { phpdbg_btree_branch *branch = tree->branch; int i = tree->depth - 1, last_superior_i = -1; - zend_bool had_alternative_branch = 0; if (branch == NULL) { return NULL; @@ -74,30 +73,33 @@ phpdbg_btree_result *phpdbg_btree_find_closest(phpdbg_btree *tree, zend_ulong id /* find nearest watchpoint */ do { - /* an impossible branch was found if: */ - if (!had_alternative_branch && (idx >> i) % 2 == 0 && !branch->branches[0]) { - /* there's no lower branch than idx */ - if (last_superior_i == -1) { - /* failure */ - return NULL; - } - /* reset state */ - branch = tree->branch; - i = tree->depth - 1; - /* follow branch according to bits in idx until the last lower branch before the impossible branch */ - do { - CHOOSE_BRANCH((idx >> i) % 2 == 1 && branch->branches[1]); - } while (--i > last_superior_i); - /* use now the lower branch of which we can be sure that it contains only branches lower than idx */ - CHOOSE_BRANCH(0); - /* and choose the highest possible branch in the branch containing only branches lower than idx */ - while (i--) { - CHOOSE_BRANCH(branch->branches[1]); + if ((idx >> i) % 2 == 0) { + if (branch->branches[0]) { + CHOOSE_BRANCH(0); + /* an impossible branch was found if: */ + } else { + /* there's no lower branch than idx */ + if (last_superior_i == -1) { + /* failure */ + return NULL; + } + /* reset state */ + branch = tree->branch; + i = tree->depth - 1; + /* follow branch according to bits in idx until the last lower branch before the impossible branch */ + do { + CHOOSE_BRANCH((idx >> i) % 2 == 1 && branch->branches[1]); + } while (--i > last_superior_i); + /* use now the lower branch of which we can be sure that it contains only branches lower than idx */ + CHOOSE_BRANCH(0); + /* and choose the highest possible branch in the branch containing only branches lower than idx */ + while (i--) { + CHOOSE_BRANCH(branch->branches[1]); + } + break; } - break; - } /* follow branch according to bits in idx until having found an impossible branch */ - if (had_alternative_branch || (idx >> i) % 2 == 1) { + } else { if (branch->branches[1]) { if (branch->branches[0]) { last_superior_i = i; @@ -105,10 +107,11 @@ phpdbg_btree_result *phpdbg_btree_find_closest(phpdbg_btree *tree, zend_ulong id CHOOSE_BRANCH(1); } else { CHOOSE_BRANCH(0); - had_alternative_branch = 1; + while (i--) { + CHOOSE_BRANCH(branch->branches[1]); + } + break; } - } else { - CHOOSE_BRANCH(0); } } while (i--); @@ -219,3 +222,18 @@ check_branch_existence: return SUCCESS; } + +void phpdbg_btree_branch_dump(phpdbg_btree_branch *branch, zend_ulong depth) { + if (branch) { + if (depth--) { + phpdbg_btree_branch_dump(branch->branches[0], depth); + phpdbg_btree_branch_dump(branch->branches[1], depth); + } else { + fprintf(stderr, "%p: %p\n", (void *) branch->result.idx, branch->result.ptr); + } + } +} + +void phpdbg_btree_dump(phpdbg_btree *tree) { + phpdbg_btree_branch_dump(tree->branch, tree->depth); +} |