diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2019-10-02 23:36:32 +0900 |
|---|---|---|
| committer | GitHub <[email protected]> | 2019-10-02 23:36:32 +0900 |
| commit | a406a35cf87e8d0d8cf8809c712e54973b133a55 (patch) | |
| tree | 655f51189945b4d9dde6a9f9fc721f68f8ea69e6 | |
| parent | c33100c4f03b5f0e8d9034a7b82fabb0975e9a5a (diff) | |
| parent | 855d996847cb33538a60bc02ecb1741670807711 (diff) | |
| download | mruby-a406a35cf87e8d0d8cf8809c712e54973b133a55.tar.gz mruby-a406a35cf87e8d0d8cf8809c712e54973b133a55.zip | |
Merge pull request #4747 from shuujii/avoid-symhash-call-for-inline-symbol-in-sym_intern
Avoid `symhash()` call for inline symbol in `sym_intern()`
| -rw-r--r-- | src/symbol.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/src/symbol.c b/src/symbol.c index a9bbdf67f..a4c453d32 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -124,15 +124,19 @@ symhash(const char *key, size_t len) } static mrb_sym -find_symbol(mrb_state *mrb, const char *name, uint16_t len, uint8_t hash) +find_symbol(mrb_state *mrb, const char *name, uint16_t len, uint8_t *hashp) { mrb_sym i; symbol_name *sname; + uint8_t hash; /* inline symbol */ i = sym_inline_pack(name, len); if (i > 0) return i; + hash = symhash(name, len); + if (hashp) *hashp = hash; + i = mrb->symhash[hash]; if (i == 0) return 0; do { @@ -164,8 +168,7 @@ sym_intern(mrb_state *mrb, const char *name, size_t len, mrb_bool lit) uint8_t hash; sym_validate_len(mrb, len); - hash = symhash(name, len); - sym = find_symbol(mrb, name, len, hash); + sym = find_symbol(mrb, name, len, &hash); if (sym > 0) return sym; /* registering a new symbol */ @@ -233,7 +236,7 @@ mrb_check_intern(mrb_state *mrb, const char *name, size_t len) mrb_sym sym; sym_validate_len(mrb, len); - sym = find_symbol(mrb, name, len, symhash(name, len)); + sym = find_symbol(mrb, name, len, NULL); if (sym > 0) return mrb_symbol_value(sym); return mrb_nil_value(); } |
