From 3d4a3dbb651c2f0472025ef0c50ce8fb74d7f788 Mon Sep 17 00:00:00 2001 From: James Roseborough Date: Wed, 11 Aug 2010 14:23:59 +0000 Subject: [PATCH] Improve bytecode generation. --- src/jse/org/luaj/vm2/luajc/ProtoInfo.java | 6 - src/jse/org/luaj/vm2/luajc/UpvalInfo.java | 139 +++++++++++---------- test/junit/org/luaj/vm2/FragmentsTest.java | 11 ++ 3 files changed, 82 insertions(+), 74 deletions(-) diff --git a/src/jse/org/luaj/vm2/luajc/ProtoInfo.java b/src/jse/org/luaj/vm2/luajc/ProtoInfo.java index 30bedb24..5d386749 100644 --- a/src/jse/org/luaj/vm2/luajc/ProtoInfo.java +++ b/src/jse/org/luaj/vm2/luajc/ProtoInfo.java @@ -3,15 +3,9 @@ package org.luaj.vm2.luajc; import java.io.ByteArrayOutputStream; import java.io.PrintStream; -import org.luaj.vm2.Buffer; import org.luaj.vm2.Lua; -import org.luaj.vm2.LuaClosure; -import org.luaj.vm2.LuaTable; -import org.luaj.vm2.LuaValue; import org.luaj.vm2.Print; import org.luaj.vm2.Prototype; -import org.luaj.vm2.TailcallVarargs; -import org.luaj.vm2.UpValue; /** * Prototype information for static single-assignment analysis diff --git a/src/jse/org/luaj/vm2/luajc/UpvalInfo.java b/src/jse/org/luaj/vm2/luajc/UpvalInfo.java index 80a5c0ff..8086684c 100644 --- a/src/jse/org/luaj/vm2/luajc/UpvalInfo.java +++ b/src/jse/org/luaj/vm2/luajc/UpvalInfo.java @@ -15,12 +15,82 @@ public class UpvalInfo { this.slot = slot; this.nvars = 0; this.var = null; - includeVars( pi.vars[slot][pc] ); + includeVarAndPosteriorVars( pi.vars[slot][pc] ); for ( int i=0; i 1; } + private boolean includeVarAndPosteriorVars( VarInfo var ) { + if ( var == null || var == VarInfo.INVALID ) + return false; + if ( var.upvalue == this ) + return true; + var.upvalue = this; + appendVar( var ); + boolean loopDetected = includePosteriorVarsCheckLoops( var ); + if ( loopDetected ) + includePriorVarsIgnoreLoops( var ); + return loopDetected; + } + + private boolean includePosteriorVarsCheckLoops( VarInfo prior ) { + boolean loopDetected = false; + for ( int i=0, n=pi.blocklist.length; i=b.pc0; pc-- ) { + if ( pi.vars[slot][pc] == prior ) { + loopDetected |= includeVarAndPosteriorVars( pi.vars[slot][pc+1] ); + break; + } + } + } + } + return loopDetected; + } + + private void includePriorVarsIgnoreLoops(VarInfo poster) { + for ( int i=0, n=pi.blocklist.length; i= var.length ) { + VarInfo[] s = var; + var = new VarInfo[nvars*2+1]; + System.arraycopy(s, 0, var, 0, nvars); + } + var[nvars++] = v; + } + public String toString() { StringBuffer sb = new StringBuffer(); sb.append( pi.name ); @@ -33,73 +103,6 @@ public class UpvalInfo { return sb.toString(); } - private void includeVar(VarInfo v) { - if ( v == null ) - return; - if ( includes(v) ) - return; - if ( nvars == 0 ) { - var = new VarInfo[1]; - } else if ( nvars+1 >= var.length ) { - VarInfo[] s = var; - var = new VarInfo[nvars*2+1]; - System.arraycopy(s, 0, var, 0, nvars); - } - var[nvars++] = v; - } - - private boolean includes(VarInfo v) { - for ( int i=0; i