summaryrefslogtreecommitdiff
path: root/vm_method.c
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2025-01-14 17:40:39 -0800
committerTakashi Kokubun <takashikkbn@gmail.com>2025-01-14 17:40:39 -0800
commit42f043c1893b320b9d2a38ec3b1065dee71ce863 (patch)
tree64828ff3089e2512642203da5fb96662b77b34ab /vm_method.c
parent233014639793cb6c8650a9b17d37bc09c662d430 (diff)
merge revision(s) 56ecc243e230e8e99761ec0ffc5116601f094bb0: [Backport #20868]
[Bug #20868] Fix Method#hash to not change after compaction The hash value of a Method must remain constant after a compaction, otherwise it may not work as the key in a hash table. For example: def a; end # Need this method here because otherwise the iseq may be on the C stack # which would get pinned and not move during compaction def get_hash method(:a).hash end puts get_hash # => 2993401401091578131 GC.verify_compaction_references(expand_heap: true, toward: :empty) puts get_hash # => -2162775864511574135
Diffstat (limited to 'vm_method.c')
-rw-r--r--vm_method.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/vm_method.c b/vm_method.c
index 232ba03e61..7b57b56cd6 100644
--- a/vm_method.c
+++ b/vm_method.c
@@ -2237,7 +2237,7 @@ rb_hash_method_definition(st_index_t hash, const rb_method_definition_t *def)
switch (def->type) {
case VM_METHOD_TYPE_ISEQ:
- return rb_hash_uint(hash, (st_index_t)def->body.iseq.iseqptr);
+ return rb_hash_uint(hash, (st_index_t)def->body.iseq.iseqptr->body);
case VM_METHOD_TYPE_CFUNC:
hash = rb_hash_uint(hash, (st_index_t)def->body.cfunc.func);
return rb_hash_uint(hash, def->body.cfunc.argc);