diff options
| author | yui-knk <spiketeika@gmail.com> | 2024-02-12 18:23:28 +0900 |
|---|---|---|
| committer | Yuichiro Kaneko <spiketeika@gmail.com> | 2024-02-13 10:56:32 +0900 |
| commit | 038189b61f60e27ea081817979cb7a043bcf5798 (patch) | |
| tree | 0fbe47434ef5d4f9c751229c90f7642245ca908d | |
| parent | 785aa47cd643a516f6aa524ee1488c5edb459dd1 (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.y | 32 |
1 files changed, 29 insertions, 3 deletions
@@ -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) { |
