From c1f67181fa3c7159b31da5ed1591e5b33c1610a2 Mon Sep 17 00:00:00 2001 From: James Roseborough Date: Sat, 24 Apr 2010 17:18:52 +0000 Subject: [PATCH] Improve bytecode generation. --- src/jse/org/luaj/vm2/luajc/JavaBuilder.java | 28 ++++++++++++++------- src/jse/org/luaj/vm2/luajc/JavaGen.java | 3 ++- src/jse/org/luaj/vm2/luajc/Slots.java | 2 +- test/junit/org/luaj/vm2/FragmentsTest.java | 7 +++++- 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/jse/org/luaj/vm2/luajc/JavaBuilder.java b/src/jse/org/luaj/vm2/luajc/JavaBuilder.java index bf5aec8c..9f9a3e82 100644 --- a/src/jse/org/luaj/vm2/luajc/JavaBuilder.java +++ b/src/jse/org/luaj/vm2/luajc/JavaBuilder.java @@ -574,16 +574,26 @@ public class JavaBuilder { private Map constants = new HashMap(); public void loadConstant(LuaValue value) { - String name = constants.get(value); - if ( name == null ) { - name = value.type() == LuaValue.TNUMBER? - value.isinttype()? - createLuaIntegerField(value.checkint()): - createLuaDoubleField(value.checkdouble()): - createLuaStringField(value.checkstring()); - constants.put(value, name); + switch ( value.type() ) { + case LuaValue.TNIL: + loadNil(); + break; + case LuaValue.TNUMBER: + case LuaValue.TSTRING: + String name = constants.get(value); + if ( name == null ) { + name = value.type() == LuaValue.TNUMBER? + value.isinttype()? + createLuaIntegerField(value.checkint()): + createLuaDoubleField(value.checkdouble()): + createLuaStringField(value.checkstring()); + constants.put(value, name); + } + append(factory.createGetStatic(classname, name, TYPE_LUAVALUE)); + break; + default: + throw new IllegalArgumentException("bad constant type: "+value.type()); } - append(factory.createGetStatic(classname, name, TYPE_LUAVALUE)); } private String createLuaIntegerField(int value) { diff --git a/src/jse/org/luaj/vm2/luajc/JavaGen.java b/src/jse/org/luaj/vm2/luajc/JavaGen.java index 95ef1b7a..ce382077 100644 --- a/src/jse/org/luaj/vm2/luajc/JavaGen.java +++ b/src/jse/org/luaj/vm2/luajc/JavaGen.java @@ -172,7 +172,8 @@ public class JavaGen { case Lua.OP_LOADBOOL:/* A B C R(A):= (Bool)B: if (C) pc++ */ builder.loadBoolean( b!=0 ); builder.storeLocal( pc, a ); - //if ( c != 0 ) branchdest[index+2] = true; + if ( c!=0 ) + builder.addBranch(pc, JavaBuilder.BRANCH_GOTO, pc+2); break; case Lua.OP_JMP: /* sBx pc+=sBx */ diff --git a/src/jse/org/luaj/vm2/luajc/Slots.java b/src/jse/org/luaj/vm2/luajc/Slots.java index d0411696..f4f2f25a 100644 --- a/src/jse/org/luaj/vm2/luajc/Slots.java +++ b/src/jse/org/luaj/vm2/luajc/Slots.java @@ -383,7 +383,7 @@ public class Slots { private int prevUndefined(int index, int j) { for ( ; index>=0; --index ) if ( ((slots[index][j] & BIT_INVALID) != 0) ) - return 0; + return index; return index; } diff --git a/test/junit/org/luaj/vm2/FragmentsTest.java b/test/junit/org/luaj/vm2/FragmentsTest.java index d6c6885f..26a8eda2 100644 --- a/test/junit/org/luaj/vm2/FragmentsTest.java +++ b/test/junit/org/luaj/vm2/FragmentsTest.java @@ -333,5 +333,10 @@ public class FragmentsTest extends TestCase { "end\n" + "return foo()\n" ); } - + public void testTestSimpleBinops() { + runFragment( LuaValue.varargsOf(new LuaValue[] { + LuaValue.FALSE, LuaValue.FALSE, LuaValue.TRUE, LuaValue.TRUE, LuaValue.FALSE }), + "local a,b,c = 2,-2.5,0\n" + + "return (a==c), (b==c), (a==a), (a>c), (b>0)\n" ); + } }