summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-11-01 13:04:35 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-11-01 13:04:35 +0000
commit9974cb96d3c2ca18ab27aa37081fa4a8b37cb074 (patch)
tree8e3ffba4898afc1d4b9f82162d46157d0cf0a93f /eval.c
parentcc1b72bc22453ac85b9308eb1c0e985b6e53cb7a (diff)
* eval.c (rb_call_super): should call method_missing if super is
called from Kernel method. * eval.c (exec_under): frame during eval should preserve external information. * configure.in: use proper option for Sun linker. A patch from Shinya Kuwamura <kuwa@labs.fujitsu.com>. [ruby-dev:27603] * numeric.c (fix_rshift): RDoc fix. [ruby-core:6351] * util.h (strtod): add #undef for platforms defines strtod() macro. [ruby-dev:27563] * ext/etc/etc.c: document update from mathew <meta@pobox.com>. [ruby-core:06473] * ext/fcntl/fcntl.c: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9490 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/eval.c b/eval.c
index 5932a1bba3..d5048d9465 100644
--- a/eval.c
+++ b/eval.c
@@ -5914,6 +5914,9 @@ rb_call_super(int argc, const VALUE *argv)
self = ruby_frame->self;
klass = ruby_frame->this_class;
+ if (RCLASS(klass)->super == 0) {
+ return method_missing(self, ruby_frame->this_func, argc, argv, CSTAT_SUPER);
+ }
PUSH_ITER(ruby_iter->iter ? ITER_PRE : ITER_NOT);
result = rb_call(RCLASS(klass)->super, self, ruby_frame->this_func, argc, argv, 3);
@@ -6256,14 +6259,15 @@ exec_under(VALUE (*func) (VALUE), VALUE under, VALUE cbase, VALUE args)
VALUE val = Qnil; /* OK */
int state;
int mode;
+ struct FRAME *f = ruby_frame->prev;
PUSH_CLASS(under);
PUSH_FRAME();
- ruby_frame->self = _frame.prev->self;
- ruby_frame->callee = _frame.prev->callee;
- ruby_frame->this_func = _frame.prev->this_func;
- ruby_frame->this_class = _frame.prev->this_class;
- ruby_frame->argc = _frame.prev->argc;
+ ruby_frame->self = f->self;
+ ruby_frame->callee = f->callee;
+ ruby_frame->this_func = f->this_func;
+ ruby_frame->this_class = f->this_class;
+ ruby_frame->argc = f->argc;
if (cbase) {
PUSH_CREF(cbase);
}