diff options
author | Bob Weinand <bobwei9@hotmail.com> | 2015-08-01 18:20:26 +0200 |
---|---|---|
committer | Bob Weinand <bobwei9@hotmail.com> | 2015-08-01 18:23:00 +0200 |
commit | 351b4e8015a45de1abb64bc5acd77ae0d7fbe92d (patch) | |
tree | 7aa06cc40564e5ff6bc06f2e62ff16aabe1e6d61 /sapi/phpdbg/phpdbg_btree.c | |
parent | f7c2128702c16777445e8c6b5ae856656bb47939 (diff) | |
download | php-git-351b4e8015a45de1abb64bc5acd77ae0d7fbe92d.tar.gz |
Optimize btree/find_closest a bit
Diffstat (limited to 'sapi/phpdbg/phpdbg_btree.c')
-rw-r--r-- | sapi/phpdbg/phpdbg_btree.c | 55 |
1 files changed, 29 insertions, 26 deletions
diff --git a/sapi/phpdbg/phpdbg_btree.c b/sapi/phpdbg/phpdbg_btree.c index 2311f05126..99ea7c0a0f 100644 --- a/sapi/phpdbg/phpdbg_btree.c +++ b/sapi/phpdbg/phpdbg_btree.c @@ -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--); |