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 + + * 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 * 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 }