path: root/vm_args.c
diff options
authorYusuke Endoh <>2019-12-09 15:22:48 +0900
committerYusuke Endoh <>2019-12-09 15:22:48 +0900
commit156fb72d7015b420c57b0bd230693f52d8d75b32 (patch)
tree8f4263c1a1a317e95f99419de4481512d2c151aa /vm_args.c
parent07664f3aec1b80f6ffe3929258c9a246f0bdcc48 (diff)
vm_args.c (rb_warn_check): Use iseq_unique_id instead of its pointer
(This is the second try of 036bc1da6c6c9b0fa9b7f5968d897a9554dd770e.) If iseq is GC'ed, the pointer of iseq may be reused, which may hide a deprecation warning of keyword argument change. ``` 1) Failure: TestKeywordArguments#test_explicit_super_kwsplat [/tmp/ruby/v2/src/trunk-test1/test/ruby/test_keyword.rb:549]: --- expected +++ actual @@ -1 +1 @@ -/The keyword argument is passed as the last hash parameter.* for `m'/m +"" ``` This change ad-hocly adds iseq_unique_id for each iseq, and use it instead of iseq pointer. This covers the case where caller is GC'ed. Still, the case where callee is GC'ed, is not covered. But anyway, it is very rare that iseq is GC'ed. Even when it occurs, it just hides some warnings. It's no big deal.
Diffstat (limited to 'vm_args.c')
1 files changed, 5 insertions, 1 deletions
diff --git a/vm_args.c b/vm_args.c
index 97b1d4ac60..c6c111865e 100644
--- a/vm_args.c
+++ b/vm_args.c
@@ -593,8 +593,12 @@ VALUE rb_iseq_location(const rb_iseq_t *iseq);
static st_table *caller_to_callees = 0;
-static VALUE rb_warn_check(const rb_execution_context_t * const ec, const void *const callee)
+static VALUE rb_warn_check(const rb_execution_context_t * const ec, const rb_iseq_t *const iseq)
+ if (!iseq) return 0;
+ const void *const callee = (void *)(iseq->body->iseq_unique_id * 2);
const rb_control_frame_t * const cfp = rb_vm_get_ruby_level_next_cfp(ec, ec->cfp);
if (!cfp) return 0;