From 84acf4e3f38d01c72ae077db1234c880658c10aa Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Tue, 9 Apr 2013 15:31:17 +0900 Subject: preparation for tail call optimization (still has bugs) --- src/codegen.c | 8 ++++++++ src/vm.c | 11 ++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index 83d0136ef..d9fc10657 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -317,6 +317,14 @@ genop_peep(codegen_scope *s, mrb_code i, int val) s->iseq[s->pc-1] = MKOP_A(c0, 0); genop(s, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL)); return; +#if 0 + case OP_SEND: + if (GETARG_B(i) == OP_R_NORMAL && GETARG_A(i) == GETARG_A(i0)) { + s->iseq[s->pc-1] = MKOP_ABC(OP_TAILCALL, GETARG_A(i0), GETARG_B(i0), GETARG_C(i0)); + return; + } + break; +#endif default: break; } diff --git a/src/vm.c b/src/vm.c index 468396a51..13058fc28 100644 --- a/src/vm.c +++ b/src/vm.c @@ -1195,9 +1195,11 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) NEXT; } + L_RETURN: + i = MKOP_AB(OP_RETURN, GETARG_A(i), OP_R_NORMAL); + /* fall through */ CASE(OP_RETURN) { /* A return R(A) */ - L_RETURN: if (mrb->exc) { mrb_callinfo *ci; int eidx; @@ -1333,7 +1335,6 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) } } - /* replace callinfo */ ci = mrb->ci; ci->mid = mid; @@ -1658,7 +1659,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) } while (0) CASE(OP_EQ) { - /* A B C R(A) := R(A)=); NEXT; } -- cgit v1.2.3