diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-01-17 16:48:18 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-01-17 16:48:18 +0000 |
commit | 4e5600e3ce0cb20041aa81cc466425127add825c (patch) | |
tree | 9ff39ed5170e7125138e2411df3b8b66b01cbdba /vm_insnhelper.c | |
parent | c5522a5278ac00b3f78ddfbe59c0d4d0d4842b59 (diff) | |
download | ruby-4e5600e3ce0cb20041aa81cc466425127add825c.tar.gz ruby-4e5600e3ce0cb20041aa81cc466425127add825c.tar.xz ruby-4e5600e3ce0cb20041aa81cc466425127add825c.zip |
* vm_insnhelper.c (vm_call_method): check argument number to
attr_reader. [ruby-core:15120]
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@15091 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_insnhelper.c')
-rw-r--r-- | vm_insnhelper.c | 58 |
1 files changed, 31 insertions, 27 deletions
diff --git a/vm_insnhelper.c b/vm_insnhelper.c index b091fef9f..12cc6278a 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -495,45 +495,49 @@ vm_call_method(rb_thread_t *th, rb_control_frame_t *cfp, switch (nd_type(node)) { case RUBY_VM_METHOD_NODE:{ - vm_setup_method(th, cfp, num, blockptr, flag, (VALUE)node->nd_body, recv, klass); - return Qundef; + vm_setup_method(th, cfp, num, blockptr, flag, (VALUE)node->nd_body, recv, klass); + return Qundef; } case NODE_CFUNC:{ - val = vm_call_cfunc(th, cfp, num, id, recv, mn->nd_clss, flag, node, blockptr); - break; + val = vm_call_cfunc(th, cfp, num, id, recv, mn->nd_clss, flag, node, blockptr); + break; } case NODE_ATTRSET:{ - val = rb_ivar_set(recv, node->nd_vid, *(cfp->sp - 1)); - cfp->sp -= 2; - break; + val = rb_ivar_set(recv, node->nd_vid, *(cfp->sp - 1)); + cfp->sp -= 2; + break; } case NODE_IVAR:{ - val = rb_ivar_get(recv, node->nd_vid); - cfp->sp -= 1; - break; + if (num != 0) { + rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)", + num); + } + val = rb_attr_get(recv, node->nd_vid); + cfp->sp -= 1; + break; } case NODE_BMETHOD:{ - VALUE *argv = cfp->sp - num; - val = vm_call_bmethod(th, id, node->nd_cval, recv, klass, num, argv, blockptr); - cfp->sp += - num - 1; - break; + VALUE *argv = cfp->sp - num; + val = vm_call_bmethod(th, id, node->nd_cval, recv, klass, num, argv, blockptr); + cfp->sp += - num - 1; + break; } case NODE_ZSUPER:{ - klass = RCLASS_SUPER(mn->nd_clss); - mn = rb_method_node(klass, id); - - if (mn != 0) { - goto normal_method_dispatch; - } - else { - goto start_method_dispatch; - } + klass = RCLASS_SUPER(mn->nd_clss); + mn = rb_method_node(klass, id); + + if (mn != 0) { + goto normal_method_dispatch; + } + else { + goto start_method_dispatch; + } } default:{ - printf("node: %s\n", ruby_node_name(nd_type(node))); - rb_bug("eval_invoke_method: unreachable"); - /* unreachable */ - break; + printf("node: %s\n", ruby_node_name(nd_type(node))); + rb_bug("eval_invoke_method: unreachable"); + /* unreachable */ + break; } } } |