From 29d6f2ce58ada435c822285444d17215c291a3b2 Mon Sep 17 00:00:00 2001 From: James Roseborough Date: Sun, 25 Apr 2010 22:40:04 +0000 Subject: [PATCH] Improve compatibility with vm1 and C-based lua. --- src/core/org/luaj/vm2/LuaValue.java | 5 +---- src/core/org/luaj/vm2/Varargs.java | 3 +++ src/core/org/luaj/vm2/lib/DebugLib.java | 16 ++++++++++++---- src/jse/lua.java | 4 ++-- src/jse/luac.java | 2 +- test/junit/org/luaj/vm2/ScriptDrivenTest.java | 4 ++-- .../vm2/vm1/Luajvm1CompatibilityTest.java | 2 +- test/junit/org/luaj/vm2/vm1/luajvm1-tests.zip | Bin 31348 -> 31382 bytes test/lua/debuglib.lua | 8 ++------ 9 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/core/org/luaj/vm2/LuaValue.java b/src/core/org/luaj/vm2/LuaValue.java index 824804a4..93d8a490 100644 --- a/src/core/org/luaj/vm2/LuaValue.java +++ b/src/core/org/luaj/vm2/LuaValue.java @@ -107,7 +107,7 @@ public class LuaValue extends Varargs { public Object touserdata() { return null; } public Object touserdata(Class c) { return null; } - // object tojstring() maps to tojstring() + // Object.toString() maps to tojstring() public String toString() { return tojstring(); } // type coercion to lua values @@ -519,9 +519,6 @@ public class LuaValue extends Varargs { public LuaValue arg1() { return v1; } - public String tojstring() { - return "{"+v1+","+v2+"}"; - } } diff --git a/src/core/org/luaj/vm2/Varargs.java b/src/core/org/luaj/vm2/Varargs.java index 85b6f282..41d2ebe1 100644 --- a/src/core/org/luaj/vm2/Varargs.java +++ b/src/core/org/luaj/vm2/Varargs.java @@ -143,6 +143,9 @@ public abstract class Varargs { sb.append( ")" ); return sb.tojstring(); } + + // Object.toString() maps to tojstring() + public String toString() { return tojstring(); } public Varargs subargs(final int start) { int end = narg(); diff --git a/src/core/org/luaj/vm2/lib/DebugLib.java b/src/core/org/luaj/vm2/lib/DebugLib.java index b9be0376..5daf4465 100644 --- a/src/core/org/luaj/vm2/lib/DebugLib.java +++ b/src/core/org/luaj/vm2/lib/DebugLib.java @@ -22,9 +22,12 @@ package org.luaj.vm2.lib; import org.luaj.vm2.Lua; +import org.luaj.vm2.LuaBoolean; import org.luaj.vm2.LuaClosure; import org.luaj.vm2.LuaError; import org.luaj.vm2.LuaFunction; +import org.luaj.vm2.LuaNil; +import org.luaj.vm2.LuaNumber; import org.luaj.vm2.LuaString; import org.luaj.vm2.LuaTable; import org.luaj.vm2.LuaThread; @@ -534,10 +537,15 @@ public class DebugLib extends OneArgFunction { private static Varargs _setmetatable(Varargs args) { LuaValue object = args.arg(1); try { - if ( ! args.isnoneornil(2) ) - object.setmetatable(args.checktable(2)); - else - object.setmetatable(null); + LuaValue mt = args.opttable(2, null); + switch ( object.type() ) { + case TNIL: LuaNil.s_metatable = mt; break; + case TNUMBER: LuaNumber.s_metatable = mt; break; + case TBOOLEAN: LuaBoolean.s_metatable = mt; break; + case TSTRING: LuaString.s_metatable = mt; break; + case TFUNCTION: LuaFunction.s_metatable = mt; break; + default: object.setmetatable( mt ); + } return LuaValue.TRUE; } catch ( LuaError e ) { return varargsOf(FALSE, valueOf(e.toString())); diff --git a/src/jse/lua.java b/src/jse/lua.java index 38e8217f..4ec37f26 100644 --- a/src/jse/lua.java +++ b/src/jse/lua.java @@ -126,7 +126,7 @@ public class lua { break; } else if ( "-".equals( args[i] ) ) { setGlobalArg( _G, args, i ); - processScript( System.in, "stdin" ); + processScript( System.in, "=stdin" ); break; } else { switch ( args[i].charAt(1) ) { @@ -202,7 +202,7 @@ public class lua { String line = reader.readLine(); if ( line == null ) return; - processScript( new ByteArrayInputStream(line.getBytes()), "stdin" ); + processScript( new ByteArrayInputStream(line.getBytes()), "=stdin" ); } } } diff --git a/src/jse/luac.java b/src/jse/luac.java index 3b431a2c..b6098efd 100644 --- a/src/jse/luac.java +++ b/src/jse/luac.java @@ -134,7 +134,7 @@ public class luac { String chunkname = args[i].substring(0,args[i].length()-4); processScript( new FileInputStream(args[i]), chunkname, fos ); } else if ( args[i].length() <= 1 ) { - processScript( System.in, "stdin", fos ); + processScript( System.in, "=stdin", fos ); } else { switch ( args[i].charAt(1) ) { case 'o': diff --git a/test/junit/org/luaj/vm2/ScriptDrivenTest.java b/test/junit/org/luaj/vm2/ScriptDrivenTest.java index 2c328d65..1ba7bbf2 100644 --- a/test/junit/org/luaj/vm2/ScriptDrivenTest.java +++ b/test/junit/org/luaj/vm2/ScriptDrivenTest.java @@ -60,7 +60,7 @@ public class ScriptDrivenTest extends TestCase { default: case JSE: case LUAJIT: - _G = org.luaj.vm2.lib.JsePlatform.standardGlobals(); + _G = org.luaj.vm2.lib.JsePlatform.debugGlobals(); break; case JME: _G = org.luaj.vm2.lib.JmePlatform.debugGlobals(); @@ -115,7 +115,7 @@ public class ScriptDrivenTest extends TestCase { } default: script = new FileInputStream(file); - return LoadState.load(script, "stdin", _G); + return LoadState.load(script, "=stdin", _G); } } catch ( Exception e ) { e.printStackTrace(); diff --git a/test/junit/org/luaj/vm2/vm1/Luajvm1CompatibilityTest.java b/test/junit/org/luaj/vm2/vm1/Luajvm1CompatibilityTest.java index 86f94bd4..0c3609f4 100644 --- a/test/junit/org/luaj/vm2/vm1/Luajvm1CompatibilityTest.java +++ b/test/junit/org/luaj/vm2/vm1/Luajvm1CompatibilityTest.java @@ -92,7 +92,7 @@ public class Luajvm1CompatibilityTest extends TestCase { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); PrintStream printStream = new PrintStream( outputStream ); try { - org.luaj.vm2.LuaTable _G = org.luaj.vm2.lib.JsePlatform.standardGlobals(); + org.luaj.vm2.LuaTable _G = org.luaj.vm2.lib.JsePlatform.debugGlobals(); LuaThread.getRunning().setfenv(_G); _G.get("package").get("loaders").checktable().insert(1, new org.luaj.vm2.lib.OneArgFunction(_G) { public LuaValue call(LuaValue arg) { diff --git a/test/junit/org/luaj/vm2/vm1/luajvm1-tests.zip b/test/junit/org/luaj/vm2/vm1/luajvm1-tests.zip index 2e28ab7e1edca7f3aff5e482926611633b6041bb..19e4fca5741cb9987a7568f92f483be576638ebe 100644 GIT binary patch delta 2483 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