summaryrefslogtreecommitdiff
path: root/vm_eval.c
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-10-23 20:34:25 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-10-23 20:34:25 +0000
commita0873931cedcb7039b752d6e615e46e3d3d4b2a1 (patch)
tree89f790c5b7b095357a05518f4529bded467e1020 /vm_eval.c
parentfe38109ffe721dda8024214c246fa8af4e6c3d78 (diff)
* vm_eval.c (vm_call0_body): remove RUBY_VM_CHECK_INTS()
after method invocation using rb_call0(). * vm_eval.c (vm_call0_body): remove default section on top of switch statement and add cases for `VM_METHOD_TYPE_CFUNC_FRAMELESS' and `VM_METHOD_TYPE_UNDEF'. * vm_eval.c (vm_call0_body): remove useless brackets. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37304 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_eval.c')
-rw-r--r--vm_eval.c101
1 files changed, 47 insertions, 54 deletions
diff --git a/vm_eval.c b/vm_eval.c
index f4208dee38..1224a8da7f 100644
--- a/vm_eval.c
+++ b/vm_eval.c
@@ -131,8 +131,6 @@ vm_call0_cfunc(rb_thread_t* th, rb_call_info_t *ci, const VALUE *argv)
static VALUE
vm_call0_body(rb_thread_t* th, rb_call_info_t *ci, const VALUE *argv)
{
- VALUE val;
-
if (!ci->me->def) return Qnil;
if (th->passed_block) {
@@ -145,40 +143,33 @@ vm_call0_body(rb_thread_t* th, rb_call_info_t *ci, const VALUE *argv)
again:
switch (ci->me->def->type) {
- case VM_METHOD_TYPE_ISEQ: {
- rb_control_frame_t *reg_cfp = th->cfp;
- int i;
+ case VM_METHOD_TYPE_ISEQ:
+ {
+ rb_control_frame_t *reg_cfp = th->cfp;
+ int i;
- CHECK_STACK_OVERFLOW(reg_cfp, ci->argc + 1);
+ CHECK_STACK_OVERFLOW(reg_cfp, ci->argc + 1);
- *reg_cfp->sp++ = ci->recv;
- for (i = 0; i < ci->argc; i++) {
- *reg_cfp->sp++ = argv[i];
- }
+ *reg_cfp->sp++ = ci->recv;
+ for (i = 0; i < ci->argc; i++) {
+ *reg_cfp->sp++ = argv[i];
+ }
- vm_call_iseq_setup(th, reg_cfp, ci);
- th->cfp->flag |= VM_FRAME_FLAG_FINISH;
- val = vm_exec(th);
- break;
- }
+ vm_call_iseq_setup(th, reg_cfp, ci);
+ th->cfp->flag |= VM_FRAME_FLAG_FINISH;
+ return vm_exec(th);
+ }
case VM_METHOD_TYPE_NOTIMPLEMENTED:
case VM_METHOD_TYPE_CFUNC:
- val = vm_call0_cfunc(th, ci, argv);
- break;
- case VM_METHOD_TYPE_ATTRSET: {
+ return vm_call0_cfunc(th, ci, argv);
+ case VM_METHOD_TYPE_ATTRSET:
rb_check_arity(ci->argc, 1, 1);
- val = rb_ivar_set(ci->recv, ci->me->def->body.attr.id, argv[0]);
- break;
- }
- case VM_METHOD_TYPE_IVAR: {
+ return rb_ivar_set(ci->recv, ci->me->def->body.attr.id, argv[0]);
+ case VM_METHOD_TYPE_IVAR:
rb_check_arity(ci->argc, 0, 0);
- val = rb_attr_get(ci->recv, ci->me->def->body.attr.id);
- break;
- }
- case VM_METHOD_TYPE_BMETHOD: {
- val = vm_call_bmethod_body(th, ci, argv);
- break;
- }
+ return rb_attr_get(ci->recv, ci->me->def->body.attr.id);
+ case VM_METHOD_TYPE_BMETHOD:
+ return vm_call_bmethod_body(th, ci, argv);
case VM_METHOD_TYPE_ZSUPER:
{
ci->defined_class = RCLASS_SUPER(ci->defined_class);
@@ -190,38 +181,40 @@ vm_call0_body(rb_thread_t* th, rb_call_info_t *ci, const VALUE *argv)
if (!ci->me->def) return Qnil;
goto again;
}
- case VM_METHOD_TYPE_MISSING: {
- VALUE new_args = rb_ary_new4(ci->argc, argv);
-
- RB_GC_GUARD(new_args);
- rb_ary_unshift(new_args, ID2SYM(ci->mid));
- th->passed_block = ci->blockptr;
- return rb_funcall2(ci->recv, idMethodMissing, ci->argc+1, RARRAY_PTR(new_args));
- }
- case VM_METHOD_TYPE_OPTIMIZED: {
+ case VM_METHOD_TYPE_MISSING:
+ {
+ VALUE new_args = rb_ary_new4(ci->argc, argv);
+
+ RB_GC_GUARD(new_args);
+ rb_ary_unshift(new_args, ID2SYM(ci->mid));
+ th->passed_block = ci->blockptr;
+ return rb_funcall2(ci->recv, idMethodMissing, ci->argc+1, RARRAY_PTR(new_args));
+ }
+ case VM_METHOD_TYPE_OPTIMIZED:
switch (ci->me->def->body.optimize_type) {
case OPTIMIZED_METHOD_TYPE_SEND:
- val = send_internal(ci->argc, argv, ci->recv, CALL_FCALL);
- break;
- case OPTIMIZED_METHOD_TYPE_CALL: {
- rb_proc_t *proc;
- GetProcPtr(ci->recv, proc);
- val = rb_vm_invoke_proc(th, proc, ci->argc, argv, ci->blockptr);
- break;
- }
+ return send_internal(ci->argc, argv, ci->recv, CALL_FCALL);
+ case OPTIMIZED_METHOD_TYPE_CALL:
+ {
+ rb_proc_t *proc;
+ GetProcPtr(ci->recv, proc);
+ return rb_vm_invoke_proc(th, proc, ci->argc, argv, ci->blockptr);
+ }
default:
rb_bug("vm_call0: unsupported optimized method type (%d)", ci->me->def->body.optimize_type);
- val = Qundef;
- break;
}
break;
- }
- default:
- rb_bug("vm_call0: unsupported method type (%d)", ci->me->def->type);
- val = Qundef;
+ case VM_METHOD_TYPE_CFUNC_FRAMELESS:
+ {
+ /* TODO: can optimize it */
+ const rb_method_cfunc_t *cfunc = &ci->me->def->body.cfunc;
+ return cfunc->invoker(cfunc->func, ci, argv);
+ }
+ case VM_METHOD_TYPE_UNDEF:
+ break;
}
- RUBY_VM_CHECK_INTS(th);
- return val;
+ rb_bug("vm_call0: unsupported method type (%d)", ci->me->def->type);
+ return Qundef;
}
VALUE