Compare commits
13 Commits
mini2Dx/ma
...
v3.0.2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6694c375c9 | ||
|
|
e70eb5edc2 | ||
|
|
9688d3c5fc | ||
|
|
6f5af581e8 | ||
|
|
870aee2cae | ||
|
|
c2ec9edf39 | ||
|
|
cfb3aaca61 | ||
|
|
4105cebf1e | ||
|
|
339f004eb7 | ||
|
|
05a604645d | ||
|
|
63ead7aac7 | ||
|
|
c9ba2d4bb1 | ||
|
|
92cee0812d |
@@ -11,13 +11,13 @@ import org.luaj.vm2.lib.Bit32Lib;
|
||||
import org.luaj.vm2.lib.CoroutineLib;
|
||||
import org.luaj.vm2.lib.PackageLib;
|
||||
import org.luaj.vm2.lib.ResourceFinder;
|
||||
import org.luaj.vm2.lib.StringLib;
|
||||
import org.luaj.vm2.lib.TableLib;
|
||||
import org.luaj.vm2.lib.jse.CoerceJavaToLua;
|
||||
import org.luaj.vm2.lib.jse.JseBaseLib;
|
||||
import org.luaj.vm2.lib.jse.JseIoLib;
|
||||
import org.luaj.vm2.lib.jse.JseMathLib;
|
||||
import org.luaj.vm2.lib.jse.JseOsLib;
|
||||
import org.luaj.vm2.lib.jse.JseStringLib;
|
||||
import org.luaj.vm2.lib.jse.LuajavaLib;
|
||||
|
||||
/**
|
||||
@@ -76,7 +76,7 @@ public class SampleApplet extends Applet implements ResourceFinder {
|
||||
globals.load(new PackageLib());
|
||||
globals.load(new Bit32Lib());
|
||||
globals.load(new TableLib());
|
||||
globals.load(new StringLib());
|
||||
globals.load(new JseStringLib());
|
||||
globals.load(new CoroutineLib());
|
||||
globals.load(new JseMathLib());
|
||||
globals.load(new JseIoLib());
|
||||
|
||||
@@ -1,12 +1,26 @@
|
||||
import org.luaj.vm2.*;
|
||||
import org.luaj.vm2.Globals;
|
||||
import org.luaj.vm2.LoadState;
|
||||
import org.luaj.vm2.LuaBoolean;
|
||||
import org.luaj.vm2.LuaString;
|
||||
import org.luaj.vm2.LuaTable;
|
||||
import org.luaj.vm2.LuaThread;
|
||||
import org.luaj.vm2.LuaValue;
|
||||
import org.luaj.vm2.Varargs;
|
||||
import org.luaj.vm2.compiler.LuaC;
|
||||
import org.luaj.vm2.lib.*;
|
||||
import org.luaj.vm2.lib.jse.*;
|
||||
import org.luaj.vm2.lib.Bit32Lib;
|
||||
import org.luaj.vm2.lib.DebugLib;
|
||||
import org.luaj.vm2.lib.PackageLib;
|
||||
import org.luaj.vm2.lib.TableLib;
|
||||
import org.luaj.vm2.lib.TwoArgFunction;
|
||||
import org.luaj.vm2.lib.ZeroArgFunction;
|
||||
import org.luaj.vm2.lib.jse.JseBaseLib;
|
||||
import org.luaj.vm2.lib.jse.JseMathLib;
|
||||
import org.luaj.vm2.lib.jse.JseStringLib;
|
||||
|
||||
/** Simple program that illustrates basic sand-boxing of client scripts
|
||||
* in a server environment.
|
||||
*
|
||||
* <p>Although this sandboxing is done primarily in Java here, these
|
||||
* <p>Although this sandboxing is done primarily in Java here, these
|
||||
* same techniques should all be possible directly from lua using metatables,
|
||||
* and examples are shown in examples/lua/samplesandboxed.lua.
|
||||
*
|
||||
@@ -29,7 +43,7 @@ public class SampleSandboxed {
|
||||
server_globals = new Globals();
|
||||
server_globals.load(new JseBaseLib());
|
||||
server_globals.load(new PackageLib());
|
||||
server_globals.load(new StringLib());
|
||||
server_globals.load(new JseStringLib());
|
||||
|
||||
// To load scripts, we occasionally need a math library in addition to compiler support.
|
||||
// To limit scripts using the debug library, they must be closures, so we only install LuaC.
|
||||
@@ -47,7 +61,7 @@ public class SampleSandboxed {
|
||||
runScriptInSandbox( "return getmetatable('abc').len" );
|
||||
runScriptInSandbox( "return getmetatable('abc').__index" );
|
||||
|
||||
// Example user scripts that attempt rogue operations, and will fail.
|
||||
// Example user scripts that attempt rogue operations, and will fail.
|
||||
runScriptInSandbox( "return setmetatable('abc', {})" );
|
||||
runScriptInSandbox( "getmetatable('abc').len = function() end" );
|
||||
runScriptInSandbox( "getmetatable('abc').__index = {}" );
|
||||
@@ -61,9 +75,9 @@ public class SampleSandboxed {
|
||||
LuaValue.ADD, new TwoArgFunction() {
|
||||
public LuaValue call(LuaValue x, LuaValue y) {
|
||||
return LuaValue.valueOf(
|
||||
(x == TRUE ? 1.0 : x.todouble()) +
|
||||
(x == TRUE ? 1.0 : x.todouble()) +
|
||||
(y == TRUE ? 1.0 : y.todouble()) );
|
||||
}
|
||||
}
|
||||
},
|
||||
}));
|
||||
runScriptInSandbox( "return 5 + 6, 5 + true, false + 6" );
|
||||
@@ -75,21 +89,21 @@ public class SampleSandboxed {
|
||||
// that contain functions that can be abused.
|
||||
static void runScriptInSandbox(String script) {
|
||||
|
||||
// Each script will have it's own set of globals, which should
|
||||
// Each script will have it's own set of globals, which should
|
||||
// prevent leakage between scripts running on the same server.
|
||||
Globals user_globals = new Globals();
|
||||
user_globals.load(new JseBaseLib());
|
||||
user_globals.load(new PackageLib());
|
||||
user_globals.load(new Bit32Lib());
|
||||
user_globals.load(new TableLib());
|
||||
user_globals.load(new StringLib());
|
||||
user_globals.load(new JseStringLib());
|
||||
user_globals.load(new JseMathLib());
|
||||
|
||||
// This library is dangerous as it gives unfettered access to the
|
||||
// entire Java VM, so it's not suitable within this lightweight sandbox.
|
||||
// entire Java VM, so it's not suitable within this lightweight sandbox.
|
||||
// user_globals.load(new LuajavaLib());
|
||||
|
||||
// Starting coroutines in scripts will result in threads that are
|
||||
// Starting coroutines in scripts will result in threads that are
|
||||
// not under the server control, so this libary should probably remain out.
|
||||
// user_globals.load(new CoroutineLib());
|
||||
|
||||
@@ -98,12 +112,12 @@ public class SampleSandboxed {
|
||||
// user_globals.load(new JseIoLib());
|
||||
// user_globals.load(new JseOsLib());
|
||||
|
||||
// Loading and compiling scripts from within scripts may also be
|
||||
// Loading and compiling scripts from within scripts may also be
|
||||
// prohibited, though in theory it should be fairly safe.
|
||||
// LoadState.install(user_globals);
|
||||
// LuaC.install(user_globals);
|
||||
|
||||
// The debug library must be loaded for hook functions to work, which
|
||||
// The debug library must be loaded for hook functions to work, which
|
||||
// allow us to limit scripts to run a certain number of instructions at a time.
|
||||
// However we don't wish to expose the library in the user globals,
|
||||
// so it is immediately removed from the user globals once created.
|
||||
@@ -111,18 +125,18 @@ public class SampleSandboxed {
|
||||
LuaValue sethook = user_globals.get("debug").get("sethook");
|
||||
user_globals.set("debug", LuaValue.NIL);
|
||||
|
||||
// Set up the script to run in its own lua thread, which allows us
|
||||
// Set up the script to run in its own lua thread, which allows us
|
||||
// to set a hook function that limits the script to a specific number of cycles.
|
||||
// Note that the environment is set to the user globals, even though the
|
||||
// Note that the environment is set to the user globals, even though the
|
||||
// compiling is done with the server globals.
|
||||
LuaValue chunk = server_globals.load(script, "main", user_globals);
|
||||
LuaThread thread = new LuaThread(user_globals, chunk);
|
||||
|
||||
// Set the hook function to immediately throw an Error, which will not be
|
||||
// Set the hook function to immediately throw an Error, which will not be
|
||||
// handled by any Lua code other than the coroutine.
|
||||
LuaValue hookfunc = new ZeroArgFunction() {
|
||||
public LuaValue call() {
|
||||
// A simple lua error may be caught by the script, but a
|
||||
// A simple lua error may be caught by the script, but a
|
||||
// Java Error will pass through to top and stop the script.
|
||||
throw new Error("Script overran resource limits.");
|
||||
}
|
||||
|
||||
@@ -177,7 +177,14 @@ public class LuaDouble extends LuaNumber {
|
||||
* @see #dmod_d(double, double)
|
||||
*/
|
||||
public static LuaValue dmod(double lhs, double rhs) {
|
||||
return rhs!=0? valueOf( lhs-rhs*Math.floor(lhs/rhs) ): NAN;
|
||||
if (rhs == 0 || lhs == Double.POSITIVE_INFINITY || lhs == Double.NEGATIVE_INFINITY) return NAN;
|
||||
if (rhs == Double.POSITIVE_INFINITY) {
|
||||
return lhs < 0 ? POSINF : valueOf(lhs);
|
||||
}
|
||||
if (rhs == Double.NEGATIVE_INFINITY) {
|
||||
return lhs > 0 ? NEGINF : valueOf(lhs);
|
||||
}
|
||||
return valueOf( lhs-rhs*Math.floor(lhs/rhs) );
|
||||
}
|
||||
|
||||
/** Take modulo for double numbers according to lua math, and return a double result.
|
||||
@@ -188,7 +195,14 @@ public class LuaDouble extends LuaNumber {
|
||||
* @see #dmod(double, double)
|
||||
*/
|
||||
public static double dmod_d(double lhs, double rhs) {
|
||||
return rhs!=0? lhs-rhs*Math.floor(lhs/rhs): Double.NaN;
|
||||
if (rhs == 0 || lhs == Double.POSITIVE_INFINITY || lhs == Double.NEGATIVE_INFINITY) return Double.NaN;
|
||||
if (rhs == Double.POSITIVE_INFINITY) {
|
||||
return lhs < 0 ? Double.POSITIVE_INFINITY : lhs;
|
||||
}
|
||||
if (rhs == Double.NEGATIVE_INFINITY) {
|
||||
return lhs > 0 ? Double.NEGATIVE_INFINITY : lhs;
|
||||
}
|
||||
return lhs-rhs*Math.floor(lhs/rhs);
|
||||
}
|
||||
|
||||
// relational operators
|
||||
|
||||
@@ -391,23 +391,23 @@ public class LuaString extends LuaValue {
|
||||
public short toshort() { return (short) toint(); }
|
||||
|
||||
public double optdouble(double defval) {
|
||||
return checknumber().checkdouble();
|
||||
return checkdouble();
|
||||
}
|
||||
|
||||
public int optint(int defval) {
|
||||
return checknumber().checkint();
|
||||
return checkint();
|
||||
}
|
||||
|
||||
public LuaInteger optinteger(LuaInteger defval) {
|
||||
return checknumber().checkinteger();
|
||||
return checkinteger();
|
||||
}
|
||||
|
||||
public long optlong(long defval) {
|
||||
return checknumber().checklong();
|
||||
return checklong();
|
||||
}
|
||||
|
||||
public LuaNumber optnumber(LuaNumber defval) {
|
||||
return checknumber().checknumber();
|
||||
return checknumber();
|
||||
}
|
||||
|
||||
public LuaString optstring(LuaString defval) {
|
||||
|
||||
@@ -643,7 +643,7 @@ public class LuaValue extends Varargs {
|
||||
* @see #isnumber()
|
||||
* @see #TNUMBER
|
||||
*/
|
||||
public double optdouble(double defval) { argerror("double"); return 0; }
|
||||
public double optdouble(double defval) { argerror("number"); return 0; }
|
||||
|
||||
/** Check that optional argument is a function and return as {@link LuaFunction}
|
||||
* <p>
|
||||
@@ -855,7 +855,7 @@ public class LuaValue extends Varargs {
|
||||
* @see #optdouble(double)
|
||||
* @see #TNUMBER
|
||||
*/
|
||||
public double checkdouble() { argerror("double"); return 0; }
|
||||
public double checkdouble() { argerror("number"); return 0; }
|
||||
|
||||
/** Check that the value is a function , or throw {@link LuaError} if not
|
||||
* <p>
|
||||
|
||||
@@ -299,7 +299,8 @@ public class BaseLib extends TwoArgFunction implements ResourceFinder {
|
||||
}
|
||||
public LuaValue call(LuaValue table, LuaValue index, LuaValue value) {
|
||||
LuaTable t = table.checktable();
|
||||
t.rawset(index.checknotnil(), value);
|
||||
if (!index.isvalidkey()) argerror(2, "value");
|
||||
t.rawset(index, value);
|
||||
return t;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,15 +27,15 @@ import org.luaj.vm2.Varargs;
|
||||
|
||||
/**
|
||||
* Subclass of LibFunction that implements the Lua standard {@code bit32} library.
|
||||
* <p>
|
||||
* Typically, this library is included as part of a call to either
|
||||
* <p>
|
||||
* Typically, this library is included as part of a call to either
|
||||
* {@link org.luaj.vm2.lib.jse.JsePlatform#standardGlobals()} or {@link org.luaj.vm2.lib.jme.JmePlatform#standardGlobals()}
|
||||
* <pre> {@code
|
||||
* Globals globals = JsePlatform.standardGlobals();
|
||||
* System.out.println( globals.get("bit32").get("bnot").call( LuaValue.valueOf(2) ) );
|
||||
* } </pre>
|
||||
* <p>
|
||||
* To instantiate and use it directly,
|
||||
* To instantiate and use it directly,
|
||||
* link it into your globals table via {@link LuaValue#load(LuaValue)} using code such as:
|
||||
* <pre> {@code
|
||||
* Globals globals = new Globals();
|
||||
@@ -71,7 +71,7 @@ public class Bit32Lib extends TwoArgFunction {
|
||||
"arshift", "lrotate", "lshift", "rrotate", "rshift"
|
||||
});
|
||||
env.set("bit32", t);
|
||||
env.get("package").get("loaded").set("bit32", t);
|
||||
if (!env.get("package").isnil()) env.get("package").get("loaded").set("bit32", t);
|
||||
return t;
|
||||
}
|
||||
|
||||
@@ -219,6 +219,6 @@ public class Bit32Lib extends TwoArgFunction {
|
||||
}
|
||||
|
||||
private static LuaValue bitsToValue( int x ) {
|
||||
return ( x < 0 ) ? valueOf((double) ((long) x & 0xFFFFFFFFL)) : valueOf(x);
|
||||
return ( x < 0 ) ? valueOf((double) ((long) x & 0xFFFFFFFFL)) : valueOf(x);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,25 +27,25 @@ import org.luaj.vm2.LuaThread;
|
||||
import org.luaj.vm2.LuaValue;
|
||||
import org.luaj.vm2.Varargs;
|
||||
|
||||
/**
|
||||
* Subclass of {@link LibFunction} which implements the lua standard {@code coroutine}
|
||||
* library.
|
||||
* <p>
|
||||
/**
|
||||
* Subclass of {@link LibFunction} which implements the lua standard {@code coroutine}
|
||||
* library.
|
||||
* <p>
|
||||
* The coroutine library in luaj has the same behavior as the
|
||||
* coroutine library in C, but is implemented using Java Threads to maintain
|
||||
* the call state between invocations. Therefore it can be yielded from anywhere,
|
||||
* coroutine library in C, but is implemented using Java Threads to maintain
|
||||
* the call state between invocations. Therefore it can be yielded from anywhere,
|
||||
* similar to the "Coco" yield-from-anywhere patch available for C-based lua.
|
||||
* However, coroutines that are yielded but never resumed to complete their execution
|
||||
* may not be collected by the garbage collector.
|
||||
* <p>
|
||||
* Typically, this library is included as part of a call to either
|
||||
* may not be collected by the garbage collector.
|
||||
* <p>
|
||||
* Typically, this library is included as part of a call to either
|
||||
* {@link org.luaj.vm2.lib.jse.JsePlatform#standardGlobals()} or {@link org.luaj.vm2.lib.jme.JmePlatform#standardGlobals()}
|
||||
* <pre> {@code
|
||||
* Globals globals = JsePlatform.standardGlobals();
|
||||
* System.out.println( globals.get("coroutine").get("running").call() );
|
||||
* } </pre>
|
||||
* <p>
|
||||
* To instantiate and use it directly,
|
||||
* To instantiate and use it directly,
|
||||
* link it into your globals table via {@link LuaValue#load(LuaValue)} using code such as:
|
||||
* <pre> {@code
|
||||
* Globals globals = new Globals();
|
||||
@@ -82,7 +82,7 @@ public class CoroutineLib extends TwoArgFunction {
|
||||
coroutine.set("yield", new yield());
|
||||
coroutine.set("wrap", new wrap());
|
||||
env.set("coroutine", coroutine);
|
||||
env.get("package").get("loaded").set("coroutine", coroutine);
|
||||
if (!env.get("package").isnil()) env.get("package").get("loaded").set("coroutine", coroutine);
|
||||
return coroutine;
|
||||
}
|
||||
|
||||
|
||||
@@ -38,26 +38,26 @@ import org.luaj.vm2.Print;
|
||||
import org.luaj.vm2.Prototype;
|
||||
import org.luaj.vm2.Varargs;
|
||||
|
||||
/**
|
||||
* Subclass of {@link LibFunction} which implements the lua standard {@code debug}
|
||||
* library.
|
||||
* <p>
|
||||
/**
|
||||
* Subclass of {@link LibFunction} which implements the lua standard {@code debug}
|
||||
* library.
|
||||
* <p>
|
||||
* The debug library in luaj tries to emulate the behavior of the corresponding C-based lua library.
|
||||
* To do this, it must maintain a separate stack of calls to {@link LuaClosure} and {@link LibFunction}
|
||||
* instances.
|
||||
* To do this, it must maintain a separate stack of calls to {@link LuaClosure} and {@link LibFunction}
|
||||
* instances.
|
||||
* Especially when lua-to-java bytecode compiling is being used
|
||||
* via a {@link org.luaj.vm2.Globals.Compiler} such as {@link org.luaj.vm2.luajc.LuaJC},
|
||||
* this cannot be done in all cases.
|
||||
* <p>
|
||||
* Typically, this library is included as part of a call to either
|
||||
* {@link org.luaj.vm2.lib.jse.JsePlatform#debugGlobals()} or
|
||||
* via a {@link org.luaj.vm2.Globals.Compiler} such as {@link org.luaj.vm2.luajc.LuaJC},
|
||||
* this cannot be done in all cases.
|
||||
* <p>
|
||||
* Typically, this library is included as part of a call to either
|
||||
* {@link org.luaj.vm2.lib.jse.JsePlatform#debugGlobals()} or
|
||||
* {@link org.luaj.vm2.lib.jme.JmePlatform#debugGlobals()}
|
||||
* <pre> {@code
|
||||
* Globals globals = JsePlatform.debugGlobals();
|
||||
* System.out.println( globals.get("debug").get("traceback").call() );
|
||||
* } </pre>
|
||||
* <p>
|
||||
* To instantiate and use it directly,
|
||||
* To instantiate and use it directly,
|
||||
* link it into your globals table via {@link LuaValue#load(LuaValue)} using code such as:
|
||||
* <pre> {@code
|
||||
* Globals globals = new Globals();
|
||||
@@ -84,27 +84,27 @@ public class DebugLib extends TwoArgFunction {
|
||||
try { TRACE = (null != System.getProperty("TRACE")); } catch (Exception e) {}
|
||||
}
|
||||
|
||||
static final LuaString LUA = valueOf("Lua");
|
||||
private static final LuaString QMARK = valueOf("?");
|
||||
private static final LuaString CALL = valueOf("call");
|
||||
private static final LuaString LINE = valueOf("line");
|
||||
private static final LuaString COUNT = valueOf("count");
|
||||
static final LuaString LUA = valueOf("Lua");
|
||||
private static final LuaString QMARK = valueOf("?");
|
||||
private static final LuaString CALL = valueOf("call");
|
||||
private static final LuaString LINE = valueOf("line");
|
||||
private static final LuaString COUNT = valueOf("count");
|
||||
private static final LuaString RETURN = valueOf("return");
|
||||
|
||||
static final LuaString FUNC = valueOf("func");
|
||||
static final LuaString ISTAILCALL = valueOf("istailcall");
|
||||
static final LuaString ISVARARG = valueOf("isvararg");
|
||||
static final LuaString NUPS = valueOf("nups");
|
||||
static final LuaString NPARAMS = valueOf("nparams");
|
||||
static final LuaString NAME = valueOf("name");
|
||||
static final LuaString NAMEWHAT = valueOf("namewhat");
|
||||
static final LuaString WHAT = valueOf("what");
|
||||
static final LuaString SOURCE = valueOf("source");
|
||||
static final LuaString SHORT_SRC = valueOf("short_src");
|
||||
static final LuaString LINEDEFINED = valueOf("linedefined");
|
||||
static final LuaString LASTLINEDEFINED = valueOf("lastlinedefined");
|
||||
static final LuaString CURRENTLINE = valueOf("currentline");
|
||||
static final LuaString ACTIVELINES = valueOf("activelines");
|
||||
static final LuaString FUNC = valueOf("func");
|
||||
static final LuaString ISTAILCALL = valueOf("istailcall");
|
||||
static final LuaString ISVARARG = valueOf("isvararg");
|
||||
static final LuaString NUPS = valueOf("nups");
|
||||
static final LuaString NPARAMS = valueOf("nparams");
|
||||
static final LuaString NAME = valueOf("name");
|
||||
static final LuaString NAMEWHAT = valueOf("namewhat");
|
||||
static final LuaString WHAT = valueOf("what");
|
||||
static final LuaString SOURCE = valueOf("source");
|
||||
static final LuaString SHORT_SRC = valueOf("short_src");
|
||||
static final LuaString LINEDEFINED = valueOf("linedefined");
|
||||
static final LuaString LASTLINEDEFINED = valueOf("lastlinedefined");
|
||||
static final LuaString CURRENTLINE = valueOf("currentline");
|
||||
static final LuaString ACTIVELINES = valueOf("activelines");
|
||||
|
||||
Globals globals;
|
||||
|
||||
@@ -135,19 +135,19 @@ public class DebugLib extends TwoArgFunction {
|
||||
debug.set("upvalueid", new upvalueid());
|
||||
debug.set("upvaluejoin", new upvaluejoin());
|
||||
env.set("debug", debug);
|
||||
env.get("package").get("loaded").set("debug", debug);
|
||||
if (!env.get("package").isnil()) env.get("package").get("loaded").set("debug", debug);
|
||||
return debug;
|
||||
}
|
||||
|
||||
// debug.debug()
|
||||
static final class debug extends ZeroArgFunction {
|
||||
static final class debug extends ZeroArgFunction {
|
||||
public LuaValue call() {
|
||||
return NONE;
|
||||
}
|
||||
}
|
||||
|
||||
// debug.gethook ([thread])
|
||||
final class gethook extends VarArgFunction {
|
||||
final class gethook extends VarArgFunction {
|
||||
public Varargs invoke(Varargs args) {
|
||||
LuaThread t = args.narg() > 0 ? args.checkthread(1): globals.running;
|
||||
LuaThread.State s = t.state;
|
||||
@@ -159,10 +159,10 @@ public class DebugLib extends TwoArgFunction {
|
||||
}
|
||||
|
||||
// debug.getinfo ([thread,] f [, what])
|
||||
final class getinfo extends VarArgFunction {
|
||||
final class getinfo extends VarArgFunction {
|
||||
public Varargs invoke(Varargs args) {
|
||||
int a=1;
|
||||
LuaThread thread = args.isthread(a)? args.checkthread(a++): globals.running;
|
||||
LuaThread thread = args.isthread(a)? args.checkthread(a++): globals.running;
|
||||
LuaValue func = args.arg(a++);
|
||||
String what = args.optjstring(a++, "flnStu");
|
||||
DebugLib.CallStack callstack = callstack(thread);
|
||||
@@ -222,10 +222,10 @@ public class DebugLib extends TwoArgFunction {
|
||||
}
|
||||
|
||||
// debug.getlocal ([thread,] f, local)
|
||||
final class getlocal extends VarArgFunction {
|
||||
final class getlocal extends VarArgFunction {
|
||||
public Varargs invoke(Varargs args) {
|
||||
int a=1;
|
||||
LuaThread thread = args.isthread(a)? args.checkthread(a++): globals.running;
|
||||
LuaThread thread = args.isthread(a)? args.checkthread(a++): globals.running;
|
||||
int level = args.checkint(a++);
|
||||
int local = args.checkint(a++);
|
||||
CallFrame f = callstack(thread).getCallFrame(level);
|
||||
@@ -249,7 +249,7 @@ public class DebugLib extends TwoArgFunction {
|
||||
}
|
||||
|
||||
// debug.getupvalue (f, up)
|
||||
static final class getupvalue extends VarArgFunction {
|
||||
static final class getupvalue extends VarArgFunction {
|
||||
public Varargs invoke(Varargs args) {
|
||||
LuaValue func = args.checkfunction(1);
|
||||
int up = args.checkint(2);
|
||||
@@ -265,7 +265,7 @@ public class DebugLib extends TwoArgFunction {
|
||||
}
|
||||
|
||||
// debug.getuservalue (u)
|
||||
static final class getuservalue extends LibFunction {
|
||||
static final class getuservalue extends LibFunction {
|
||||
public LuaValue call(LuaValue u) {
|
||||
return u.isuserdata()? u: NIL;
|
||||
}
|
||||
@@ -273,10 +273,10 @@ public class DebugLib extends TwoArgFunction {
|
||||
|
||||
|
||||
// debug.sethook ([thread,] hook, mask [, count])
|
||||
final class sethook extends VarArgFunction {
|
||||
final class sethook extends VarArgFunction {
|
||||
public Varargs invoke(Varargs args) {
|
||||
int a=1;
|
||||
LuaThread t = args.isthread(a)? args.checkthread(a++): globals.running;
|
||||
LuaThread t = args.isthread(a)? args.checkthread(a++): globals.running;
|
||||
LuaValue func = args.optfunction(a++, null);
|
||||
String str = args.optjstring(a++,"");
|
||||
int count = args.optint(a++,0);
|
||||
@@ -298,20 +298,20 @@ public class DebugLib extends TwoArgFunction {
|
||||
}
|
||||
|
||||
// debug.setlocal ([thread,] level, local, value)
|
||||
final class setlocal extends VarArgFunction {
|
||||
final class setlocal extends VarArgFunction {
|
||||
public Varargs invoke(Varargs args) {
|
||||
int a=1;
|
||||
LuaThread thread = args.isthread(a)? args.checkthread(a++): globals.running;
|
||||
LuaThread thread = args.isthread(a)? args.checkthread(a++): globals.running;
|
||||
int level = args.checkint(a++);
|
||||
int local = args.checkint(a++);
|
||||
LuaValue value = args.arg(a++);
|
||||
CallFrame f = callstack(thread).getCallFrame(level);
|
||||
CallFrame f = callstack(thread).getCallFrame(level);
|
||||
return f != null? f.setLocal(local, value): NONE;
|
||||
}
|
||||
}
|
||||
|
||||
// debug.setmetatable (value, table)
|
||||
static final class setmetatable extends TwoArgFunction {
|
||||
static final class setmetatable extends TwoArgFunction {
|
||||
public LuaValue call(LuaValue value, LuaValue table) {
|
||||
LuaValue mt = table.opttable(null);
|
||||
switch ( value.type() ) {
|
||||
@@ -328,7 +328,7 @@ public class DebugLib extends TwoArgFunction {
|
||||
}
|
||||
|
||||
// debug.setupvalue (f, up, value)
|
||||
static final class setupvalue extends VarArgFunction {
|
||||
static final class setupvalue extends VarArgFunction {
|
||||
public Varargs invoke(Varargs args) {
|
||||
LuaValue func = args.checkfunction(1);
|
||||
int up = args.checkint(2);
|
||||
@@ -346,7 +346,7 @@ public class DebugLib extends TwoArgFunction {
|
||||
}
|
||||
|
||||
// debug.setuservalue (udata, value)
|
||||
static final class setuservalue extends VarArgFunction {
|
||||
static final class setuservalue extends VarArgFunction {
|
||||
public Varargs invoke(Varargs args) {
|
||||
Object o = args.checkuserdata(1);
|
||||
LuaValue v = args.checkvalue(2);
|
||||
@@ -358,10 +358,10 @@ public class DebugLib extends TwoArgFunction {
|
||||
}
|
||||
|
||||
// debug.traceback ([thread,] [message [, level]])
|
||||
final class traceback extends VarArgFunction {
|
||||
final class traceback extends VarArgFunction {
|
||||
public Varargs invoke(Varargs args) {
|
||||
int a=1;
|
||||
LuaThread thread = args.isthread(a)? args.checkthread(a++): globals.running;
|
||||
LuaThread thread = args.isthread(a)? args.checkthread(a++): globals.running;
|
||||
String message = args.optjstring(a++, null);
|
||||
int level = args.optint(a++,1);
|
||||
String tb = callstack(thread).traceback(level);
|
||||
@@ -370,7 +370,7 @@ public class DebugLib extends TwoArgFunction {
|
||||
}
|
||||
|
||||
// debug.upvalueid (f, n)
|
||||
static final class upvalueid extends VarArgFunction {
|
||||
static final class upvalueid extends VarArgFunction {
|
||||
public Varargs invoke(Varargs args) {
|
||||
LuaValue func = args.checkfunction(1);
|
||||
int up = args.checkint(2);
|
||||
@@ -385,7 +385,7 @@ public class DebugLib extends TwoArgFunction {
|
||||
}
|
||||
|
||||
// debug.upvaluejoin (f1, n1, f2, n2)
|
||||
static final class upvaluejoin extends VarArgFunction {
|
||||
static final class upvaluejoin extends VarArgFunction {
|
||||
public Varargs invoke(Varargs args) {
|
||||
LuaClosure f1 = args.checkclosure(1);
|
||||
int n1 = args.checkint(2);
|
||||
@@ -587,7 +587,7 @@ public class DebugLib extends TwoArgFunction {
|
||||
if (frame[calls-i].f == func)
|
||||
return frame[i];
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
synchronized DebugInfo auxgetinfo(String what, LuaFunction f, CallFrame ci) {
|
||||
@@ -641,7 +641,7 @@ public class DebugLib extends TwoArgFunction {
|
||||
}
|
||||
}
|
||||
return ar;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -694,7 +694,7 @@ public class DebugLib extends TwoArgFunction {
|
||||
int currentline() {
|
||||
if ( !f.isclosure() ) return -1;
|
||||
int[] li = f.checkclosure().p.lineinfo;
|
||||
return li==null || pc<0 || pc>=li.length? -1: li[pc];
|
||||
return li==null || pc<0 || pc>=li.length? -1: li[pc];
|
||||
}
|
||||
String sourceline() {
|
||||
if ( !f.isclosure() ) return f.tojstring();
|
||||
@@ -721,7 +721,7 @@ public class DebugLib extends TwoArgFunction {
|
||||
|
||||
static void lua_assert(boolean x) {
|
||||
if (!x) throw new RuntimeException("lua_assert failed");
|
||||
}
|
||||
}
|
||||
|
||||
static class NameWhat {
|
||||
final String name;
|
||||
|
||||
@@ -31,31 +31,31 @@ import org.luaj.vm2.LuaTable;
|
||||
import org.luaj.vm2.LuaValue;
|
||||
import org.luaj.vm2.Varargs;
|
||||
|
||||
/**
|
||||
* Abstract base class extending {@link LibFunction} which implements the
|
||||
* core of the lua standard {@code io} library.
|
||||
* <p>
|
||||
/**
|
||||
* Abstract base class extending {@link LibFunction} which implements the
|
||||
* core of the lua standard {@code io} library.
|
||||
* <p>
|
||||
* It contains the implementation of the io library support that is common to
|
||||
* the JSE and JME platforms.
|
||||
* In practice on of the concrete IOLib subclasses is chosen:
|
||||
* {@link org.luaj.vm2.lib.jse.JseIoLib} for the JSE platform, and
|
||||
* the JSE and JME platforms.
|
||||
* In practice on of the concrete IOLib subclasses is chosen:
|
||||
* {@link org.luaj.vm2.lib.jse.JseIoLib} for the JSE platform, and
|
||||
* {@link org.luaj.vm2.lib.jme.JmeIoLib} for the JME platform.
|
||||
* <p>
|
||||
* The JSE implementation conforms almost completely to the C-based lua library,
|
||||
* while the JME implementation follows closely except in the area of random-access files,
|
||||
* which are difficult to support properly on JME.
|
||||
* <p>
|
||||
* Typically, this library is included as part of a call to either
|
||||
* The JSE implementation conforms almost completely to the C-based lua library,
|
||||
* while the JME implementation follows closely except in the area of random-access files,
|
||||
* which are difficult to support properly on JME.
|
||||
* <p>
|
||||
* Typically, this library is included as part of a call to either
|
||||
* {@link org.luaj.vm2.lib.jse.JsePlatform#standardGlobals()} or {@link org.luaj.vm2.lib.jme.JmePlatform#standardGlobals()}
|
||||
* <pre> {@code
|
||||
* Globals globals = JsePlatform.standardGlobals();
|
||||
* globals.get("io").get("write").call(LuaValue.valueOf("hello, world\n"));
|
||||
* } </pre>
|
||||
* In this example the platform-specific {@link org.luaj.vm2.lib.jse.JseIoLib} library will be loaded, which will include
|
||||
* the base functionality provided by this class, whereas the {@link org.luaj.vm2.lib.jse.JsePlatform} would load the
|
||||
* the base functionality provided by this class, whereas the {@link org.luaj.vm2.lib.jse.JsePlatform} would load the
|
||||
* {@link org.luaj.vm2.lib.jse.JseIoLib}.
|
||||
* <p>
|
||||
* To instantiate and use it directly,
|
||||
* To instantiate and use it directly,
|
||||
* link it into your globals table via {@link LuaValue#load(LuaValue)} using code such as:
|
||||
* <pre> {@code
|
||||
* Globals globals = new Globals();
|
||||
@@ -73,10 +73,10 @@ import org.luaj.vm2.Varargs;
|
||||
* @see org.luaj.vm2.lib.jme.JmeIoLib
|
||||
* @see <a href="http://www.lua.org/manual/5.1/manual.html#5.7">http://www.lua.org/manual/5.1/manual.html#5.7</a>
|
||||
*/
|
||||
abstract
|
||||
abstract
|
||||
public class IoLib extends TwoArgFunction {
|
||||
|
||||
abstract
|
||||
abstract
|
||||
protected class File extends LuaValue{
|
||||
abstract public void write( LuaString string ) throws IOException;
|
||||
abstract public void flush() throws IOException;
|
||||
@@ -85,12 +85,12 @@ public class IoLib extends TwoArgFunction {
|
||||
abstract public boolean isclosed();
|
||||
// returns new position
|
||||
abstract public int seek(String option, int bytecount) throws IOException;
|
||||
abstract public void setvbuf(String mode, int size);
|
||||
abstract public void setvbuf(String mode, int size);
|
||||
// get length remaining to read
|
||||
abstract public int remaining() throws IOException;
|
||||
abstract public int remaining() throws IOException;
|
||||
// peek ahead one character
|
||||
abstract public int peek() throws IOException, EOFException;
|
||||
// return char if read, -1 if eof, throw IOException on other exception
|
||||
abstract public int peek() throws IOException, EOFException;
|
||||
// return char if read, -1 if eof, throw IOException on other exception
|
||||
abstract public int read() throws IOException, EOFException;
|
||||
// return number of bytes read if positive, false if eof, throw IOException on other exception
|
||||
abstract public int read(byte[] bytes, int offset, int length) throws IOException;
|
||||
@@ -123,29 +123,29 @@ public class IoLib extends TwoArgFunction {
|
||||
/** Enumerated value representing a file type for a named file */
|
||||
protected static final int FTYPE_NAMED = 3;
|
||||
|
||||
/**
|
||||
* Wrap the standard input.
|
||||
* @return File
|
||||
/**
|
||||
* Wrap the standard input.
|
||||
* @return File
|
||||
* @throws IOException
|
||||
*/
|
||||
abstract protected File wrapStdin() throws IOException;
|
||||
|
||||
/**
|
||||
* Wrap the standard output.
|
||||
* @return File
|
||||
/**
|
||||
* Wrap the standard output.
|
||||
* @return File
|
||||
* @throws IOException
|
||||
*/
|
||||
abstract protected File wrapStdout() throws IOException;
|
||||
|
||||
/**
|
||||
* Wrap the standard error output.
|
||||
* @return File
|
||||
/**
|
||||
* Wrap the standard error output.
|
||||
* @return File
|
||||
* @throws IOException
|
||||
*/
|
||||
abstract protected File wrapStderr() throws IOException;
|
||||
|
||||
/**
|
||||
* Open a file in a particular mode.
|
||||
* Open a file in a particular mode.
|
||||
* @param filename
|
||||
* @param readMode true if opening in read mode
|
||||
* @param appendMode true if opening in append mode
|
||||
@@ -157,7 +157,7 @@ public class IoLib extends TwoArgFunction {
|
||||
abstract protected File openFile( String filename, boolean readMode, boolean appendMode, boolean updateMode, boolean binaryMode ) throws IOException;
|
||||
|
||||
/**
|
||||
* Open a temporary file.
|
||||
* Open a temporary file.
|
||||
* @return File object if successful
|
||||
* @throws IOException if could not be opened
|
||||
*/
|
||||
@@ -167,7 +167,7 @@ public class IoLib extends TwoArgFunction {
|
||||
* Start a new process and return a file for input or output
|
||||
* @param prog the program to execute
|
||||
* @param mode "r" to read, "w" to write
|
||||
* @return File to read to or write from
|
||||
* @return File to read to or write from
|
||||
* @throws IOException if an i/o exception occurs
|
||||
*/
|
||||
abstract protected File openProgram(String prog, String mode) throws IOException;
|
||||
@@ -178,7 +178,7 @@ public class IoLib extends TwoArgFunction {
|
||||
|
||||
private static final LuaValue STDIN = valueOf("stdin");
|
||||
private static final LuaValue STDOUT = valueOf("stdout");
|
||||
private static final LuaValue STDERR = valueOf("stderr");
|
||||
private static final LuaValue STDERR = valueOf("stderr");
|
||||
private static final LuaValue FILE = valueOf("file");
|
||||
private static final LuaValue CLOSED_FILE = valueOf("closed file");
|
||||
|
||||
@@ -256,7 +256,7 @@ public class IoLib extends TwoArgFunction {
|
||||
|
||||
// return the table
|
||||
env.set("io", t);
|
||||
env.get("package").get("loaded").set("io", t);
|
||||
if (!env.get("package").isnil()) env.get("package").get("loaded").set("io", t);
|
||||
return t;
|
||||
}
|
||||
|
||||
@@ -316,7 +316,7 @@ public class IoLib extends TwoArgFunction {
|
||||
return infile!=null? infile: (infile=ioopenfile(FTYPE_STDIN, "-","r"));
|
||||
}
|
||||
|
||||
// io.flush() -> bool
|
||||
// io.flush() -> bool
|
||||
public Varargs _io_flush() throws IOException {
|
||||
checkopen(output());
|
||||
outfile.flush();
|
||||
@@ -337,7 +337,7 @@ public class IoLib extends TwoArgFunction {
|
||||
|
||||
// io.input([file]) -> file
|
||||
public Varargs _io_input(LuaValue file) {
|
||||
infile = file.isnil()? input():
|
||||
infile = file.isnil()? input():
|
||||
file.isstring()? ioopenfile(FTYPE_NAMED, file.checkjstring(),"r"):
|
||||
checkfile(file);
|
||||
return infile;
|
||||
@@ -345,7 +345,7 @@ public class IoLib extends TwoArgFunction {
|
||||
|
||||
// io.output(filename) -> file
|
||||
public Varargs _io_output(LuaValue filename) {
|
||||
outfile = filename.isnil()? output():
|
||||
outfile = filename.isnil()? output():
|
||||
filename.isstring()? ioopenfile(FTYPE_NAMED, filename.checkjstring(),"w"):
|
||||
checkfile(filename);
|
||||
return outfile;
|
||||
@@ -420,7 +420,7 @@ public class IoLib extends TwoArgFunction {
|
||||
return valueOf( checkfile(file).seek(whence,offset) );
|
||||
}
|
||||
|
||||
// file:write(...) -> void
|
||||
// file:write(...) -> void
|
||||
public Varargs _file_write(LuaValue file, Varargs subargs) throws IOException {
|
||||
return iowrite(checkfile(file),subargs);
|
||||
}
|
||||
@@ -468,7 +468,7 @@ public class IoLib extends TwoArgFunction {
|
||||
}
|
||||
|
||||
static Varargs errorresult(Exception ioe) {
|
||||
String s = ioe.getMessage();
|
||||
String s = ioe.getMessage();
|
||||
return errorresult("io error: "+(s!=null? s: ioe.toString()));
|
||||
}
|
||||
|
||||
@@ -509,8 +509,8 @@ public class IoLib extends TwoArgFunction {
|
||||
case 'a': vi = freadall(f); break item;
|
||||
}
|
||||
}
|
||||
default:
|
||||
return argerror( i+1, "(invalid format)" );
|
||||
default:
|
||||
return argerror( i+1, "(invalid format)" );
|
||||
}
|
||||
if ( (v[i++] = vi).isnil() )
|
||||
break;
|
||||
@@ -564,7 +564,7 @@ public class IoLib extends TwoArgFunction {
|
||||
int c;
|
||||
try {
|
||||
if ( lineonly ) {
|
||||
loop: while ( (c = f.read()) > 0 ) {
|
||||
loop: while ( (c = f.read()) > 0 ) {
|
||||
switch ( c ) {
|
||||
case '\r': break;
|
||||
case '\n': break loop;
|
||||
@@ -572,13 +572,13 @@ public class IoLib extends TwoArgFunction {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
while ( (c = f.read()) > 0 )
|
||||
while ( (c = f.read()) > 0 )
|
||||
baos.write(c);
|
||||
}
|
||||
} catch ( EOFException e ) {
|
||||
c = -1;
|
||||
}
|
||||
return ( c < 0 && baos.size() == 0 )?
|
||||
return ( c < 0 && baos.size() == 0 )?
|
||||
(LuaValue) NIL:
|
||||
(LuaValue) LuaString.valueUsing(baos.toByteArray());
|
||||
}
|
||||
@@ -619,7 +619,7 @@ public class IoLib extends TwoArgFunction {
|
||||
if ( baos != null )
|
||||
baos.write( c );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -28,13 +28,13 @@ import org.luaj.vm2.LuaTable;
|
||||
import org.luaj.vm2.LuaValue;
|
||||
import org.luaj.vm2.Varargs;
|
||||
|
||||
/**
|
||||
* Subclass of {@link LibFunction} which implements the lua standard {@code math}
|
||||
* library.
|
||||
* <p>
|
||||
* It contains only the math library support that is possible on JME.
|
||||
* For a more complete implementation based on math functions specific to JSE
|
||||
* use {@link org.luaj.vm2.lib.jse.JseMathLib}.
|
||||
/**
|
||||
* Subclass of {@link LibFunction} which implements the lua standard {@code math}
|
||||
* library.
|
||||
* <p>
|
||||
* It contains only the math library support that is possible on JME.
|
||||
* For a more complete implementation based on math functions specific to JSE
|
||||
* use {@link org.luaj.vm2.lib.jse.JseMathLib}.
|
||||
* In Particular the following math functions are <b>not</b> implemented by this library:
|
||||
* <ul>
|
||||
* <li>acos</li>
|
||||
@@ -47,21 +47,21 @@ import org.luaj.vm2.Varargs;
|
||||
* <li>atan2</li>
|
||||
* </ul>
|
||||
* <p>
|
||||
* The implementations of {@code exp()} and {@code pow()} are constructed by
|
||||
* The implementations of {@code exp()} and {@code pow()} are constructed by
|
||||
* hand for JME, so will be slower and less accurate than when executed on the JSE platform.
|
||||
* <p>
|
||||
* Typically, this library is included as part of a call to either
|
||||
* {@link org.luaj.vm2.lib.jse.JsePlatform#standardGlobals()} or
|
||||
* <p>
|
||||
* Typically, this library is included as part of a call to either
|
||||
* {@link org.luaj.vm2.lib.jse.JsePlatform#standardGlobals()} or
|
||||
* {@link org.luaj.vm2.lib.jme.JmePlatform#standardGlobals()}
|
||||
* <pre> {@code
|
||||
* Globals globals = JsePlatform.standardGlobals();
|
||||
* System.out.println( globals.get("math").get("sqrt").call( LuaValue.valueOf(2) ) );
|
||||
* } </pre>
|
||||
* When using {@link org.luaj.vm2.lib.jse.JsePlatform} as in this example,
|
||||
* the subclass {@link org.luaj.vm2.lib.jse.JseMathLib} will
|
||||
* When using {@link org.luaj.vm2.lib.jse.JsePlatform} as in this example,
|
||||
* the subclass {@link org.luaj.vm2.lib.jse.JseMathLib} will
|
||||
* be included, which also includes this base functionality.
|
||||
* <p>
|
||||
* To instantiate and use it directly,
|
||||
* To instantiate and use it directly,
|
||||
* link it into your globals table via {@link LuaValue#load(LuaValue)} using code such as:
|
||||
* <pre> {@code
|
||||
* Globals globals = new Globals();
|
||||
@@ -70,8 +70,8 @@ import org.luaj.vm2.Varargs;
|
||||
* globals.load(new MathLib());
|
||||
* System.out.println( globals.get("math").get("sqrt").call( LuaValue.valueOf(2) ) );
|
||||
* } </pre>
|
||||
* Doing so will ensure the library is properly initialized
|
||||
* and loaded into the globals table.
|
||||
* Doing so will ensure the library is properly initialized
|
||||
* and loaded into the globals table.
|
||||
* <p>
|
||||
* This has been implemented to match as closely as possible the behavior in the corresponding library in C.
|
||||
* @see LibFunction
|
||||
@@ -87,8 +87,8 @@ public class MathLib extends TwoArgFunction {
|
||||
*/
|
||||
public static MathLib MATHLIB = null;
|
||||
|
||||
/** Construct a MathLib, which can be initialized by calling it with a
|
||||
* modname string, and a global environment table as arguments using
|
||||
/** Construct a MathLib, which can be initialized by calling it with a
|
||||
* modname string, and a global environment table as arguments using
|
||||
* {@link #call(LuaValue, LuaValue)}. */
|
||||
public MathLib() {
|
||||
MATHLIB = this;
|
||||
@@ -125,7 +125,7 @@ public class MathLib extends TwoArgFunction {
|
||||
math.set("sqrt", new sqrt());
|
||||
math.set("tan", new tan());
|
||||
env.set("math", math);
|
||||
env.get("package").get("loaded").set("math", math);
|
||||
if (!env.get("package").isnil()) env.get("package").get("loaded").set("math", math);
|
||||
return math;
|
||||
}
|
||||
|
||||
@@ -158,15 +158,17 @@ public class MathLib extends TwoArgFunction {
|
||||
exp(MathLib mathlib) {
|
||||
this.mathlib = mathlib;
|
||||
}
|
||||
protected double call(double d) {
|
||||
return mathlib.dpow_lib(Math.E,d);
|
||||
}
|
||||
protected double call(double d) {
|
||||
return mathlib.dpow_lib(Math.E,d);
|
||||
}
|
||||
}
|
||||
|
||||
static final class fmod extends BinaryOp {
|
||||
protected double call(double x, double y) {
|
||||
double q = x/y;
|
||||
return x - y * (q>=0? Math.floor(q): Math.ceil(q));
|
||||
static final class fmod extends TwoArgFunction {
|
||||
public LuaValue call(LuaValue xv, LuaValue yv) {
|
||||
if (xv.islong() && yv.islong()) {
|
||||
return valueOf(xv.tolong() % yv.tolong());
|
||||
}
|
||||
return valueOf(xv.checkdouble() % yv.checkdouble());
|
||||
}
|
||||
}
|
||||
static final class ldexp extends BinaryOp {
|
||||
@@ -194,27 +196,36 @@ public class MathLib extends TwoArgFunction {
|
||||
|
||||
static class max extends VarArgFunction {
|
||||
public Varargs invoke(Varargs args) {
|
||||
double m = args.checkdouble(1);
|
||||
for ( int i=2,n=args.narg(); i<=n; ++i )
|
||||
m = Math.max(m,args.checkdouble(i));
|
||||
return valueOf(m);
|
||||
LuaValue m = args.checkvalue(1);
|
||||
for ( int i=2,n=args.narg(); i<=n; ++i ) {
|
||||
LuaValue v = args.checkvalue(i);
|
||||
if (m.lt_b(v)) m = v;
|
||||
}
|
||||
return m;
|
||||
}
|
||||
}
|
||||
|
||||
static class min extends VarArgFunction {
|
||||
public Varargs invoke(Varargs args) {
|
||||
double m = args.checkdouble(1);
|
||||
for ( int i=2,n=args.narg(); i<=n; ++i )
|
||||
m = Math.min(m,args.checkdouble(i));
|
||||
return valueOf(m);
|
||||
LuaValue m = args.checkvalue(1);
|
||||
for ( int i=2,n=args.narg(); i<=n; ++i ) {
|
||||
LuaValue v = args.checkvalue(i);
|
||||
if (v.lt_b(m)) m = v;
|
||||
}
|
||||
return m;
|
||||
}
|
||||
}
|
||||
|
||||
static class modf extends VarArgFunction {
|
||||
public Varargs invoke(Varargs args) {
|
||||
double x = args.checkdouble(1);
|
||||
LuaValue n = args.arg1();
|
||||
/* number is its own integer part, no fractional part */
|
||||
if (n.islong()) return varargsOf(n, valueOf(0.0));
|
||||
double x = n.checkdouble();
|
||||
/* integer part (rounds toward zero) */
|
||||
double intPart = ( x > 0 ) ? Math.floor( x ) : Math.ceil( x );
|
||||
double fracPart = x - intPart;
|
||||
/* fractional part (test needed for inf/-inf) */
|
||||
double fracPart = x == intPart ? 0.0 : x - intPart;
|
||||
return varargsOf( valueOf(intPart), valueOf(fracPart) );
|
||||
}
|
||||
}
|
||||
@@ -252,26 +263,26 @@ public class MathLib extends TwoArgFunction {
|
||||
|
||||
/** compute power using installed math library, or default if there is no math library installed */
|
||||
public static LuaValue dpow(double a, double b) {
|
||||
return LuaDouble.valueOf(
|
||||
return LuaDouble.valueOf(
|
||||
MATHLIB!=null?
|
||||
MATHLIB.dpow_lib(a,b):
|
||||
dpow_default(a,b) );
|
||||
}
|
||||
public static double dpow_d(double a, double b) {
|
||||
return MATHLIB!=null?
|
||||
MATHLIB.dpow_lib(a,b):
|
||||
return MATHLIB!=null?
|
||||
MATHLIB.dpow_lib(a,b):
|
||||
dpow_default(a,b);
|
||||
}
|
||||
|
||||
/**
|
||||
* Hook to override default dpow behavior with faster implementation.
|
||||
/**
|
||||
* Hook to override default dpow behavior with faster implementation.
|
||||
*/
|
||||
public double dpow_lib(double a, double b) {
|
||||
return dpow_default(a,b);
|
||||
}
|
||||
|
||||
/**
|
||||
* Default JME version computes using longhand heuristics.
|
||||
/**
|
||||
* Default JME version computes using longhand heuristics.
|
||||
*/
|
||||
protected static double dpow_default(double a, double b) {
|
||||
if ( b < 0 )
|
||||
|
||||
@@ -35,17 +35,17 @@ import org.luaj.vm2.Varargs;
|
||||
* Subclass of {@link LibFunction} which implements the standard lua {@code os} library.
|
||||
* <p>
|
||||
* It is a usable base with simplified stub functions
|
||||
* for library functions that cannot be implemented uniformly
|
||||
* on Jse and Jme.
|
||||
* for library functions that cannot be implemented uniformly
|
||||
* on Jse and Jme.
|
||||
* <p>
|
||||
* This can be installed as-is on either platform, or extended
|
||||
* This can be installed as-is on either platform, or extended
|
||||
* and refined to be used in a complete Jse implementation.
|
||||
* <p>
|
||||
* Because the nature of the {@code os} library is to encapsulate
|
||||
* os-specific features, the behavior of these functions varies considerably
|
||||
* from their counterparts in the C platform.
|
||||
* Because the nature of the {@code os} library is to encapsulate
|
||||
* os-specific features, the behavior of these functions varies considerably
|
||||
* from their counterparts in the C platform.
|
||||
* <p>
|
||||
* The following functions have limited implementations of features
|
||||
* The following functions have limited implementations of features
|
||||
* that are not supported well on Jme:
|
||||
* <ul>
|
||||
* <li>{@code execute()}</li>
|
||||
@@ -54,7 +54,7 @@ import org.luaj.vm2.Varargs;
|
||||
* <li>{@code tmpname()}</li>
|
||||
* </ul>
|
||||
* <p>
|
||||
* Typically, this library is included as part of a call to either
|
||||
* Typically, this library is included as part of a call to either
|
||||
* {@link org.luaj.vm2.lib.jse.JsePlatform#standardGlobals()} or {@link org.luaj.vm2.lib.jme.JmePlatform#standardGlobals()}
|
||||
* <pre> {@code
|
||||
* Globals globals = JsePlatform.standardGlobals();
|
||||
@@ -63,7 +63,7 @@ import org.luaj.vm2.Varargs;
|
||||
* In this example the platform-specific {@link org.luaj.vm2.lib.jse.JseOsLib} library will be loaded, which will include
|
||||
* the base functionality provided by this class.
|
||||
* <p>
|
||||
* To instantiate and use it directly,
|
||||
* To instantiate and use it directly,
|
||||
* link it into your globals table via {@link LuaValue#load(LuaValue)} using code such as:
|
||||
* <pre> {@code
|
||||
* Globals globals = new Globals();
|
||||
@@ -114,8 +114,8 @@ public class OsLib extends TwoArgFunction {
|
||||
|
||||
protected Globals globals;
|
||||
|
||||
/**
|
||||
* Create and OsLib instance.
|
||||
/**
|
||||
* Create and OsLib instance.
|
||||
*/
|
||||
public OsLib() {
|
||||
}
|
||||
@@ -132,7 +132,7 @@ public class OsLib extends TwoArgFunction {
|
||||
for (int i = 0; i < NAMES.length; ++i)
|
||||
os.set(NAMES[i], new OsLibFunc(i, NAMES[i]));
|
||||
env.set("os", os);
|
||||
env.get("package").get("loaded").set("os", os);
|
||||
if (!env.get("package").isnil()) env.get("package").get("loaded").set("os", os);
|
||||
return os;
|
||||
}
|
||||
|
||||
@@ -200,8 +200,8 @@ public class OsLib extends TwoArgFunction {
|
||||
}
|
||||
|
||||
/**
|
||||
* @return an approximation of the amount in seconds of CPU time used by
|
||||
* the program. For luaj this simple returns the elapsed time since the
|
||||
* @return an approximation of the amount in seconds of CPU time used by
|
||||
* the program. For luaj this simple returns the elapsed time since the
|
||||
* OsLib class was loaded.
|
||||
*/
|
||||
protected double clock() {
|
||||
@@ -209,7 +209,7 @@ public class OsLib extends TwoArgFunction {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the number of seconds from time t1 to time t2.
|
||||
* Returns the number of seconds from time t1 to time t2.
|
||||
* In POSIX, Windows, and some other systems, this value is exactly t2-t1.
|
||||
* @param t2
|
||||
* @param t1
|
||||
@@ -220,21 +220,21 @@ public class OsLib extends TwoArgFunction {
|
||||
}
|
||||
|
||||
/**
|
||||
* If the time argument is present, this is the time to be formatted
|
||||
* (see the os.time function for a description of this value).
|
||||
* If the time argument is present, this is the time to be formatted
|
||||
* (see the os.time function for a description of this value).
|
||||
* Otherwise, date formats the current time.
|
||||
*
|
||||
* Date returns the date as a string,
|
||||
* Date returns the date as a string,
|
||||
* formatted according to the same rules as ANSII strftime, but without
|
||||
* support for %g, %G, or %V.
|
||||
*
|
||||
* When called without arguments, date returns a reasonable date and
|
||||
* time representation that depends on the host system and on the
|
||||
* When called without arguments, date returns a reasonable date and
|
||||
* time representation that depends on the host system and on the
|
||||
* current locale (that is, os.date() is equivalent to os.date("%c")).
|
||||
*
|
||||
* @param format
|
||||
*
|
||||
* @param format
|
||||
* @param time time since epoch, or -1 if not supplied
|
||||
* @return a LString or a LTable containing date and time,
|
||||
* @return a LString or a LTable containing date and time,
|
||||
* formatted according to the given string format.
|
||||
*/
|
||||
public String date(String format, double time) {
|
||||
@@ -277,8 +277,8 @@ public class OsLib extends TwoArgFunction {
|
||||
break;
|
||||
case 'B':
|
||||
result.append(MonthName[d.get(Calendar.MONTH)]);
|
||||
break;
|
||||
case 'c':
|
||||
break;
|
||||
case 'c':
|
||||
result.append(date("%a %b %d %H:%M:%S %Y", time));
|
||||
break;
|
||||
case 'd':
|
||||
@@ -314,7 +314,7 @@ public class OsLib extends TwoArgFunction {
|
||||
case 'w':
|
||||
result.append(String.valueOf((d.get(Calendar.DAY_OF_WEEK)+6)%7));
|
||||
break;
|
||||
case 'W':
|
||||
case 'W':
|
||||
result.append(String.valueOf(weekNumber(d, 1)));
|
||||
break;
|
||||
case 'x':
|
||||
@@ -372,7 +372,7 @@ public class OsLib extends TwoArgFunction {
|
||||
}
|
||||
|
||||
private int timeZoneOffset(Calendar d) {
|
||||
int localStandarTimeMillis = (
|
||||
int localStandarTimeMillis = (
|
||||
d.get(Calendar.HOUR_OF_DAY) * 3600 +
|
||||
d.get(Calendar.MINUTE) * 60 +
|
||||
d.get(Calendar.SECOND)) * 1000;
|
||||
@@ -381,28 +381,28 @@ public class OsLib extends TwoArgFunction {
|
||||
d.get(Calendar.YEAR),
|
||||
d.get(Calendar.MONTH),
|
||||
d.get(Calendar.DAY_OF_MONTH),
|
||||
d.get(Calendar.DAY_OF_WEEK),
|
||||
d.get(Calendar.DAY_OF_WEEK),
|
||||
localStandarTimeMillis) / 1000;
|
||||
}
|
||||
|
||||
private boolean isDaylightSavingsTime(Calendar d) {
|
||||
return timeZoneOffset(d) != d.getTimeZone().getRawOffset() / 1000;
|
||||
return timeZoneOffset(d) != d.getTimeZone().getRawOffset() / 1000;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function is equivalent to the C function system.
|
||||
* It passes command to be executed by an operating system shell.
|
||||
* It returns a status code, which is system-dependent.
|
||||
* If command is absent, then it returns nonzero if a shell
|
||||
/**
|
||||
* This function is equivalent to the C function system.
|
||||
* It passes command to be executed by an operating system shell.
|
||||
* It returns a status code, which is system-dependent.
|
||||
* If command is absent, then it returns nonzero if a shell
|
||||
* is available and zero otherwise.
|
||||
* @param command command to pass to the system
|
||||
*/
|
||||
*/
|
||||
protected Varargs execute(String command) {
|
||||
return varargsOf(NIL, valueOf("exit"), ONE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Calls the C function exit, with an optional code, to terminate the host program.
|
||||
* Calls the C function exit, with an optional code, to terminate the host program.
|
||||
* @param code
|
||||
*/
|
||||
protected void exit(int code) {
|
||||
@@ -415,13 +415,13 @@ public class OsLib extends TwoArgFunction {
|
||||
* or null if the variable is not defined in either environment.
|
||||
*
|
||||
* The default implementation, which is used by the JmePlatform,
|
||||
* only queryies System.getProperty().
|
||||
* only queryies System.getProperty().
|
||||
*
|
||||
* The JsePlatform overrides this behavior and returns the
|
||||
* environment variable value using System.getenv() if it exists,
|
||||
* environment variable value using System.getenv() if it exists,
|
||||
* or the System property value if it does not.
|
||||
*
|
||||
* A SecurityException may be thrown if access is not allowed
|
||||
* A SecurityException may be thrown if access is not allowed
|
||||
* for 'varname'.
|
||||
* @param varname
|
||||
* @return String value, or null if not defined
|
||||
@@ -431,10 +431,10 @@ public class OsLib extends TwoArgFunction {
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes the file or directory with the given name.
|
||||
* Directories must be empty to be removed.
|
||||
* Deletes the file or directory with the given name.
|
||||
* Directories must be empty to be removed.
|
||||
* If this function fails, it throws and IOException
|
||||
*
|
||||
*
|
||||
* @param filename
|
||||
* @throws IOException if it fails
|
||||
*/
|
||||
@@ -443,9 +443,9 @@ public class OsLib extends TwoArgFunction {
|
||||
}
|
||||
|
||||
/**
|
||||
* Renames file or directory named oldname to newname.
|
||||
* Renames file or directory named oldname to newname.
|
||||
* If this function fails,it throws and IOException
|
||||
*
|
||||
*
|
||||
* @param oldname old file name
|
||||
* @param newname new file name
|
||||
* @throws IOException if it fails
|
||||
@@ -455,21 +455,21 @@ public class OsLib extends TwoArgFunction {
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the current locale of the program. locale is a string specifying
|
||||
* a locale; category is an optional string describing which category to change:
|
||||
* "all", "collate", "ctype", "monetary", "numeric", or "time"; the default category
|
||||
* is "all".
|
||||
* Sets the current locale of the program. locale is a string specifying
|
||||
* a locale; category is an optional string describing which category to change:
|
||||
* "all", "collate", "ctype", "monetary", "numeric", or "time"; the default category
|
||||
* is "all".
|
||||
*
|
||||
* If locale is the empty string, the current locale is set to an implementation-
|
||||
* defined native locale. If locale is the string "C", the current locale is set
|
||||
* defined native locale. If locale is the string "C", the current locale is set
|
||||
* to the standard C locale.
|
||||
*
|
||||
* When called with null as the first argument, this function only returns the
|
||||
* When called with null as the first argument, this function only returns the
|
||||
* name of the current locale for the given category.
|
||||
*
|
||||
*
|
||||
* @param locale
|
||||
* @param category
|
||||
* @return the name of the new locale, or null if the request
|
||||
* @return the name of the new locale, or null if the request
|
||||
* cannot be honored.
|
||||
*/
|
||||
protected String setlocale(String locale, String category) {
|
||||
@@ -477,10 +477,10 @@ public class OsLib extends TwoArgFunction {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current time when called without arguments,
|
||||
* or a time representing the date and time specified by the given table.
|
||||
* This table must have fields year, month, and day,
|
||||
* and may have fields hour, min, sec, and isdst
|
||||
* Returns the current time when called without arguments,
|
||||
* or a time representing the date and time specified by the given table.
|
||||
* This table must have fields year, month, and day,
|
||||
* and may have fields hour, min, sec, and isdst
|
||||
* (for a description of these fields, see the os.date function).
|
||||
* @param table
|
||||
* @return long value for the time
|
||||
@@ -504,15 +504,15 @@ public class OsLib extends TwoArgFunction {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string with a file name that can be used for a temporary file.
|
||||
* The file must be explicitly opened before its use and explicitly removed
|
||||
* Returns a string with a file name that can be used for a temporary file.
|
||||
* The file must be explicitly opened before its use and explicitly removed
|
||||
* when no longer needed.
|
||||
*
|
||||
* On some systems (POSIX), this function also creates a file with that name,
|
||||
* to avoid security risks. (Someone else might create the file with wrong
|
||||
* permissions in the time between getting the name and creating the file.)
|
||||
* You still have to open the file to use it and to remove it (even if you
|
||||
* do not use it).
|
||||
* On some systems (POSIX), this function also creates a file with that name,
|
||||
* to avoid security risks. (Someone else might create the file with wrong
|
||||
* permissions in the time between getting the name and creating the file.)
|
||||
* You still have to open the file to use it and to remove it (even if you
|
||||
* do not use it).
|
||||
*
|
||||
* @return String filename to use
|
||||
*/
|
||||
|
||||
@@ -24,32 +24,32 @@ package org.luaj.vm2.lib;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
|
||||
import org.luaj.vm2.LuaClosure;
|
||||
import org.luaj.vm2.Buffer;
|
||||
import org.luaj.vm2.LuaClosure;
|
||||
import org.luaj.vm2.LuaString;
|
||||
import org.luaj.vm2.LuaTable;
|
||||
import org.luaj.vm2.LuaValue;
|
||||
import org.luaj.vm2.Varargs;
|
||||
import org.luaj.vm2.compiler.DumpState;
|
||||
|
||||
/**
|
||||
* Subclass of {@link LibFunction} which implements the lua standard {@code string}
|
||||
* library.
|
||||
/**
|
||||
* Subclass of {@link LibFunction} which implements the lua standard {@code string}
|
||||
* library.
|
||||
* <p>
|
||||
* Typically, this library is included as part of a call to either
|
||||
* Typically, this library is included as part of a call to either
|
||||
* {@link org.luaj.vm2.lib.jse.JsePlatform#standardGlobals()} or {@link org.luaj.vm2.lib.jme.JmePlatform#standardGlobals()}
|
||||
* <pre> {@code
|
||||
* Globals globals = JsePlatform.standardGlobals();
|
||||
* System.out.println( globals.get("string").get("upper").call( LuaValue.valueOf("abcde") ) );
|
||||
* } </pre>
|
||||
* <p>
|
||||
* To instantiate and use it directly,
|
||||
* To instantiate and use it directly,
|
||||
* link it into your globals table via {@link LuaValue#load(LuaValue)} using code such as:
|
||||
* <pre> {@code
|
||||
* Globals globals = new Globals();
|
||||
* globals.load(new JseBaseLib());
|
||||
* globals.load(new PackageLib());
|
||||
* globals.load(new StringLib());
|
||||
* globals.load(new JseStringLib());
|
||||
* System.out.println( globals.get("string").get("upper").call( LuaValue.valueOf("abcde") ) );
|
||||
* } </pre>
|
||||
* <p>
|
||||
@@ -61,8 +61,8 @@ import org.luaj.vm2.compiler.DumpState;
|
||||
*/
|
||||
public class StringLib extends TwoArgFunction {
|
||||
|
||||
/** Construct a StringLib, which can be initialized by calling it with a
|
||||
* modname string, and a global environment table as arguments using
|
||||
/** Construct a StringLib, which can be initialized by calling it with a
|
||||
* modname string, and a global environment table as arguments using
|
||||
* {@link #call(LuaValue, LuaValue)}. */
|
||||
public StringLib() {
|
||||
}
|
||||
@@ -75,8 +75,8 @@ public class StringLib extends TwoArgFunction {
|
||||
* If the shared strings metatable instance is null, will set the metatable as
|
||||
* the global shared metatable for strings.
|
||||
* <P>
|
||||
* All tables and metatables are read-write by default so if this will be used in
|
||||
* a server environment, sandboxing should be used. In particular, the
|
||||
* All tables and metatables are read-write by default so if this will be used in
|
||||
* a server environment, sandboxing should be used. In particular, the
|
||||
* {@link LuaString#s_metatable} table should probably be made read-only.
|
||||
* @param modname the module name supplied if this is loaded via 'require'.
|
||||
* @param env the environment to load into, typically a Globals instance.
|
||||
@@ -99,7 +99,7 @@ public class StringLib extends TwoArgFunction {
|
||||
string.set("upper", new upper());
|
||||
|
||||
env.set("string", string);
|
||||
env.get("package").get("loaded").set("string", string);
|
||||
if (!env.get("package").isnil()) env.get("package").get("loaded").set("string", string);
|
||||
if (LuaString.s_metatable == null) {
|
||||
LuaString.s_metatable = LuaValue.tableOf(new LuaValue[] { INDEX, string });
|
||||
}
|
||||
@@ -107,7 +107,7 @@ public class StringLib extends TwoArgFunction {
|
||||
}
|
||||
|
||||
/**
|
||||
* string.byte (s [, i [, j]])
|
||||
* string.byte (s [, i [, j]])
|
||||
*
|
||||
* Returns the internal numerical codes of the
|
||||
* characters s[i], s[i+1], ..., s[j]. The default value for i is 1; the
|
||||
@@ -137,12 +137,12 @@ public class StringLib extends TwoArgFunction {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* string.char (...)
|
||||
*
|
||||
* Receives zero or more integers. Returns a string with length equal
|
||||
* to the number of arguments, in which each character has the internal
|
||||
* numerical code equal to its corresponding argument.
|
||||
* Receives zero or more integers. Returns a string with length equal
|
||||
* to the number of arguments, in which each character has the internal
|
||||
* numerical code equal to its corresponding argument.
|
||||
*
|
||||
* Note that numerical codes are not necessarily portable across platforms.
|
||||
*
|
||||
@@ -161,19 +161,19 @@ public class StringLib extends TwoArgFunction {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* string.dump (function[, stripDebug])
|
||||
*
|
||||
* Returns a string containing a binary representation of the given function,
|
||||
* so that a later loadstring on this string returns a copy of the function.
|
||||
* Returns a string containing a binary representation of the given function,
|
||||
* so that a later loadstring on this string returns a copy of the function.
|
||||
* function must be a Lua function without upvalues.
|
||||
* Boolean param stripDebug - true to strip debugging info, false otherwise.
|
||||
* The default value for stripDebug is true.
|
||||
*
|
||||
*
|
||||
* TODO: port dumping code as optional add-on
|
||||
*/
|
||||
static final class dump extends VarArgFunction {
|
||||
public LuaValue invoke(Varargs args) {
|
||||
public Varargs invoke(Varargs args) {
|
||||
LuaValue f = args.checkfunction(1);
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
try {
|
||||
@@ -185,20 +185,20 @@ public class StringLib extends TwoArgFunction {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* string.find (s, pattern [, init [, plain]])
|
||||
*
|
||||
* Looks for the first match of pattern in the string s.
|
||||
* If it finds a match, then find returns the indices of s
|
||||
* where this occurrence starts and ends; otherwise, it returns nil.
|
||||
* A third, optional numerical argument init specifies where to start the search;
|
||||
* its default value is 1 and may be negative. A value of true as a fourth,
|
||||
* optional argument plain turns off the pattern matching facilities,
|
||||
* so the function does a plain "find substring" operation,
|
||||
* with no characters in pattern being considered "magic".
|
||||
* Looks for the first match of pattern in the string s.
|
||||
* If it finds a match, then find returns the indices of s
|
||||
* where this occurrence starts and ends; otherwise, it returns nil.
|
||||
* A third, optional numerical argument init specifies where to start the search;
|
||||
* its default value is 1 and may be negative. A value of true as a fourth,
|
||||
* optional argument plain turns off the pattern matching facilities,
|
||||
* so the function does a plain "find substring" operation,
|
||||
* with no characters in pattern being considered "magic".
|
||||
* Note that if plain is given, then init must be given as well.
|
||||
*
|
||||
* If the pattern has captures, then in a successful match the captured values
|
||||
* If the pattern has captures, then in a successful match the captured values
|
||||
* are also returned, after the two indices.
|
||||
*/
|
||||
static final class find extends VarArgFunction {
|
||||
@@ -207,30 +207,30 @@ public class StringLib extends TwoArgFunction {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* string.format (formatstring, ...)
|
||||
*
|
||||
* Returns a formatted version of its variable number of arguments following
|
||||
* the description given in its first argument (which must be a string).
|
||||
* The format string follows the same rules as the printf family of standard C functions.
|
||||
* The only differences are that the options/modifiers *, l, L, n, p, and h are not supported
|
||||
* and that there is an extra option, q. The q option formats a string in a form suitable
|
||||
* to be safely read back by the Lua interpreter: the string is written between double quotes,
|
||||
* and all double quotes, newlines, embedded zeros, and backslashes in the string are correctly
|
||||
* Returns a formatted version of its variable number of arguments following
|
||||
* the description given in its first argument (which must be a string).
|
||||
* The format string follows the same rules as the printf family of standard C functions.
|
||||
* The only differences are that the options/modifiers *, l, L, n, p, and h are not supported
|
||||
* and that there is an extra option, q. The q option formats a string in a form suitable
|
||||
* to be safely read back by the Lua interpreter: the string is written between double quotes,
|
||||
* and all double quotes, newlines, embedded zeros, and backslashes in the string are correctly
|
||||
* escaped when written. For instance, the call
|
||||
* string.format('%q', 'a string with "quotes" and \n new line')
|
||||
*
|
||||
* will produce the string:
|
||||
* "a string with \"quotes\" and \
|
||||
* new line"
|
||||
*
|
||||
* The options c, d, E, e, f, g, G, i, o, u, X, and x all expect a number as argument,
|
||||
* whereas q and s expect a string.
|
||||
*
|
||||
* This function does not accept string values containing embedded zeros,
|
||||
* except as arguments to the q option.
|
||||
* The options c, d, E, e, f, g, G, i, o, u, X, and x all expect a number as argument,
|
||||
* whereas q and s expect a string.
|
||||
*
|
||||
* This function does not accept string values containing embedded zeros,
|
||||
* except as arguments to the q option.
|
||||
*/
|
||||
static final class format extends VarArgFunction {
|
||||
final class format extends VarArgFunction {
|
||||
public Varargs invoke(Varargs args) {
|
||||
LuaString fmt = args.checkstring( 1 );
|
||||
final int n = fmt.length();
|
||||
@@ -261,7 +261,7 @@ public class StringLib extends TwoArgFunction {
|
||||
break;
|
||||
case 'i':
|
||||
case 'd':
|
||||
fdsc.format( result, args.checkint( arg ) );
|
||||
fdsc.format( result, args.checklong( arg ) );
|
||||
break;
|
||||
case 'o':
|
||||
case 'u':
|
||||
@@ -330,7 +330,7 @@ public class StringLib extends TwoArgFunction {
|
||||
|
||||
private static final String FLAGS = "-+ #0";
|
||||
|
||||
static class FormatDesc {
|
||||
class FormatDesc {
|
||||
|
||||
private boolean leftAdjust;
|
||||
private boolean zeroPad;
|
||||
@@ -470,13 +470,7 @@ public class StringLib extends TwoArgFunction {
|
||||
}
|
||||
|
||||
public void format(Buffer buf, double x) {
|
||||
String out;
|
||||
try {
|
||||
out = String.format(src, x);
|
||||
} catch (Throwable e) {
|
||||
out = String.valueOf( x );
|
||||
}
|
||||
buf.append( out );
|
||||
buf.append( StringLib.this.format(src, x) );
|
||||
}
|
||||
|
||||
public void format(Buffer buf, LuaString s) {
|
||||
@@ -486,27 +480,31 @@ public class StringLib extends TwoArgFunction {
|
||||
buf.append(s);
|
||||
}
|
||||
|
||||
public static final void pad(Buffer buf, char c, int n) {
|
||||
public final void pad(Buffer buf, char c, int n) {
|
||||
byte b = (byte)c;
|
||||
while ( n-- > 0 )
|
||||
buf.append(b);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
protected String format(String src, double x) {
|
||||
return String.valueOf(x);
|
||||
}
|
||||
|
||||
/**
|
||||
* string.gmatch (s, pattern)
|
||||
*
|
||||
* Returns an iterator function that, each time it is called, returns the next captures
|
||||
* from pattern over string s. If pattern specifies no captures, then the
|
||||
* whole match is produced in each call.
|
||||
* Returns an iterator function that, each time it is called, returns the next captures
|
||||
* from pattern over string s. If pattern specifies no captures, then the
|
||||
* whole match is produced in each call.
|
||||
*
|
||||
* As an example, the following loop
|
||||
* s = "hello world from Lua"
|
||||
* for w in string.gmatch(s, "%a+") do
|
||||
* print(w)
|
||||
* end
|
||||
*
|
||||
* will iterate over all the words from string s, printing one per line.
|
||||
*
|
||||
* will iterate over all the words from string s, printing one per line.
|
||||
* The next example collects all pairs key=value from the given string into a table:
|
||||
* t = {}
|
||||
* s = "from=world, to=Lua"
|
||||
@@ -514,7 +512,7 @@ public class StringLib extends TwoArgFunction {
|
||||
* t[k] = v
|
||||
* end
|
||||
*
|
||||
* For this function, a '^' at the start of a pattern does not work as an anchor,
|
||||
* For this function, a '^' at the start of a pattern does not work as an anchor,
|
||||
* as this would prevent the iteration.
|
||||
*/
|
||||
static final class gmatch extends VarArgFunction {
|
||||
@@ -550,28 +548,28 @@ public class StringLib extends TwoArgFunction {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
/**
|
||||
* string.gsub (s, pattern, repl [, n])
|
||||
* Returns a copy of s in which all (or the first n, if given) occurrences of the
|
||||
* pattern have been replaced by a replacement string specified by repl, which
|
||||
* may be a string, a table, or a function. gsub also returns, as its second value,
|
||||
* Returns a copy of s in which all (or the first n, if given) occurrences of the
|
||||
* pattern have been replaced by a replacement string specified by repl, which
|
||||
* may be a string, a table, or a function. gsub also returns, as its second value,
|
||||
* the total number of matches that occurred.
|
||||
*
|
||||
* If repl is a string, then its value is used for replacement.
|
||||
* The character % works as an escape character: any sequence in repl of the form %n,
|
||||
* with n between 1 and 9, stands for the value of the n-th captured substring (see below).
|
||||
* The sequence %0 stands for the whole match. The sequence %% stands for a single %.
|
||||
*
|
||||
* If repl is a table, then the table is queried for every match, using the first capture
|
||||
* as the key; if the pattern specifies no captures, then the whole match is used as the key.
|
||||
* If repl is a string, then its value is used for replacement.
|
||||
* The character % works as an escape character: any sequence in repl of the form %n,
|
||||
* with n between 1 and 9, stands for the value of the n-th captured substring (see below).
|
||||
* The sequence %0 stands for the whole match. The sequence %% stands for a single %.
|
||||
*
|
||||
* If repl is a function, then this function is called every time a match occurs,
|
||||
* with all captured substrings passed as arguments, in order; if the pattern specifies
|
||||
* no captures, then the whole match is passed as a sole argument.
|
||||
* If repl is a table, then the table is queried for every match, using the first capture
|
||||
* as the key; if the pattern specifies no captures, then the whole match is used as the key.
|
||||
*
|
||||
* If the value returned by the table query or by the function call is a string or a number,
|
||||
* then it is used as the replacement string; otherwise, if it is false or nil,
|
||||
* then there is no replacement (that is, the original match is kept in the string).
|
||||
* If repl is a function, then this function is called every time a match occurs,
|
||||
* with all captured substrings passed as arguments, in order; if the pattern specifies
|
||||
* no captures, then the whole match is passed as a sole argument.
|
||||
*
|
||||
* If the value returned by the table query or by the function call is a string or a number,
|
||||
* then it is used as the replacement string; otherwise, if it is false or nil,
|
||||
* then there is no replacement (that is, the original match is kept in the string).
|
||||
*
|
||||
* Here are some examples:
|
||||
* x = string.gsub("hello world", "(%w+)", "%1 %1")
|
||||
@@ -630,11 +628,11 @@ public class StringLib extends TwoArgFunction {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* string.len (s)
|
||||
*
|
||||
* Receives a string and returns its length. The empty string "" has length 0.
|
||||
* Embedded zeros are counted, so "a\000bc\000" has length 5.
|
||||
* Receives a string and returns its length. The empty string "" has length 0.
|
||||
* Embedded zeros are counted, so "a\000bc\000" has length 5.
|
||||
*/
|
||||
static final class len extends OneArgFunction {
|
||||
public LuaValue call(LuaValue arg) {
|
||||
@@ -642,11 +640,11 @@ public class StringLib extends TwoArgFunction {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* string.lower (s)
|
||||
*
|
||||
* Receives a string and returns a copy of this string with all uppercase letters
|
||||
* changed to lowercase. All other characters are left unchanged.
|
||||
* Receives a string and returns a copy of this string with all uppercase letters
|
||||
* changed to lowercase. All other characters are left unchanged.
|
||||
* The definition of what an uppercase letter is depends on the current locale.
|
||||
*/
|
||||
static final class lower extends OneArgFunction {
|
||||
@@ -673,7 +671,7 @@ public class StringLib extends TwoArgFunction {
|
||||
/**
|
||||
* string.rep (s, n)
|
||||
*
|
||||
* Returns a string that is the concatenation of n copies of the string s.
|
||||
* Returns a string that is the concatenation of n copies of the string s.
|
||||
*/
|
||||
static final class rep extends VarArgFunction {
|
||||
public Varargs invoke(Varargs args) {
|
||||
@@ -688,10 +686,10 @@ public class StringLib extends TwoArgFunction {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* string.reverse (s)
|
||||
*
|
||||
* Returns a string that is the string s reversed.
|
||||
* Returns a string that is the string s reversed.
|
||||
*/
|
||||
static final class reverse extends OneArgFunction {
|
||||
public LuaValue call(LuaValue arg) {
|
||||
@@ -704,15 +702,15 @@ public class StringLib extends TwoArgFunction {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* string.sub (s, i [, j])
|
||||
*
|
||||
* Returns the substring of s that starts at i and continues until j;
|
||||
* i and j may be negative. If j is absent, then it is assumed to be equal to -1
|
||||
* (which is the same as the string length). In particular, the call
|
||||
* string.sub(s,1,j)
|
||||
* returns a prefix of s with length j, and
|
||||
* string.sub(s, -i)
|
||||
* Returns the substring of s that starts at i and continues until j;
|
||||
* i and j may be negative. If j is absent, then it is assumed to be equal to -1
|
||||
* (which is the same as the string length). In particular, the call
|
||||
* string.sub(s,1,j)
|
||||
* returns a prefix of s with length j, and
|
||||
* string.sub(s, -i)
|
||||
* returns a suffix of s with length i.
|
||||
*/
|
||||
static final class sub extends VarArgFunction {
|
||||
@@ -736,12 +734,12 @@ public class StringLib extends TwoArgFunction {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* string.upper (s)
|
||||
*
|
||||
* Receives a string and returns a copy of this string with all lowercase letters
|
||||
* changed to uppercase. All other characters are left unchanged.
|
||||
* The definition of what a lowercase letter is depends on the current locale.
|
||||
* Receives a string and returns a copy of this string with all lowercase letters
|
||||
* changed to uppercase. All other characters are left unchanged.
|
||||
* The definition of what a lowercase letter is depends on the current locale.
|
||||
*/
|
||||
static final class upper extends OneArgFunction {
|
||||
public LuaValue call(LuaValue arg) {
|
||||
@@ -877,8 +875,14 @@ public class StringLib extends TwoArgFunction {
|
||||
lbuf.append( (byte) b );
|
||||
} else {
|
||||
++i; // skip ESC
|
||||
b = (byte) news.luaByte( i );
|
||||
b = (byte)(i < l ? news.luaByte( i ) : 0);
|
||||
if ( !Character.isDigit( (char) b ) ) {
|
||||
if (b != L_ESC) error( "invalid use of '" + (char)L_ESC +
|
||||
"' in replacement string: after '" + (char)L_ESC +
|
||||
"' must be '0'-'9' or '" + (char)L_ESC +
|
||||
"', but found " + (i < l ? "symbol '" + (char)b + "' with code " + b +
|
||||
" at pos " + (i + 1) :
|
||||
"end of string"));
|
||||
lbuf.append( b );
|
||||
} else if ( b == '0' ) {
|
||||
lbuf.append( s.substring( soff, e ) );
|
||||
@@ -1049,7 +1053,7 @@ public class StringLib extends TwoArgFunction {
|
||||
*/
|
||||
int match( int soffset, int poffset ) {
|
||||
while ( true ) {
|
||||
// Check if we are at the end of the pattern -
|
||||
// Check if we are at the end of the pattern -
|
||||
// equivalent to the '\0' case in the C version, but our pattern
|
||||
// string is not NUL-terminated.
|
||||
if ( poffset == p.length() )
|
||||
|
||||
@@ -25,19 +25,19 @@ import org.luaj.vm2.LuaTable;
|
||||
import org.luaj.vm2.LuaValue;
|
||||
import org.luaj.vm2.Varargs;
|
||||
|
||||
/**
|
||||
* Subclass of {@link LibFunction} which implements the lua standard {@code table}
|
||||
* library.
|
||||
/**
|
||||
* Subclass of {@link LibFunction} which implements the lua standard {@code table}
|
||||
* library.
|
||||
*
|
||||
* <p>
|
||||
* Typically, this library is included as part of a call to either
|
||||
* Typically, this library is included as part of a call to either
|
||||
* {@link org.luaj.vm2.lib.jse.JsePlatform#standardGlobals()} or {@link org.luaj.vm2.lib.jme.JmePlatform#standardGlobals()}
|
||||
* <pre> {@code
|
||||
* Globals globals = JsePlatform.standardGlobals();
|
||||
* System.out.println( globals.get("table").get("length").call( LuaValue.tableOf() ) );
|
||||
* } </pre>
|
||||
* <p>
|
||||
* To instantiate and use it directly,
|
||||
* To instantiate and use it directly,
|
||||
* link it into your globals table via {@link LuaValue#load(LuaValue)} using code such as:
|
||||
* <pre> {@code
|
||||
* Globals globals = new Globals();
|
||||
@@ -70,7 +70,7 @@ public class TableLib extends TwoArgFunction {
|
||||
table.set("sort", new sort());
|
||||
table.set("unpack", new unpack());
|
||||
env.set("table", table);
|
||||
env.get("package").get("loaded").set("table", table);
|
||||
if (!env.get("package").isnil()) env.get("package").get("loaded").set("table", table);
|
||||
return NIL;
|
||||
}
|
||||
|
||||
|
||||
@@ -98,7 +98,14 @@ public class JseMathLib extends org.luaj.vm2.lib.MathLib {
|
||||
}
|
||||
static final class cosh extends UnaryOp { protected double call(double d) { return Math.cosh(d); } }
|
||||
static final class exp extends UnaryOp { protected double call(double d) { return Math.exp(d); } }
|
||||
static final class log extends UnaryOp { protected double call(double d) { return Math.log(d); } }
|
||||
static final class log extends TwoArgFunction {
|
||||
public LuaValue call(LuaValue x, LuaValue base) {
|
||||
double nat = Math.log(x.checkdouble());
|
||||
double b = base.optdouble(Math.E);
|
||||
if (b != Math.E) nat /= Math.log(b);
|
||||
return valueOf(nat);
|
||||
}
|
||||
}
|
||||
static final class pow extends BinaryOp { protected double call(double x, double y) { return Math.pow(x, y); } }
|
||||
static final class sinh extends UnaryOp { protected double call(double d) { return Math.sinh(d); } }
|
||||
static final class tanh extends UnaryOp { protected double call(double d) { return Math.tanh(d); } }
|
||||
|
||||
@@ -23,7 +23,6 @@ package org.luaj.vm2.lib.jse;
|
||||
|
||||
import org.luaj.vm2.Globals;
|
||||
import org.luaj.vm2.LoadState;
|
||||
import org.luaj.vm2.LuaThread;
|
||||
import org.luaj.vm2.LuaValue;
|
||||
import org.luaj.vm2.Varargs;
|
||||
import org.luaj.vm2.compiler.LuaC;
|
||||
@@ -35,10 +34,10 @@ import org.luaj.vm2.lib.ResourceFinder;
|
||||
import org.luaj.vm2.lib.StringLib;
|
||||
import org.luaj.vm2.lib.TableLib;
|
||||
|
||||
/** The {@link org.luaj.vm2.lib.jse.JsePlatform} class is a convenience class to standardize
|
||||
* how globals tables are initialized for the JSE platform.
|
||||
/** The {@link org.luaj.vm2.lib.jse.JsePlatform} class is a convenience class to standardize
|
||||
* how globals tables are initialized for the JSE platform.
|
||||
* <p>
|
||||
* It is used to allocate either a set of standard globals using
|
||||
* It is used to allocate either a set of standard globals using
|
||||
* {@link #standardGlobals()} or debug globals using {@link #debugGlobals()}
|
||||
* <p>
|
||||
* A simple example of initializing globals and using them from Java is:
|
||||
@@ -52,7 +51,7 @@ import org.luaj.vm2.lib.TableLib;
|
||||
* globals.load( new FileInputStream("main.lua"), "main.lua" ).call();
|
||||
* } </pre>
|
||||
* <p>
|
||||
* although {@code require} could also be used:
|
||||
* although {@code require} could also be used:
|
||||
* <pre> {@code
|
||||
* globals.get("require").call(LuaValue.valueOf("main"));
|
||||
* } </pre>
|
||||
@@ -73,8 +72,8 @@ import org.luaj.vm2.lib.TableLib;
|
||||
* <li>{@link org.luaj.vm2.lib.jse.JseOsLib}</li>
|
||||
* <li>{@link org.luaj.vm2.lib.jse.LuajavaLib}</li>
|
||||
* </ul>
|
||||
* In addition, the {@link LuaC} compiler is installed so lua files may be loaded in their source form.
|
||||
* <p>
|
||||
* In addition, the {@link LuaC} compiler is installed so lua files may be loaded in their source form.
|
||||
* <p>
|
||||
* The debug globals are simply the standard globals plus the {@code debug} library {@link DebugLib}.
|
||||
* <p>
|
||||
* The class ensures that initialization is done in the correct order.
|
||||
@@ -98,7 +97,7 @@ public class JsePlatform {
|
||||
globals.load(new PackageLib());
|
||||
globals.load(new Bit32Lib());
|
||||
globals.load(new TableLib());
|
||||
globals.load(new StringLib());
|
||||
globals.load(new JseStringLib());
|
||||
globals.load(new CoroutineLib());
|
||||
globals.load(new JseMathLib());
|
||||
globals.load(new JseIoLib());
|
||||
@@ -106,7 +105,7 @@ public class JsePlatform {
|
||||
globals.load(new LuajavaLib());
|
||||
LoadState.install(globals);
|
||||
LuaC.install(globals);
|
||||
return globals;
|
||||
return globals;
|
||||
}
|
||||
|
||||
/** Create standard globals including the {@link DebugLib} library.
|
||||
@@ -124,9 +123,9 @@ public class JsePlatform {
|
||||
}
|
||||
|
||||
|
||||
/** Simple wrapper for invoking a lua function with command line arguments.
|
||||
/** Simple wrapper for invoking a lua function with command line arguments.
|
||||
* The supplied function is first given a new Globals object as its environment
|
||||
* then the program is run with arguments.
|
||||
* then the program is run with arguments.
|
||||
* @return {@link Varargs} containing any values returned by mainChunk.
|
||||
*/
|
||||
public static Varargs luaMain(LuaValue mainChunk, String[] args) {
|
||||
|
||||
@@ -37,38 +37,38 @@ import org.luaj.vm2.compiler.LuaC;
|
||||
import org.luaj.vm2.lib.LibFunction;
|
||||
import org.luaj.vm2.lib.VarArgFunction;
|
||||
|
||||
/**
|
||||
* Subclass of {@link LibFunction} which implements the features of the luajava package.
|
||||
* <p>
|
||||
* Luajava is an approach to mixing lua and java using simple functions that bind
|
||||
* java classes and methods to lua dynamically. The API is documented on the
|
||||
/**
|
||||
* Subclass of {@link LibFunction} which implements the features of the luajava package.
|
||||
* <p>
|
||||
* Luajava is an approach to mixing lua and java using simple functions that bind
|
||||
* java classes and methods to lua dynamically. The API is documented on the
|
||||
* <a href="http://www.keplerproject.org/luajava/">luajava</a> documentation pages.
|
||||
*
|
||||
* <p>
|
||||
* Typically, this library is included as part of a call to
|
||||
* Typically, this library is included as part of a call to
|
||||
* {@link org.luaj.vm2.lib.jse.JsePlatform#standardGlobals()}
|
||||
* <pre> {@code
|
||||
* Globals globals = JsePlatform.standardGlobals();
|
||||
* System.out.println( globals.get("luajava").get("bindClass").call( LuaValue.valueOf("java.lang.System") ).invokeMethod("currentTimeMillis") );
|
||||
* } </pre>
|
||||
* <p>
|
||||
* To instantiate and use it directly,
|
||||
* To instantiate and use it directly,
|
||||
* link it into your globals table via {@link Globals#load} using code such as:
|
||||
* <pre> {@code
|
||||
* Globals globals = new Globals();
|
||||
* globals.load(new JseBaseLib());
|
||||
* globals.load(new PackageLib());
|
||||
* globals.load(new LuajavaLib());
|
||||
* globals.load(
|
||||
* globals.load(
|
||||
* "sys = luajava.bindClass('java.lang.System')\n"+
|
||||
* "print ( sys:currentTimeMillis() )\n", "main.lua" ).call();
|
||||
* "print ( sys:currentTimeMillis() )\n", "main.lua" ).call();
|
||||
* } </pre>
|
||||
* <p>
|
||||
*
|
||||
* The {@code luajava} library is available
|
||||
* The {@code luajava} library is available
|
||||
* on all JSE platforms via the call to {@link org.luaj.vm2.lib.jse.JsePlatform#standardGlobals()}
|
||||
* and the luajava api's are simply invoked from lua.
|
||||
* Because it makes extensive use of Java's reflection API, it is not available
|
||||
* and the luajava api's are simply invoked from lua.
|
||||
* Because it makes extensive use of Java's reflection API, it is not available
|
||||
* on JME, but can be used in Android applications.
|
||||
* <p>
|
||||
* This has been implemented to match as closely as possible the behavior in the corresponding library in C.
|
||||
@@ -91,10 +91,10 @@ public class LuajavaLib extends VarArgFunction {
|
||||
static final int LOADLIB = 5;
|
||||
|
||||
static final String[] NAMES = {
|
||||
"bindClass",
|
||||
"newInstance",
|
||||
"new",
|
||||
"createProxy",
|
||||
"bindClass",
|
||||
"newInstance",
|
||||
"new",
|
||||
"createProxy",
|
||||
"loadLib",
|
||||
};
|
||||
|
||||
@@ -112,7 +112,7 @@ public class LuajavaLib extends VarArgFunction {
|
||||
LuaTable t = new LuaTable();
|
||||
bind( t, this.getClass(), NAMES, BINDCLASS );
|
||||
env.set("luajava", t);
|
||||
env.get("package").get("loaded").set("luajava", t);
|
||||
if (!env.get("package").isnil()) env.get("package").get("loaded").set("luajava", t);
|
||||
return t;
|
||||
}
|
||||
case BINDCLASS: {
|
||||
@@ -122,13 +122,13 @@ public class LuajavaLib extends VarArgFunction {
|
||||
case NEWINSTANCE:
|
||||
case NEW: {
|
||||
// get constructor
|
||||
final LuaValue c = args.checkvalue(1);
|
||||
final LuaValue c = args.checkvalue(1);
|
||||
final Class clazz = (opcode==NEWINSTANCE? classForName(c.tojstring()): (Class) c.checkuserdata(Class.class));
|
||||
final Varargs consargs = args.subargs(2);
|
||||
return JavaClass.forClass(clazz).getConstructor().invoke(consargs);
|
||||
}
|
||||
|
||||
case CREATEPROXY: {
|
||||
case CREATEPROXY: {
|
||||
final int niface = args.narg()-1;
|
||||
if ( niface <= 0 )
|
||||
throw new LuaError("no interfaces");
|
||||
@@ -136,7 +136,7 @@ public class LuajavaLib extends VarArgFunction {
|
||||
|
||||
// get the interfaces
|
||||
final Class[] ifaces = new Class[niface];
|
||||
for ( int i=0; i<niface; i++ )
|
||||
for ( int i=0; i<niface; i++ )
|
||||
ifaces[i] = classForName(args.checkjstring(i+1));
|
||||
|
||||
// create the invocation handler
|
||||
@@ -191,16 +191,16 @@ public class LuajavaLib extends VarArgFunction {
|
||||
if ( func.isnil() )
|
||||
return null;
|
||||
boolean isvarargs = ((method.getModifiers() & METHOD_MODIFIERS_VARARGS) != 0);
|
||||
int n = args!=null? args.length: 0;
|
||||
int n = args!=null? args.length: 0;
|
||||
LuaValue[] v;
|
||||
if ( isvarargs ) {
|
||||
if ( isvarargs ) {
|
||||
Object o = args[--n];
|
||||
int m = Array.getLength( o );
|
||||
v = new LuaValue[n+m];
|
||||
for ( int i=0; i<n; i++ )
|
||||
v[i] = CoerceJavaToLua.coerce(args[i]);
|
||||
for ( int i=0; i<m; i++ )
|
||||
v[i+n] = CoerceJavaToLua.coerce(Array.get(o,i));
|
||||
v[i+n] = CoerceJavaToLua.coerce(Array.get(o,i));
|
||||
} else {
|
||||
v = new LuaValue[n];
|
||||
for ( int i=0; i<n; i++ )
|
||||
|
||||
Reference in New Issue
Block a user