From 4c25b880764e47d1a63560047e2eb770f78d299e Mon Sep 17 00:00:00 2001 From: qiaoenxin Date: Thu, 7 Nov 2024 16:16:09 +0800 Subject: [PATCH] =?UTF-8?q?=E2=80=A2Runtime=20upgrade=20to=20Java=208=20or?= =?UTF-8?q?=20newer.=20=E2=80=A2Feature:=20Support=20Java=2021=20VirtualTh?= =?UTF-8?q?read?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 + build-libs.xml | 2 +- build.xml | 12 +- src/core/org/luaj/vm2/LuaThread.java | 155 ++++++---- src/core/org/luaj/vm2/compiler/FuncState.java | 2 +- src/core/org/luaj/vm2/compiler/LexState.java | 2 +- src/core/org/luaj/vm2/lib/CoroutineLib.java | 4 +- src/core/org/luaj/vm2/lib/DebugLib.java | 281 +++++++++++------- src/core/org/luaj/vm2/lib/IoLib.java | 14 +- .../org/luaj/vm2/lib/jse/CoerceLuaToJava.java | 16 +- .../org/luaj/vm2/script/LuaScriptEngine.java | 4 +- version.properties | 2 +- 12 files changed, 307 insertions(+), 192 deletions(-) diff --git a/README.md b/README.md index 30f17dbd..f055aec4 100644 --- a/README.md +++ b/README.md @@ -1019,6 +1019,11 @@ and at http://luaj.sour
  • Let JsePlatform.luaMain() return values returned by the main chunk.
  • Add synchronization to CoerceJavaToLua.COERCIONS map.
  • + +  3.1.0 diff --git a/build-libs.xml b/build-libs.xml index 872c5bb8..cdffb41c 100644 --- a/build-libs.xml +++ b/build-libs.xml @@ -14,7 +14,7 @@ - diff --git a/build.xml b/build.xml index e0ea7f0d..5d2de333 100644 --- a/build.xml +++ b/build.xml @@ -81,20 +81,22 @@ - - + + + - - = f.k.length) f.k = realloc( f.k, nk*2 + 1 ); diff --git a/src/core/org/luaj/vm2/compiler/LexState.java b/src/core/org/luaj/vm2/compiler/LexState.java index 0192de05..8f4ebd12 100644 --- a/src/core/org/luaj/vm2/compiler/LexState.java +++ b/src/core/org/luaj/vm2/compiler/LexState.java @@ -170,7 +170,7 @@ public class LexState extends Constants { static { for ( int i=0; i 0? frame[calls-1].currentline(): -1; - } - - private synchronized CallFrame pushcall() { - if (calls >= frame.length) { - int n = Math.max(4, frame.length * 3 / 2); - CallFrame[] f = new CallFrame[n]; - System.arraycopy(frame, 0, f, 0, frame.length); - for (int i = frame.length; i < n; ++i) - f[i] = new CallFrame(); - frame = f; - for (int i = 1; i < n; ++i) - f[i].previous = f[i-1]; + int currentline() { + lock.lock(); + try { + return calls > 0? frame[calls-1].currentline(): -1; + } finally { + lock.unlock(); } - return frame[calls++]; - } - - final synchronized void onCall(LuaFunction function) { - pushcall().set(function); } - final synchronized void onCall(LuaClosure function, Varargs varargs, LuaValue[] stack) { - pushcall().set(function, varargs, stack); + private CallFrame pushcall() { + lock.lock(); + try { + if (calls >= frame.length) { + int n = Math.max(4, frame.length * 3 / 2); + CallFrame[] f = new CallFrame[n]; + System.arraycopy(frame, 0, f, 0, frame.length); + for (int i = frame.length; i < n; ++i) + f[i] = new CallFrame(); + frame = f; + for (int i = 1; i < n; ++i) + f[i].previous = f[i-1]; + } + return frame[calls++]; + } finally { + lock.unlock(); + } } - final synchronized void onReturn() { - if (calls > 0) - frame[--calls].reset(); + final void onCall(LuaFunction function) { + lock.lock(); + try { + pushcall().set(function); + } finally { + lock.unlock(); + } + } + + final void onCall(LuaClosure function, Varargs varargs, LuaValue[] stack) { + lock.lock(); + try { + pushcall().set(function, varargs, stack); + } finally { + lock.unlock(); + } + } - final synchronized void onInstruction(int pc, Varargs v, int top) { - if (calls > 0) - frame[calls-1].instr(pc, v, top); + final void onReturn() { + lock.lock(); + try { + if (calls > 0) + frame[--calls].reset(); + } finally { + lock.unlock(); + } + } + + final void onInstruction(int pc, Varargs v, int top) { + lock.lock(); + try { + if (calls > 0) + frame[calls-1].instr(pc, v, top); + } finally { + lock.unlock(); + } } /** @@ -551,102 +586,122 @@ public class DebugLib extends TwoArgFunction { * @param level * @return String containing the traceback. */ - synchronized String traceback(int level) { - StringBuffer sb = new StringBuffer(); - sb.append( "stack traceback:" ); - for (DebugLib.CallFrame c; (c = getCallFrame(level++)) != null; ) { - sb.append("\n\t"); - sb.append( c.shortsource() ); - sb.append( ':' ); - if (c.currentline() > 0) - sb.append( c.currentline()+":" ); - sb.append( " in " ); - DebugInfo ar = auxgetinfo("n", c.f, c); - if (c.linedefined() == 0) - sb.append("main chunk"); - else if ( ar.name != null ) { - sb.append( "function '" ); - sb.append( ar.name ); - sb.append( '\'' ); - } else { - sb.append( "function <" ); + String traceback(int level) { + lock.lock(); + try { + StringBuffer sb = new StringBuffer(); + sb.append( "stack traceback:" ); + for (DebugLib.CallFrame c; (c = getCallFrame(level++)) != null; ) { + sb.append("\n\t"); sb.append( c.shortsource() ); sb.append( ':' ); - sb.append( c.linedefined() ); - sb.append( '>' ); + if (c.currentline() > 0) + sb.append( c.currentline()+":" ); + sb.append( " in " ); + DebugInfo ar = auxgetinfo("n", c.f, c); + if (c.linedefined() == 0) + sb.append("main chunk"); + else if ( ar.name != null ) { + sb.append( "function '" ); + sb.append( ar.name ); + sb.append( '\'' ); + } else { + sb.append( "function <" ); + sb.append( c.shortsource() ); + sb.append( ':' ); + sb.append( c.linedefined() ); + sb.append( '>' ); + } } + sb.append("\n\t[Java]: in ?"); + return sb.toString(); + } finally { + lock.unlock(); } - sb.append("\n\t[Java]: in ?"); - return sb.toString(); + } - synchronized DebugLib.CallFrame getCallFrame(int level) { - if (level < 1 || level > calls) + DebugLib.CallFrame getCallFrame(int level) { + lock.lock(); + try { + if (level < 1 || level > calls) + return null; + return frame[calls-level]; + } finally { + lock.unlock(); + } + } + + DebugLib.CallFrame findCallFrame(LuaValue func) { + lock.lock(); + try { + for (int i = 1; i <= calls; ++i) + if (frame[calls-i].f == func) + return frame[i]; return null; - return frame[calls-level]; - } - - synchronized DebugLib.CallFrame findCallFrame(LuaValue func) { - for (int i = 1; i <= calls; ++i) - if (frame[calls-i].f == func) - return frame[i]; - return null; - } - - - synchronized DebugInfo auxgetinfo(String what, LuaFunction f, CallFrame ci) { - DebugInfo ar = new DebugInfo(); - for (int i = 0, n = what.length(); i < n; ++i) { - switch (what.charAt(i)) { - case 'S': - ar.funcinfo(f); - break; - case 'l': - ar.currentline = ci != null && ci.f.isclosure()? ci.currentline(): -1; - break; - case 'u': - if (f != null && f.isclosure()) { - Prototype p = f.checkclosure().p; - ar.nups = (short) p.upvalues.length; - ar.nparams = (short) p.numparams; - ar.isvararg = p.is_vararg != 0; - } else { - ar.nups = 0; - ar.isvararg = true; - ar.nparams = 0; - } - break; - case 't': - ar.istailcall = false; - break; - case 'n': { - /* calling function is a known Lua function? */ - if (ci != null && ci.previous != null) { - if (ci.previous.f.isclosure()) { - NameWhat nw = getfuncname(ci.previous); - if (nw != null) { - ar.name = nw.name; - ar.namewhat = nw.namewhat; - } - } - } - if (ar.namewhat == null) { - ar.namewhat = ""; /* not found */ - ar.name = null; - } - break; - } - case 'L': - case 'f': - break; - default: - // TODO: return bad status. - break; - } + } finally { + lock.unlock(); } - return ar; } + + DebugInfo auxgetinfo(String what, LuaFunction f, CallFrame ci) { + lock.lock(); + try { + DebugInfo ar = new DebugInfo(); + for (int i = 0, n = what.length(); i < n; ++i) { + switch (what.charAt(i)) { + case 'S': + ar.funcinfo(f); + break; + case 'l': + ar.currentline = ci != null && ci.f.isclosure()? ci.currentline(): -1; + break; + case 'u': + if (f != null && f.isclosure()) { + Prototype p = f.checkclosure().p; + ar.nups = (short) p.upvalues.length; + ar.nparams = (short) p.numparams; + ar.isvararg = p.is_vararg != 0; + } else { + ar.nups = 0; + ar.isvararg = true; + ar.nparams = 0; + } + break; + case 't': + ar.istailcall = false; + break; + case 'n': { + /* calling function is a known Lua function? */ + if (ci != null && ci.previous != null) { + if (ci.previous.f.isclosure()) { + NameWhat nw = getfuncname(ci.previous); + if (nw != null) { + ar.name = nw.name; + ar.namewhat = nw.namewhat; + } + } + } + if (ar.namewhat == null) { + ar.namewhat = ""; /* not found */ + ar.name = null; + } + break; + } + case 'L': + case 'f': + break; + default: + // TODO: return bad status. + break; + } + } + return ar; + } finally { + lock.unlock(); + } + } } public static class CallFrame { diff --git a/src/core/org/luaj/vm2/lib/IoLib.java b/src/core/org/luaj/vm2/lib/IoLib.java index 13f6f986..d7149ed6 100644 --- a/src/core/org/luaj/vm2/lib/IoLib.java +++ b/src/core/org/luaj/vm2/lib/IoLib.java @@ -119,11 +119,15 @@ public class IoLib extends TwoArgFunction { return "file: " + Integer.toHexString(hashCode()); } - public void finalize() { - if (!isclosed()) { - try { - close(); - } catch (IOException ignore) {} + public void finalize() throws Throwable { + try { + if (!isclosed()) { + try { + close(); + } catch (IOException ignore) {} + } + } finally { + super.finalize(); } } } diff --git a/src/jse/org/luaj/vm2/lib/jse/CoerceLuaToJava.java b/src/jse/org/luaj/vm2/lib/jse/CoerceLuaToJava.java index c658aacc..f9b90dbf 100644 --- a/src/jse/org/luaj/vm2/lib/jse/CoerceLuaToJava.java +++ b/src/jse/org/luaj/vm2/lib/jse/CoerceLuaToJava.java @@ -174,13 +174,13 @@ public class CoerceLuaToJava { public Object coerce(LuaValue value) { switch ( targetType ) { - case TARGET_TYPE_BYTE: return new Byte( (byte) value.toint() ); - case TARGET_TYPE_CHAR: return new Character( (char) value.toint() ); - case TARGET_TYPE_SHORT: return new Short( (short) value.toint() ); - case TARGET_TYPE_INT: return new Integer( (int) value.toint() ); - case TARGET_TYPE_LONG: return new Long( (long) value.todouble() ); - case TARGET_TYPE_FLOAT: return new Float( (float) value.todouble() ); - case TARGET_TYPE_DOUBLE: return new Double( (double) value.todouble() ); + case TARGET_TYPE_BYTE: return (byte) value.toint() ; + case TARGET_TYPE_CHAR: return (char) value.toint() ; + case TARGET_TYPE_SHORT: return (short) value.toint(); + case TARGET_TYPE_INT: return value.toint(); + case TARGET_TYPE_LONG: return (long) value.todouble(); + case TARGET_TYPE_FLOAT: return (float) value.todouble(); + case TARGET_TYPE_DOUBLE: return (double) value.todouble(); default: return null; } } @@ -308,7 +308,7 @@ public class CoerceLuaToJava { public Object coerce(LuaValue value) { switch ( value.type() ) { case LuaValue.TNUMBER: - return value.isint()? (Object)new Integer(value.toint()): (Object)new Double(value.todouble()); + return value.isint()? value.toint() : value.todouble(); case LuaValue.TBOOLEAN: return value.toboolean()? Boolean.TRUE: Boolean.FALSE; case LuaValue.TSTRING: diff --git a/src/jse/org/luaj/vm2/script/LuaScriptEngine.java b/src/jse/org/luaj/vm2/script/LuaScriptEngine.java index 415c885c..2146bdd1 100644 --- a/src/jse/org/luaj/vm2/script/LuaScriptEngine.java +++ b/src/jse/org/luaj/vm2/script/LuaScriptEngine.java @@ -244,8 +244,8 @@ public class LuaScriptEngine extends AbstractScriptEngine implements ScriptEngin case LuaValue.TSTRING: return luajValue.tojstring(); case LuaValue.TUSERDATA: return luajValue.checkuserdata(Object.class); case LuaValue.TNUMBER: return luajValue.isinttype()? - (Object) new Integer(luajValue.toint()): - (Object) new Double(luajValue.todouble()); + luajValue.toint(): + luajValue.todouble(); default: return luajValue; } } diff --git a/version.properties b/version.properties index fa48e2d2..3e5a8ac8 100644 --- a/version.properties +++ b/version.properties @@ -1 +1 @@ -version: 3.0.2 \ No newline at end of file +version: 3.1.0 \ No newline at end of file