From f236b23bf82a0f1f81ff34f7b04450d9ff371340 Mon Sep 17 00:00:00 2001 From: James Roseborough Date: Tue, 27 Jul 2010 14:37:42 +0000 Subject: [PATCH] Add basic boolean sub-expression type inference. --- .../org/luaj/vm2/lua2java/JavaCodeGen.java | 48 +++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/src/jse/org/luaj/vm2/lua2java/JavaCodeGen.java b/src/jse/org/luaj/vm2/lua2java/JavaCodeGen.java index 5e193e53..f5ba7d21 100644 --- a/src/jse/org/luaj/vm2/lua2java/JavaCodeGen.java +++ b/src/jse/org/luaj/vm2/lua2java/JavaCodeGen.java @@ -353,6 +353,48 @@ public class JavaCodeGen { return popWriter(x); } + public String evalBoolean(Exp exp) { + Writer x = pushWriter(); + callerExpects.put(exp,LuaValue.TBOOLEAN); + final Visitor plain = this; + exp.accept(new Visitor() { + public void visit(UnopExp exp) { + switch ( exp.op ) { + case Lua.OP_NOT: out( "(!"+evalBoolean( exp.rhs )+")"); break; + default: plain.visit(exp); out(".toboolean()"); break; + } + } + public void visit(BinopExp exp) { + switch ( exp.op ) { + case Lua.OP_AND: + case Lua.OP_OR: + String op = (exp.op==Lua.OP_AND? " && ": " || "); + out("("+evalBoolean(exp.lhs)+op+evalBoolean(exp.rhs)+")"); + break; + default: + plain.visit(exp); out(".toboolean()"); + break; + } + } + public void visit(VarargsExp exp) { + plain.visit(exp); out(".toboolean(1)"); + } + public void visit(ParensExp exp) { + evalBoolean(exp.exp); + } + public void visit(FieldExp exp) { + plain.visit(exp); out(".toboolean()"); + } + public void visit(IndexExp exp) { + plain.visit(exp); out(".toboolean()"); + } + public void visit(NameExp exp) { + plain.visit(exp); out(".toboolean()"); + } + }); + return popWriter(x); + } + public void visit(FuncCallStat stat) { outi(""); stat.funccall.accept(this); @@ -723,12 +765,12 @@ public class JavaCodeGen { } public void visit(IfThenElse stat) { - outb( "if ( "+evalLuaValue(stat.ifexp)+".toboolean() ) {"); + outb( "if ( "+evalBoolean(stat.ifexp)+" ) {"); super.visit(stat.ifblock); if ( stat.elseifblocks != null ) for ( int i=0, n=stat.elseifblocks.size(); i