diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-04-24 10:53:27 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-10-12 16:20:41 +0900 |
| commit | a476d7114334b926d676faefb43a01ca617b552e (patch) | |
| tree | 46b0efc761689b2bb401275c651ef28a5be6326d /src | |
| parent | 1e156974d5b717d84e5a35ec5e611206de653602 (diff) | |
| download | mruby-a476d7114334b926d676faefb43a01ca617b552e.tar.gz mruby-a476d7114334b926d676faefb43a01ca617b552e.zip | |
Support `presym` in `symbol.c`.
Diffstat (limited to 'src')
| -rw-r--r-- | src/symbol.c | 48 |
1 files changed, 46 insertions, 2 deletions
diff --git a/src/symbol.c b/src/symbol.c index 992848797..a78dd5f4c 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -12,6 +12,36 @@ #include <mruby/dump.h> #include <mruby/class.h> +#undef MRB_PRESYM_MAX +#define MRB_PRESYM_CSYM(sym, num) #sym, +#define MRB_PRESYM_SYM(sym, num) #sym, + +static const char *presym_table[] = { +#include <../build/presym.inc> + NULL +}; + +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; + } + return 0; +} + +static const char* +presym_sym2name(mrb_sym sym) +{ + if (sym > MRB_PRESYM_MAX) return NULL; + return presym_table[sym-1]; +} + /* ------------------------------------------------------ */ typedef struct symbol_name { mrb_bool lit : 1; @@ -130,6 +160,11 @@ find_symbol(mrb_state *mrb, const char *name, size_t len, uint8_t *hashp) symbol_name *sname; uint8_t hash; + /* presym */ + if (strlen(name) == len) { + i = presym_find(name); + if (i > 0) return i<<SYMBOL_NORMAL_SHIFT; + } /* inline symbol */ i = sym_inline_pack(name, len); if (i > 0) return i; @@ -142,7 +177,7 @@ find_symbol(mrb_state *mrb, const char *name, size_t len, uint8_t *hashp) do { sname = &mrb->symtbl[i]; if (sname->len == len && memcmp(sname->name, name, len) == 0) { - return i<<SYMBOL_NORMAL_SHIFT; + return (i+MRB_PRESYM_MAX)<<SYMBOL_NORMAL_SHIFT; } if (sname->prev == 0xff) { i -= 0xff; @@ -205,7 +240,7 @@ sym_intern(mrb_state *mrb, const char *name, size_t len, mrb_bool lit) } mrb->symhash[hash] = mrb->symidx = sym; - return sym<<SYMBOL_NORMAL_SHIFT; + return (sym+MRB_PRESYM_MAX)<<SYMBOL_NORMAL_SHIFT; } MRB_API mrb_sym @@ -261,6 +296,15 @@ sym2name_len(mrb_state *mrb, mrb_sym sym, char *buf, mrb_int *lenp) if (SYMBOL_INLINE_P(sym)) return sym_inline_unpack(sym, buf, lenp); sym >>= SYMBOL_NORMAL_SHIFT; + { + const char *name = presym_sym2name(sym); + if (name) { + if (lenp) *lenp = strlen(name); + return name; + } + } + sym -= MRB_PRESYM_MAX; + if (sym == 0 || mrb->symidx < sym) { if (lenp) *lenp = 0; return NULL; |
