summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2019-10-02 23:36:32 +0900
committerGitHub <[email protected]>2019-10-02 23:36:32 +0900
commita406a35cf87e8d0d8cf8809c712e54973b133a55 (patch)
tree655f51189945b4d9dde6a9f9fc721f68f8ea69e6
parentc33100c4f03b5f0e8d9034a7b82fabb0975e9a5a (diff)
parent855d996847cb33538a60bc02ecb1741670807711 (diff)
downloadmruby-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.c11
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();
}