summaryrefslogtreecommitdiffhomepage
path: root/src/symbol.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2020-04-27 07:58:33 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2020-10-12 16:20:42 +0900
commitd2cab16301ecabbe67886051d4c777a73de6d327 (patch)
treee5d5f6e915cc967f8f178a03b1c51f13dc6c39d2 /src/symbol.c
parenteddd3249793b3b307da2fe7734d5923cd238a35b (diff)
downloadmruby-d2cab16301ecabbe67886051d4c777a73de6d327.tar.gz
mruby-d2cab16301ecabbe67886051d4c777a73de6d327.zip
Update `presym_find` to use more efficient binary search.
Diffstat (limited to 'src/symbol.c')
-rw-r--r--src/symbol.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/src/symbol.c b/src/symbol.c
index a09298b23..8a98e9e2e 100644
--- a/src/symbol.c
+++ b/src/symbol.c
@@ -26,13 +26,20 @@ static const char *presym_table[] = {
static mrb_sym
presym_find(const char *name)
{
- /* use linear search for now */
- /* binary search should work better */
- int i;
-
- for (i=0; presym_table[i]; i++) {
- if (strcmp(presym_table[i], name)==0)
- return i+1;
+ int start = 0;
+ int end = MRB_PRESYM_MAX-1;
+
+ while (start<=end) {
+ int mid = (start+end)/2;
+ int cmp = strcmp(name, presym_table[mid]);
+
+ if (cmp == 0) {
+ return mid+1;
+ } else if (cmp < 0) {
+ end = mid-1;
+ } else {
+ start = mid+1;
+ }
}
return 0;
}