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--); | 
