summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-11-23 14:59:28 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-11-23 14:59:28 +0000
commit6ead29d04466b6508ac03cd4edcd958e4e51ddf0 (patch)
tree1de8a0c49b0c7fe167b04c7f3a8b23889fc994f5
parent54090ad09b62d749bfbc4e7af2cb149e938366d9 (diff)
* eval.c (rb_method_missing): adjusted format and argument number.
* eval.c (rb_call): fixed for super in cached method. [ruby-dev:39757] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@25890 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog8
-rw-r--r--eval.c5
-rw-r--r--test/ruby/test_object.rb27
3 files changed, 38 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 85d184c129..8e67fff378 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Mon Nov 23 23:59:26 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * eval.c (rb_method_missing): adjusted format and argument number.
+
+ * eval.c (rb_call): fixed for super in cached method.
+ [ruby-dev:39757]
+n
+
Mon Nov 23 11:26:45 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
* dln.c (dln_find_1): removed duplication.
diff --git a/eval.c b/eval.c
index af98e6eee1..110a296ae8 100644
--- a/eval.c
+++ b/eval.c
@@ -5770,7 +5770,7 @@ rb_method_missing(argc, argv, obj)
exc = rb_eNameError;
}
else if (last_call_status & CSTAT_SUPER) {
- format = "super: no superclass method `%s'";
+ format = "super: no superclass method `%s' for %s";
}
if (!format) {
format = "undefined method `%s' for %s";
@@ -6220,13 +6220,14 @@ rb_call(klass, recv, mid, argc, argv, scope, self)
ent = cache + EXPR1(klass, mid);
if (ent->mid == mid && ent->klass == klass) {
if (!ent->method)
- return method_missing(recv, mid, argc, argv, scope==2?CSTAT_VCALL:0);
+ goto nomethod;
klass = ent->origin;
id = ent->mid0;
noex = ent->noex;
body = ent->method;
}
else if ((body = rb_get_method_body(&klass, &id, &noex)) == 0) {
+ nomethod:
if (scope == 3) {
return method_missing(recv, mid, argc, argv, CSTAT_SUPER);
}
diff --git a/test/ruby/test_object.rb b/test/ruby/test_object.rb
index 221d0256d5..b06cdd15f1 100644
--- a/test/ruby/test_object.rb
+++ b/test/ruby/test_object.rb
@@ -283,6 +283,33 @@ class TestObject < Test::Unit::TestCase
assert_raise(ArgumentError) { 1.send }
end
+ def test_no_superclass_method
+ o = Object.new
+ e = assert_raise(NoMethodError) {
+ o.method(:__send__).call(:never_defined_test_no_superclass_method)
+ }
+ m1 = e.message
+ assert_no_match(/no superclass method/, m1)
+ e = assert_raise(NoMethodError) {
+ o.method(:__send__).call(:never_defined_test_no_superclass_method)
+ }
+ assert_equal(m1, e.message)
+ e = assert_raise(NoMethodError) {
+ o.never_defined_test_no_superclass_method
+ }
+ assert_equal(m1, e.message)
+ end
+
+ def test_superclass_method
+ o = Object.new
+ def o.foo; super; end
+ e = assert_raise(NoMethodError) {o.foo}
+ m1 = e.message
+ assert_match(/no superclass method/, m1)
+ e = assert_raise(NoMethodError) {o.foo}
+ assert_equal(m1, e.message)
+ end
+
def test_specific_eval_with_wrong_arguments
assert_raise(ArgumentError) do
1.instance_eval("foo") { foo }