From abdf9bca6fa406975258d7d00b1dced31291138c Mon Sep 17 00:00:00 2001 From: James Roseborough Date: Mon, 9 Aug 2010 18:16:32 +0000 Subject: [PATCH] Improve bytecode generation. --- src/jse/org/luaj/vm2/luajc/ProtoInfo.java | 19 +++++++++++++------ src/jse/org/luaj/vm2/luajc/UpvalInfo.java | 17 +++++++++++------ src/jse/org/luaj/vm2/luajc/VarInfo.java | 21 ++++++++++++++++----- 3 files changed, 40 insertions(+), 17 deletions(-) diff --git a/src/jse/org/luaj/vm2/luajc/ProtoInfo.java b/src/jse/org/luaj/vm2/luajc/ProtoInfo.java index df0ca683..1adf41c1 100644 --- a/src/jse/org/luaj/vm2/luajc/ProtoInfo.java +++ b/src/jse/org/luaj/vm2/luajc/ProtoInfo.java @@ -18,6 +18,7 @@ public class ProtoInfo { public final BasicBlock[] blocks; // basic block analysis of code branching public final BasicBlock[] blocklist; // blocks in breadhth-first order public final VarInfo[][] vars; // Each variable + public final VarInfo[] params; // Parameters and initial values of stack variables public final UpvalInfo[] upvals; // from outer scope public final UpvalInfo[][] openups; // per slot, upvalues allocated by this prototype @@ -35,6 +36,15 @@ public class ProtoInfo { // find basic blocks this.blocks = BasicBlock.findBasicBlocks(p); this.blocklist = BasicBlock.sortDepthFirst(blocks); + + + // params are inputs to first block + this.params = new VarInfo[p.maxstacksize]; + for ( int slot=0; slot b.pc0 ) return pi.vars[slot][v.pc-1].upvalue != this; diff --git a/src/jse/org/luaj/vm2/luajc/VarInfo.java b/src/jse/org/luaj/vm2/luajc/VarInfo.java index 0ab7e4c8..06078db9 100644 --- a/src/jse/org/luaj/vm2/luajc/VarInfo.java +++ b/src/jse/org/luaj/vm2/luajc/VarInfo.java @@ -7,14 +7,26 @@ public class VarInfo { public static VarInfo INVALID = new VarInfo(-1,-1); - public static VarInfo NIL(int slot) { - return new VarInfo(slot,-1); + public static VarInfo PARAM(int slot) { + return new VarInfo(slot,-1) { + public String toString() { + return slot+".p"; + } + }; } + public static VarInfo NIL(final int slot) { + return new VarInfo(slot,-1) { + public String toString() { + return "nil"; + } + }; + } + public static VarInfo PHI(int slot, int pc) { return new VarInfo(slot,pc) { public String toString() { - return super.toString()+"p"; + return super.toString()+"{}"; } }; } @@ -23,7 +35,7 @@ public class VarInfo { public final int pc; // where assigned, or -1 if for block inputs public UpvalInfo upvalue; // not null if this var is an upvalue - public boolean allocupvalue; // true if this variable allocations r/w upvalue storage + public boolean allocupvalue; // true if this variable allocates r/w upvalue storage public VarInfo(int slot, int pc) { this.slot = slot; @@ -32,7 +44,6 @@ public class VarInfo { public String toString() { return slot<0? "x.x": - pc<0? "nil": (slot+"."+pc); } } \ No newline at end of file