From 97b41624237c52e7b8364459fe324de114fb4d50 Mon Sep 17 00:00:00 2001 From: Ian Farmer Date: Sun, 25 Jul 2010 20:47:54 +0000 Subject: [PATCH] Fix bug in compiler affecting functions with many locals. --- src/core/org/luaj/vm2/LuaThread.java | 2 +- src/core/org/luaj/vm2/LuaValue.java | 6 +-- src/core/org/luaj/vm2/compiler/FuncState.java | 8 ++-- test/junit/org/luaj/vm2/CompatibiltyTest.java | 1 + test/lua/manyupvals.lua | 38 +++++++++++++++++++ 5 files changed, 47 insertions(+), 8 deletions(-) create mode 100644 test/lua/manyupvals.lua diff --git a/src/core/org/luaj/vm2/LuaThread.java b/src/core/org/luaj/vm2/LuaThread.java index 1d75b2ac..5a8fbc96 100644 --- a/src/core/org/luaj/vm2/LuaThread.java +++ b/src/core/org/luaj/vm2/LuaThread.java @@ -52,7 +52,7 @@ public class LuaThread extends LuaValue implements Runnable { public LuaValue err; - public static final int MAX_CALLSTACK = 64; + public static final int MAX_CALLSTACK = 256; public final LuaFunction[] callstack = new LuaFunction[MAX_CALLSTACK]; public int calls = 0; diff --git a/src/core/org/luaj/vm2/LuaValue.java b/src/core/org/luaj/vm2/LuaValue.java index 5e64fb85..33ff196f 100644 --- a/src/core/org/luaj/vm2/LuaValue.java +++ b/src/core/org/luaj/vm2/LuaValue.java @@ -68,10 +68,10 @@ public class LuaValue extends Varargs { public static final LuaString METATABLE = valueOf("__metatable"); public static final LuaString EMPTYSTRING = valueOf(""); - private static int MAXLOCALS = 200; - public static final LuaValue[] NILS = new LuaValue[MAXLOCALS]; + private static int MAXSTACK = 250; + public static final LuaValue[] NILS = new LuaValue[MAXSTACK]; static { - for ( int i=0; i + do + local result + function f() + if not result then + result = f() + f() + end + return result + end + end +]] +t[1] = [[ + local f1 + f1 = function() return 1 end +]] +t[2] = [[ + local f2 + f2 = function() return 1 end +]] +for i = 3, 199 do + t[i] = template:gsub("<([^>]+)>", function(s) + local c = assert(loadstring('return '..s), 'could not compile: '..s) + setfenv(c, { i = i }) + return c() + end) +end +t[200] = [[ + print("5th fibonacci number is", f5()) + print("10th fibonacci number is", f10()) + print("199th fibonacci number is", f199()) +]] + +local s = table.concat(t) +print(s) +f = loadstring(s) +f()