From 1b43352144e72ef3dabaedb7bb6e2b4c71e474f0 Mon Sep 17 00:00:00 2001 From: James Roseborough Date: Sat, 24 Apr 2010 23:49:39 +0000 Subject: [PATCH] Implement tail calls in generated bytecode classes. --- src/core/org/luaj/vm2/LuaClosure.java | 4 +-- src/core/org/luaj/vm2/LuaValue.java | 8 +++++ src/core/org/luaj/vm2/TailcallVarargs.java | 32 ++++++++++--------- src/core/org/luaj/vm2/Varargs.java | 7 ++++ src/core/org/luaj/vm2/lib/VarArgFunction.java | 20 ++++++++++-- src/jse/org/luaj/vm2/luajc/JavaBuilder.java | 8 +++-- 6 files changed, 57 insertions(+), 22 deletions(-) diff --git a/src/core/org/luaj/vm2/LuaClosure.java b/src/core/org/luaj/vm2/LuaClosure.java index 79178dfa..f29ce2ca 100644 --- a/src/core/org/luaj/vm2/LuaClosure.java +++ b/src/core/org/luaj/vm2/LuaClosure.java @@ -101,10 +101,10 @@ public class LuaClosure extends LuaFunction { } public final Varargs invoke(Varargs varargs) { - return oninvoke( varargs ).eval(); + return onInvoke( varargs ).eval(); } - final Varargs oninvoke(Varargs varargs) { + public Varargs onInvoke(Varargs varargs) { LuaValue[] stack = new LuaValue[p.maxstacksize]; System.arraycopy(NILS, 0, stack, 0, p.maxstacksize); for ( int i=0; i 2) ) + int o = Lua.GET_OPCODE(inst); + if ( (o == Lua.OP_TAILCALL) || + ((o == Lua.OP_RETURN) && (Lua.GETARG_B(inst) < 1 || Lua.GETARG_B(inst) > 2)) ) { superclassType = SUPERTYPE_VARARGS; + break; + } } // create class generator