diff --git a/src/core/org/luaj/vm2/LuaValue.java b/src/core/org/luaj/vm2/LuaValue.java index fd7bd399..7f5aa07a 100644 --- a/src/core/org/luaj/vm2/LuaValue.java +++ b/src/core/org/luaj/vm2/LuaValue.java @@ -310,7 +310,8 @@ public class LuaValue extends Varargs { } // table initializers - public static LuaTable tableOf() { return new LuaTable(); } + public static LuaTable tableOf() { return new LuaTable(); } + public static LuaTable tableOf(Varargs varargs, int firstarg) { return new LuaTable(varargs.subargs(firstarg)); } public static LuaTable tableOf(int narray, int nhash) { return new LuaTable(narray, nhash); } public static LuaTable listOf(LuaValue[] unnamedValues) { return new LuaTable(null,unnamedValues,null); } public static LuaTable listOf(LuaValue[] unnamedValues,Varargs lastarg) { return new LuaTable(null,unnamedValues,lastarg); } diff --git a/src/jse/org/luaj/vm2/luajc/JavaBytecodeCompiler.java b/src/jse/org/luaj/vm2/luajc/JavaBytecodeCompiler.java index c302e422..5bb50f3a 100644 --- a/src/jse/org/luaj/vm2/luajc/JavaBytecodeCompiler.java +++ b/src/jse/org/luaj/vm2/luajc/JavaBytecodeCompiler.java @@ -27,6 +27,7 @@ import java.io.InputStream; import org.luaj.vm2.LoadState; import org.luaj.vm2.LuaClosure; import org.luaj.vm2.LuaFunction; +import org.luaj.vm2.LuaTable; import org.luaj.vm2.LuaValue; import org.luaj.vm2.Prototype; import org.luaj.vm2.LoadState.LuaCompiler; @@ -52,14 +53,25 @@ public class JavaBytecodeCompiler implements LuaCompiler { LoadState.compiler = getInstance(); } - private JavaBytecodeCompiler() { + public JavaBytecodeCompiler() { luac = new LuaC(); gen = new JavaBytecodeGenerator(); } + + /** Compile int a prototype */ + public static Prototype compile(InputStream is, String chunkname) throws IOException { + return getInstance().compile(is.read(), is, chunkname); + } + + /** Compile and load a chunk + * @throws IOException */ + public static LuaValue load(InputStream is, String filename, LuaValue _g) throws IOException { + return getInstance().load(is.read(), is, filename, _g); + } /** Compile into protoype form. */ - public Prototype compile(int firstByte, InputStream stream, String name) throws IOException { - return luac.compile(firstByte, stream, name); + public Prototype compile(int firstByte, InputStream stream, String chunkname) throws IOException { + return luac.compile(firstByte, stream, chunkname); } /** Compile into class form. */ @@ -70,10 +82,8 @@ public class JavaBytecodeCompiler implements LuaCompiler { classname = classname.replace('/', '.'); classname = classname.replace('\\', '.'); String sourcename = filename.substring( filename.lastIndexOf('/')+1 ); - System.out.println("compiling file "+filename+" using sourcename "+sourcename+" and classname "+classname); Class c = gen.toJavaBytecode(p, classname, sourcename); Object o = c.newInstance(); - System.out.println("instance is: "+o); LuaFunction f = (LuaFunction) o; f.setfenv(env); return f; diff --git a/src/jse/org/luaj/vm2/luajc/JavaBytecodeGenerator.java b/src/jse/org/luaj/vm2/luajc/JavaBytecodeGenerator.java index 6d37ab0e..c3c97b19 100644 --- a/src/jse/org/luaj/vm2/luajc/JavaBytecodeGenerator.java +++ b/src/jse/org/luaj/vm2/luajc/JavaBytecodeGenerator.java @@ -284,6 +284,7 @@ public class JavaBytecodeGenerator { int np = p.numparams; int nl = p.maxstacksize; LocalVariableGen[] locals = new LocalVariableGen[nl]; + // initialize locals @@ -292,16 +293,15 @@ public class JavaBytecodeGenerator { // LocalVariableGen regup[] = new LocalVariableGen[nl]; boolean isup[] = new boolean[nl]; markups(p, isup, code, 0, 0); - + + // initialize slotc + boolean needsarg = ((p.is_vararg & Lua.VARARG_NEEDSARG) != 0); for (int j = 0; j < nl; j++) { - - String name = j < p.locvars.length && p.locvars[j].varname != null ? - toLegalJavaName(p.locvars[j].varname.toString()): - "r" + j; - - locals[j] = mg.addLocalVariable(name, isup[j] ? TYPE_LOCALUPVALUE - : TYPE_LUAVALUE, null, null); - + // create space + LuaString luaname = p.getlocalname(j,0); + String name = toLegalJavaName( luaname!=null? luaname.toString(): "r"+j ); + locals[j] = mg.addLocalVariable(name, isup[j] ? TYPE_LOCALUPVALUE : TYPE_LUAVALUE, null, null); + if (isup[j]) { // upvalue storage il.append(new PUSH(cp, 1)); il.append(new ANEWARRAY(cp.addClass(STR_LUAVALUE))); @@ -314,9 +314,11 @@ public class JavaBytecodeGenerator { if (j < np) { il.append(new ALOAD(1)); il.append(new PUSH(cp, j + 1)); - il.append(factory.createInvoke(STR_VARARGS, "arg", - TYPE_LUAVALUE, new Type[] { Type.INT }, - Constants.INVOKEVIRTUAL)); + il.append(factory.createInvoke(STR_VARARGS, "arg", TYPE_LUAVALUE, new Type[] { Type.INT }, Constants.INVOKEVIRTUAL)); + } else if ( (j == np) && needsarg ) { + il.append(new ALOAD(1)); + il.append(new PUSH(cp, np+1)); + il.append(factory.createInvoke(STR_LUAVALUE, "tableOf", TYPE_LUATABLE, new Type[] { TYPE_VARARGS, Type.INT }, Constants.INVOKESTATIC)); } else { nil = il_initLocalNil(mg, factory, il, nil); il.append(new ALOAD(nil.getIndex())); @@ -384,6 +386,7 @@ public class JavaBytecodeGenerator { // pc++; /* skip next instruction (if C) */ branches[pc] = new GOTO(null); targets[pc] = pc + 2; + il.append(branches[pc]); } break; @@ -475,6 +478,7 @@ public class JavaBytecodeGenerator { // stack[a+1] = (o = stack[B(i)]); ih[pc] = il_append_new_ALOAD(cp,il, (locals[B(i)])); + il.append(InstructionConstants.DUP); il_append_new_ASTORE(cp,il, (locals[a+1])); // stack[a] = o.get((c=C(i))>0xff? k[c&0x0ff]: stack[c]); if ((c=C(i))>0xff) @@ -880,12 +884,14 @@ public class JavaBytecodeGenerator { //o = stack[a]; il_append_new_ALOAD(cp,il, (locals[a])); if ( (b=B(i)) == 0 ) { - for ( int j=1; a+j