From 02be06c7b6c90fc027692f3580fa0dd143b8447c Mon Sep 17 00:00:00 2001 From: James Roseborough Date: Thu, 12 Aug 2010 05:26:02 +0000 Subject: [PATCH] Improve bytecode generation. --- src/jse/org/luaj/vm2/luajc/UpvalInfo.java | 15 +++++++++++++++ test/junit/org/luaj/vm2/FragmentsTest.java | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/jse/org/luaj/vm2/luajc/UpvalInfo.java b/src/jse/org/luaj/vm2/luajc/UpvalInfo.java index fdf3b8f2..b9c33314 100644 --- a/src/jse/org/luaj/vm2/luajc/UpvalInfo.java +++ b/src/jse/org/luaj/vm2/luajc/UpvalInfo.java @@ -3,6 +3,8 @@ */ package org.luaj.vm2.luajc; +import org.luaj.vm2.Lua; + public class UpvalInfo { ProtoInfo pi; // where defined int slot; // where defined @@ -28,12 +30,25 @@ public class UpvalInfo { return true; var.upvalue = this; appendVar( var ); + if ( isLoopVariable( var ) ) + return false; boolean loopDetected = includePosteriorVarsCheckLoops( var ); if ( loopDetected ) includePriorVarsIgnoreLoops( var ); return loopDetected; } + private boolean isLoopVariable(VarInfo var) { + if ( var.pc >= 0 ) { + switch ( Lua.GET_OPCODE(pi.prototype.code[var.pc]) ) { + case Lua.OP_TFORLOOP: + case Lua.OP_FORLOOP: + return true; + } + } + return false; + } + private boolean includePosteriorVarsCheckLoops( VarInfo prior ) { boolean loopDetected = false; for ( int i=0, n=pi.blocklist.length; i