diff options
author | Sverker Eriksson <[email protected]> | 2018-10-19 17:40:21 +0200 |
---|---|---|
committer | Sverker Eriksson <[email protected]> | 2018-10-23 12:36:29 +0200 |
commit | be9fd1bfaa30ba25b6d3a3a39159c81172964010 (patch) | |
tree | e84c7bb37b7fbbda0051908819fa03984f1bcf9e /erts | |
parent | 43499e6ab183a44a979d4fb5c80b5a3603e1bbd9 (diff) | |
download | otp-be9fd1bfaa30ba25b6d3a3a39159c81172964010.tar.gz otp-be9fd1bfaa30ba25b6d3a3a39159c81172964010.tar.bz2 otp-be9fd1bfaa30ba25b6d3a3a39159c81172964010.zip |
erts: Fix slot bug in find_next/prev
Diffstat (limited to 'erts')
-rw-r--r-- | erts/emulator/beam/erl_db_tree.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/erts/emulator/beam/erl_db_tree.c b/erts/emulator/beam/erl_db_tree.c index 854b8d6329..f5fac9dcb6 100644 --- a/erts/emulator/beam/erl_db_tree.c +++ b/erts/emulator/beam/erl_db_tree.c @@ -2872,7 +2872,7 @@ static TreeDbTerm *find_next(DbTableCommon *tb, TreeDbTerm *root, this = this->right; } else if (c < 0) { if (this->left == NULL) /* Done */ - return this; + goto found_next; else this = this->left; } else @@ -2887,8 +2887,6 @@ static TreeDbTerm *find_next(DbTableCommon *tb, TreeDbTerm *root, this = this->left; PUSH_NODE(stack, this); } - if (stack->slot > 0) - ++(stack->slot); } else { do { tmp = POP_NODE(stack); @@ -2897,9 +2895,12 @@ static TreeDbTerm *find_next(DbTableCommon *tb, TreeDbTerm *root, return NULL; } } while (this->right == tmp); - if (stack->slot > 0) - ++(stack->slot); } + +found_next: + if (stack->slot > 0) + ++(stack->slot); + return this; } @@ -2929,7 +2930,7 @@ static TreeDbTerm *find_prev(DbTableCommon *tb, TreeDbTerm *root, this = this->left; } else if (c > 0) { if (this->right == NULL) /* Done */ - return this; + goto found_prev; else this = this->right; } else @@ -2944,8 +2945,6 @@ static TreeDbTerm *find_prev(DbTableCommon *tb, TreeDbTerm *root, this = this->right; PUSH_NODE(stack, this); } - if (stack->slot > 0) - --(stack->slot); } else { do { tmp = POP_NODE(stack); @@ -2954,9 +2953,12 @@ static TreeDbTerm *find_prev(DbTableCommon *tb, TreeDbTerm *root, return NULL; } } while (this->left == tmp); - if (stack->slot > 0) - --(stack->slot); } + +found_prev: + if (stack->slot > 0) + --(stack->slot); + return this; } |