diff --git a/src/addon/java/lua/addon/luajava/LuaJava.java b/src/addon/java/lua/addon/luajava/LuaJava.java index ba196e44..197ca960 100644 --- a/src/addon/java/lua/addon/luajava/LuaJava.java +++ b/src/addon/java/lua/addon/luajava/LuaJava.java @@ -133,6 +133,9 @@ public final class LuaJava extends LFunction { throw new RuntimeException(e); } } + public LString luaGetType() { + return new LString("userdata"); + } } diff --git a/src/main/java/lua/Builtin.java b/src/main/java/lua/Builtin.java index 07d74dd3..d1fc1b89 100644 --- a/src/main/java/lua/Builtin.java +++ b/src/main/java/lua/Builtin.java @@ -21,8 +21,9 @@ final class Builtin extends LFunction { private static final int PAIRS = 1; private static final int GETMETATABLE = 2; private static final int SETMETATABLE = 3; + private static final int TYPE = 4; - private static final String[] NAMES = { "print", "pairs", "getmetatable", "setmetatable" }; + private static final String[] NAMES = { "print", "pairs", "getmetatable", "setmetatable", "type" }; private static PrintStream stdout = System.out; @@ -62,6 +63,10 @@ final class Builtin extends LFunction { call.stack[base] = call.stack[base+1]; call.top = base+1; break; + case TYPE: + call.stack[base] = call.stack[base+1].luaGetType(); + call.top = base+1; + break; default: luaUnsupportedOperation(); } diff --git a/src/main/java/lua/io/Proto.java b/src/main/java/lua/io/Proto.java index 57ed577e..23614dba 100644 --- a/src/main/java/lua/io/Proto.java +++ b/src/main/java/lua/io/Proto.java @@ -7,7 +7,7 @@ import lua.value.LString; /* ** Function Prototypes */ -public class Proto extends LValue { +public class Proto { public Proto(StackState l) { } public Proto() { @@ -38,8 +38,4 @@ public class Proto extends LValue { public boolean is_vararg; public int maxstacksize; - - public String luaAsString() { - return "proto: "+id(); - } } diff --git a/src/main/java/lua/value/LBoolean.java b/src/main/java/lua/value/LBoolean.java index 0a8ba132..e222454e 100644 --- a/src/main/java/lua/value/LBoolean.java +++ b/src/main/java/lua/value/LBoolean.java @@ -6,6 +6,8 @@ public final class LBoolean extends LValue { public static final LBoolean FALSE = new LBoolean("false",false); + public static final LString TYPE_NAME = new LString("boolean"); + private final String m_name; private final boolean m_value; @@ -25,4 +27,8 @@ public final class LBoolean extends LValue { public final static LBoolean valueOf(boolean value) { return value? TRUE: FALSE; } + + public LString luaGetType() { + return TYPE_NAME; + } } diff --git a/src/main/java/lua/value/LFunction.java b/src/main/java/lua/value/LFunction.java index 7f52e819..4d1b3b2d 100644 --- a/src/main/java/lua/value/LFunction.java +++ b/src/main/java/lua/value/LFunction.java @@ -5,6 +5,8 @@ import lua.CallFrame; public class LFunction extends LValue { + public static final LString TYPE_NAME = new LString("function"); + public String luaAsString() { return "function: "+hashCode(); } @@ -26,4 +28,8 @@ public class LFunction extends LValue { this.luaStackCall(call, base, call.top, 1); } + public LString luaGetType() { + return TYPE_NAME; + } + } diff --git a/src/main/java/lua/value/LNil.java b/src/main/java/lua/value/LNil.java index b671490e..a7c34b7d 100644 --- a/src/main/java/lua/value/LNil.java +++ b/src/main/java/lua/value/LNil.java @@ -2,6 +2,7 @@ package lua.value; public final class LNil extends LValue { public static final LNil NIL = new LNil(); + public static final LString TYPE_NAME = new LString("nil"); public final String luaAsString() { return "nil"; @@ -10,4 +11,8 @@ public final class LNil extends LValue { public boolean luaAsBoolean() { return false; } + + public LString luaGetType() { + return TYPE_NAME; + } } diff --git a/src/main/java/lua/value/LNumber.java b/src/main/java/lua/value/LNumber.java index 8b8f995c..72d8f4ae 100644 --- a/src/main/java/lua/value/LNumber.java +++ b/src/main/java/lua/value/LNumber.java @@ -5,6 +5,8 @@ import lua.Lua; abstract public class LNumber extends LValue { + public static final LString TYPE_NAME = new LString("number"); + /** Compare for equivalence by using lua op comparator */ public boolean equals(Object o) { if ( ! ( o instanceof LValue) ) @@ -13,4 +15,8 @@ public class LNumber extends LValue { return this.luaBinCmpUnknown(Lua.OP_EQ, v ); } + public LString luaGetType() { + return TYPE_NAME; + } + } diff --git a/src/main/java/lua/value/LString.java b/src/main/java/lua/value/LString.java index 6a76eb1b..675258f8 100644 --- a/src/main/java/lua/value/LString.java +++ b/src/main/java/lua/value/LString.java @@ -5,6 +5,8 @@ import lua.StackState; public class LString extends LValue { + public static final LString TYPE_NAME = new LString("string"); + final String m_string; final int m_hash; @@ -53,4 +55,8 @@ public class LString extends LValue { return new LInteger( m_string.length() ); } + public LString luaGetType() { + return TYPE_NAME; + } + } diff --git a/src/main/java/lua/value/LTable.java b/src/main/java/lua/value/LTable.java index 75092966..ea537d1c 100644 --- a/src/main/java/lua/value/LTable.java +++ b/src/main/java/lua/value/LTable.java @@ -7,6 +7,8 @@ import lua.CallFrame; public class LTable extends LValue { + public static final LString TYPE_NAME = new LString("table"); + /** Metatable tag for intercepting table gets */ private static final LString TM_INDEX = new LString("__index"); @@ -95,7 +97,7 @@ public class LTable extends LValue { } /** Iterator for tables */ - private static final class LTableIterator extends LValue { + private static final class LTableIterator extends LFunction { private final LTable t; private final Enumeration e; @@ -121,4 +123,8 @@ public class LTable extends LValue { } } + public LString luaGetType() { + return TYPE_NAME; + } + } diff --git a/src/main/java/lua/value/LThread.java b/src/main/java/lua/value/LThread.java index 90df63b7..76f6f5e6 100644 --- a/src/main/java/lua/value/LThread.java +++ b/src/main/java/lua/value/LThread.java @@ -1,5 +1,10 @@ package lua.value; public class LThread extends LValue { + public static final LString TYPE_NAME = new LString("thread"); + + public LString luaGetType() { + return TYPE_NAME; + } } diff --git a/src/main/java/lua/value/LValue.java b/src/main/java/lua/value/LValue.java index 3f64b176..6389c8e4 100644 --- a/src/main/java/lua/value/LValue.java +++ b/src/main/java/lua/value/LValue.java @@ -137,4 +137,6 @@ public class LValue { luaUnsupportedOperation(); } + /** Valid for all types: return the type of this value as an LString */ + public abstract LString luaGetType(); } diff --git a/src/test/java/lua/LuaJTest.java b/src/test/java/lua/LuaJTest.java index c7c64529..f7740235 100644 --- a/src/test/java/lua/LuaJTest.java +++ b/src/test/java/lua/LuaJTest.java @@ -47,6 +47,14 @@ public class LuaJTest extends TestCase { runTest( "compare" ); } + public void testSetlist() throws IOException, InterruptedException { + runTest( "setlist" ); + } + + public void testType() throws IOException, InterruptedException { + runTest( "type" ); + } + public void testUpvalues() throws IOException, InterruptedException { runTest( "upvalues" ); } @@ -55,10 +63,6 @@ public class LuaJTest extends TestCase { runTest( "upvalues2" ); } - public void testSetlist() throws IOException, InterruptedException { - runTest( "setlist" ); - } - private void runTest( String testName ) throws IOException, InterruptedException { // add LuaJava bindings LuaJava.install(); diff --git a/src/test/res/type.lua b/src/test/res/type.lua new file mode 100644 index 00000000..1619c3c4 --- /dev/null +++ b/src/test/res/type.lua @@ -0,0 +1,8 @@ +print(type(5)) +print(type(3.14)) +print(type("hello")) +print(type(function() return 1 end)) +print(type({})) +print(type(nil)) +print(type(2 < 5)) +print(type(pairs({}))) diff --git a/src/test/res/type.luac b/src/test/res/type.luac new file mode 100644 index 00000000..7dd5beb1 Binary files /dev/null and b/src/test/res/type.luac differ