summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-08-06 02:34:36 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-08-06 02:34:36 +0000
commitcc48423ead1d9e4b46dfeca7a45437793fc29521 (patch)
tree6fd5743695eeb2d7c0323e10938867ca60b68fe1
parent7c5336b8f9f2e012194aed09658fdbeb3d6fe3de (diff)
insns.def: use klass in cfp
* insns.def (defined): now should use klass in the current control frame to search superclass, not me->klass. reported by naruse. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36637 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--insns.def2
-rw-r--r--test/ruby/test_defined.rb18
3 files changed, 24 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 922490c938..f753bb83b9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Mon Aug 6 11:34:33 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * insns.def (defined): now should use klass in the current control
+ frame to search superclass, not me->klass. reported by naruse.
+
Mon Aug 6 11:19:19 2012 NAKAMURA Usaku <usa@ruby-lang.org>
* test/etc/test_etc.rb (TestEtc#test_getpwuid): `s' is never set to nil.
diff --git a/insns.def b/insns.def
index fd102a63f5..7b17b42579 100644
--- a/insns.def
+++ b/insns.def
@@ -828,7 +828,7 @@ defined
case DEFINED_ZSUPER:{
const rb_method_entry_t *me = GET_CFP()->me;
if (me) {
- VALUE klass = vm_search_normal_superclass(me->klass);
+ VALUE klass = vm_search_normal_superclass(GET_CFP()->klass);
ID id = me->def ? me->def->original_id : me->called_id;
if (rb_method_boundp(klass, id, 0)) {
expr_type = "super";
diff --git a/test/ruby/test_defined.rb b/test/ruby/test_defined.rb
index 99c866fc2d..c02d1376b2 100644
--- a/test/ruby/test_defined.rb
+++ b/test/ruby/test_defined.rb
@@ -152,4 +152,22 @@ class TestDefined < Test::Unit::TestCase
assert_equal("super", aa.f, bug6644)
assert_nil(a.f, bug6644)
end
+
+ def test_super_in_included_method
+ c0 = Class.new do
+ def m
+ end
+ end
+ m1 = Module.new do
+ def m
+ defined?(super)
+ end
+ end
+ c = Class.new(c0) do include m1
+ def m
+ super
+ end
+ end
+ assert_equal("super", c.new.m)
+ end
end