summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryui-knk <spiketeika@gmail.com>2024-02-12 18:23:28 +0900
committerYuichiro Kaneko <spiketeika@gmail.com>2024-02-13 10:56:32 +0900
commit038189b61f60e27ea081817979cb7a043bcf5798 (patch)
tree0fbe47434ef5d4f9c751229c90f7642245ca908d
parent785aa47cd643a516f6aa524ee1488c5edb459dd1 (diff)
Use dedicated parser_string hash function
Define and use `rb_parser_str_hash` for `rb_parser_string_t` instead of `rb_str_hash` to remove dependency on `rb_str_hash`.
-rw-r--r--parse.y32
1 files changed, 29 insertions, 3 deletions
diff --git a/parse.y b/parse.y
index bcde8f5859..ae0ddb2960 100644
--- a/parse.y
+++ b/parse.y
@@ -208,6 +208,8 @@ node_cdhash_cmp(VALUE val, VALUE lit)
}
}
+static st_index_t rb_parser_str_hash(rb_parser_string_t *str);
+
static st_index_t
node_cdhash_hash(VALUE a)
{
@@ -231,15 +233,15 @@ node_cdhash_hash(VALUE a)
val = rb_node_imaginary_literal_val(node);
return rb_complex_hash(val);
case NODE_STR:
- return rb_str_hash(rb_node_str_string_val(node));
+ return rb_parser_str_hash(RNODE_STR(node)->string);
case NODE_SYM:
- return rb_node_sym_string_val(node);
+ return rb_parser_str_hash(RNODE_SYM(node)->string);
case NODE_LINE:
/* Same with NODE_INTEGER FIXNUM case */
return (st_index_t)node->nd_loc.beg_pos.lineno;
case NODE_FILE:
/* Same with NODE_STR */
- return rb_str_hash(rb_node_file_path_val(node));
+ return rb_parser_str_hash(RNODE_FILE(node)->path);
case NODE_ENCODING:
return rb_node_encoding_val(node);
default:
@@ -2138,6 +2140,24 @@ get_nd_args(struct parser_params *p, NODE *node)
return 0;
}
}
+
+static st_index_t
+djb2(const uint8_t *str, size_t len)
+{
+ st_index_t hash = 5381;
+
+ for (size_t i = 0; i < len; i++) {
+ hash = ((hash << 5) + hash) + str[i];
+ }
+
+ return hash;
+}
+
+static st_index_t
+parser_memhash(const void *ptr, long len)
+{
+ return djb2(ptr, len);
+}
#endif
#define PARSER_STRING_PTR(str) (str->ptr)
@@ -2196,6 +2216,12 @@ rb_parser_string_free(rb_parser_t *p, rb_parser_string_t *str)
}
#ifndef RIPPER
+static st_index_t
+rb_parser_str_hash(rb_parser_string_t *str)
+{
+ return parser_memhash((const void *)PARSER_STRING_PTR(str), PARSER_STRING_LEN(str));
+}
+
static size_t
rb_parser_str_capacity(rb_parser_string_t *str, const int termlen)
{