summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--insns.def7
-rw-r--r--test/ruby/test_module.rb11
-rw-r--r--vm_insnhelper.c11
3 files changed, 20 insertions, 9 deletions
diff --git a/insns.def b/insns.def
index fb5e83c..2c1f7d3 100644
--- a/insns.def
+++ b/insns.def
@@ -951,10 +951,13 @@ getinlinecache
()
(VALUE val)
{
- val = vm_ic_hit_p(ic, GET_EP());
- if (val != Qnil) {
+ if (vm_ic_hit_p(ic, GET_EP())) {
+ val = ic->ic_value.value;
JUMP(dst);
}
+ else {
+ val = Qnil;
+ }
}
/* set inline cache */
diff --git a/test/ruby/test_module.rb b/test/ruby/test_module.rb
index 9980844..1b04b95 100644
--- a/test/ruby/test_module.rb
+++ b/test/ruby/test_module.rb
@@ -1429,6 +1429,17 @@ class TestModule < Test::Unit::TestCase
assert_warn(/deprecated/, bug12382) {c.class_eval "FOO"}
end
+ NIL = nil
+ FALSE = false
+ deprecate_constant(:NIL, :FALSE)
+
+ def test_deprecate_nil_constant
+ w = EnvUtil.verbose_warning {2.times {FALSE}}
+ assert_equal(1, w.scan("::FALSE").size, w)
+ w = EnvUtil.verbose_warning {2.times {NIL}}
+ assert_equal(1, w.scan("::NIL").size, w)
+ end
+
def test_constants_with_private_constant
assert_not_include(::TestModule.constants, :PrivateClass)
assert_not_include(::TestModule.constants(true), :PrivateClass)
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index c14f05e..a0f63df 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -3265,16 +3265,13 @@ vm_opt_newarray_min(rb_num_t num, const VALUE *ptr)
#undef id_cmp
-static VALUE
+static int
vm_ic_hit_p(IC ic, const VALUE *reg_ep)
{
- if (ic->ic_serial == GET_GLOBAL_CONSTANT_STATE() &&
- (ic->ic_cref == NULL || ic->ic_cref == rb_vm_get_cref(reg_ep))) {
- return ic->ic_value.value;
- }
- else {
- return Qnil;
+ if (ic->ic_serial == GET_GLOBAL_CONSTANT_STATE()) {
+ return (ic->ic_cref == NULL || ic->ic_cref == rb_vm_get_cref(reg_ep));
}
+ return FALSE;
}
static void