Let VarArgFunction instances register with Thread on invocation.
This commit is contained in:
@@ -138,7 +138,7 @@ public class LuaThread extends LuaValue implements Runnable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static final LuaFunction getCallstackFunction(int level) {
|
public static final LuaFunction getCallstackFunction(int level) {
|
||||||
return level>0 || level<running_thread.calls?
|
return level>=0 && level<running_thread.calls?
|
||||||
running_thread.callstack[running_thread.calls-level-1]:
|
running_thread.callstack[running_thread.calls-level-1]:
|
||||||
null;
|
null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -351,17 +351,18 @@ public class PackageLib extends LuaTable {
|
|||||||
|
|
||||||
private LuaValue loader_Java( Varargs args ) {
|
private LuaValue loader_Java( Varargs args ) {
|
||||||
String name = args.checkString(1);
|
String name = args.checkString(1);
|
||||||
|
String classname = toClassname( name );
|
||||||
Class c = null;
|
Class c = null;
|
||||||
LuaValue v = null;
|
LuaValue v = null;
|
||||||
try {
|
try {
|
||||||
c = Class.forName(name.replace('/', '.'));
|
c = Class.forName(classname);
|
||||||
v = (LuaValue) c.newInstance();
|
v = (LuaValue) c.newInstance();
|
||||||
v.setfenv(_G);
|
v.setfenv(_G);
|
||||||
return v;
|
return v;
|
||||||
} catch ( ClassNotFoundException cnfe ) {
|
} catch ( ClassNotFoundException cnfe ) {
|
||||||
return valueOf("\n\tno class '"+name+"'" );
|
return valueOf("\n\tno class '"+classname+"'" );
|
||||||
} catch ( Exception e ) {
|
} catch ( Exception e ) {
|
||||||
return valueOf("\n\tjava load failed on '"+name+"', "+e );
|
return valueOf("\n\tjava load failed on '"+classname+"', "+e );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -373,10 +374,10 @@ public class PackageLib extends LuaTable {
|
|||||||
j -= 4;
|
j -= 4;
|
||||||
for ( int k=0; k<j; k++ ) {
|
for ( int k=0; k<j; k++ ) {
|
||||||
char c = filename.charAt(k);
|
char c = filename.charAt(k);
|
||||||
if ( (!isClassnamePart(c)) && (c!='/') && (c!='\\') ) {
|
if ( (!isClassnamePart(c)) || (c=='/') || (c=='\\') ) {
|
||||||
StringBuffer sb = new StringBuffer(j);
|
StringBuffer sb = new StringBuffer(j);
|
||||||
for ( int i=0; i<j; i++ ) {
|
for ( int i=0; i<j; i++ ) {
|
||||||
c = filename.charAt(k);
|
c = filename.charAt(i);
|
||||||
sb.append(
|
sb.append(
|
||||||
(isClassnamePart(c))? c:
|
(isClassnamePart(c))? c:
|
||||||
((c=='/') || (c=='\\'))? '.': '_' );
|
((c=='/') || (c=='\\'))? '.': '_' );
|
||||||
|
|||||||
@@ -21,13 +21,11 @@
|
|||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
package org.luaj.vm2.lib;
|
package org.luaj.vm2.lib;
|
||||||
|
|
||||||
|
import org.luaj.vm2.LuaThread;
|
||||||
import org.luaj.vm2.LuaValue;
|
import org.luaj.vm2.LuaValue;
|
||||||
import org.luaj.vm2.Varargs;
|
import org.luaj.vm2.Varargs;
|
||||||
|
|
||||||
abstract public class VarArgFunction extends LibFunction {
|
abstract public class VarArgFunction extends LibFunction {
|
||||||
|
|
||||||
abstract public Varargs invoke(Varargs args);
|
|
||||||
|
|
||||||
public VarArgFunction() {
|
public VarArgFunction() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -54,4 +52,18 @@ abstract public class VarArgFunction extends LibFunction {
|
|||||||
public LuaValue call(LuaValue arg1, LuaValue arg2, LuaValue arg3) {
|
public LuaValue call(LuaValue arg1, LuaValue arg2, LuaValue arg3) {
|
||||||
return invoke(varargsOf(arg1,arg2,arg3)).arg1();
|
return invoke(varargsOf(arg1,arg2,arg3)).arg1();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Varargs invoke(Varargs args) {
|
||||||
|
LuaThread.onCall(this);
|
||||||
|
try {
|
||||||
|
return onInvoke(args);
|
||||||
|
} finally {
|
||||||
|
LuaThread.onReturn();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Varargs onInvoke(Varargs args) {
|
||||||
|
return NONE;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -254,7 +254,7 @@ public class JavaBytecodeGenerator {
|
|||||||
nl = p.maxstacksize;
|
nl = p.maxstacksize;
|
||||||
locals = new LocalVariableGen[nl];
|
locals = new LocalVariableGen[nl];
|
||||||
|
|
||||||
// implement LuaValue.invoke(Varargs args)
|
// implement LuaValue.onInvoke(Varargs args)
|
||||||
init = new InstructionList();
|
init = new InstructionList();
|
||||||
il = new InstructionList();
|
il = new InstructionList();
|
||||||
mg = new MethodGen(
|
mg = new MethodGen(
|
||||||
@@ -262,7 +262,7 @@ public class JavaBytecodeGenerator {
|
|||||||
TYPE_VARARGS, // return type
|
TYPE_VARARGS, // return type
|
||||||
new Type[] { TYPE_VARARGS }, // argument types
|
new Type[] { TYPE_VARARGS }, // argument types
|
||||||
new String[] { "args" }, // arg names
|
new String[] { "args" }, // arg names
|
||||||
"invoke", STR_LUAVALUE, // method, class
|
"onInvoke", STR_LUAVALUE, // method, class
|
||||||
il, cp);
|
il, cp);
|
||||||
factory = new InstructionFactory(cg);
|
factory = new InstructionFactory(cg);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user