From 5d3c86e55291f88284d806bf1cbcf218e01794c9 Mon Sep 17 00:00:00 2001 From: James Roseborough Date: Sat, 16 Jun 2007 15:31:27 +0000 Subject: [PATCH] Partial implementation of metatables. --- .settings/org.eclipse.jdt.core.prefs | 12 ++++++++ .settings/org.eclipse.jdt.ui.prefs | 3 ++ src/main/java/lua/Builtin.java | 24 +++++++++++---- src/main/java/lua/io/Closure.java | 2 +- src/main/java/lua/value/LTable.java | 21 ++++++++++--- src/main/java/lua/value/LValue.java | 12 +++++++- src/test/java/LuacRunner.java | 2 +- src/test/res/compile.sh | 2 +- src/test/res/test6.lua | 44 +++++++++++++++++++++++++++ src/test/res/test6.luac | Bin 0 -> 1337 bytes 10 files changed, 108 insertions(+), 14 deletions(-) create mode 100644 .settings/org.eclipse.jdt.core.prefs create mode 100644 .settings/org.eclipse.jdt.ui.prefs create mode 100644 src/test/res/test6.lua create mode 100644 src/test/res/test6.luac diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..b2968cb3 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,12 @@ +#Sat Jun 16 07:29:29 PDT 2007 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.4 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning +org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning +org.eclipse.jdt.core.compiler.source=1.3 diff --git a/.settings/org.eclipse.jdt.ui.prefs b/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 00000000..e90091dd --- /dev/null +++ b/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,3 @@ +#Sat Jun 16 07:29:29 PDT 2007 +eclipse.preferences.version=1 +internal.default.compliance=default diff --git a/src/main/java/lua/Builtin.java b/src/main/java/lua/Builtin.java index 878434ba..3b4b0be8 100644 --- a/src/main/java/lua/Builtin.java +++ b/src/main/java/lua/Builtin.java @@ -18,8 +18,10 @@ final class Builtin extends LFunction { private static final int PRINT = 0; private static final int PAIRS = 1; + private static final int GETMETATABLE = 2; + private static final int SETMETATABLE = 3; - private static final String[] NAMES = { "print", "pairs" }; + private static final String[] NAMES = { "print", "pairs", "getmetatable", "setmetatable" }; private int id; private Builtin( int id ) { @@ -31,7 +33,7 @@ final class Builtin extends LFunction { } // perform a lua call - public void luaStackCall(StackState state, int base, int top) { + public void luaStackCall(StackState state, int base, int top, int nresults) { switch ( id ) { case PRINT: for ( int i=base+1; i= 0) + state.adjustTop(base + nresults); } } \ No newline at end of file diff --git a/src/main/java/lua/io/Closure.java b/src/main/java/lua/io/Closure.java index b6caa492..2e1c17e8 100644 --- a/src/main/java/lua/io/Closure.java +++ b/src/main/java/lua/io/Closure.java @@ -16,7 +16,7 @@ public class Closure extends LValue { } // perform a lua call - public void luaStackCall(StackState state, int base, int top) { + public void luaStackCall(StackState state, int base, int top, int nresults) { state.setupCall( this, base, top ); } diff --git a/src/main/java/lua/value/LTable.java b/src/main/java/lua/value/LTable.java index 51713310..6a5dc337 100644 --- a/src/main/java/lua/value/LTable.java +++ b/src/main/java/lua/value/LTable.java @@ -2,13 +2,13 @@ package lua.value; import java.util.Enumeration; import java.util.Hashtable; -import java.util.Vector; import lua.StackState; public class LTable extends LValue { private Hashtable m_hash = new Hashtable(); + private LValue m_metatable; public LTable() { } @@ -34,6 +34,16 @@ public class LTable extends LValue { return new LInteger( m_hash.size() ); } + /** Valid for tables */ + public LValue luaGetMetatable() { + return this.m_metatable; + } + + /** Valid for tables */ + public void luaSetMetatable(LValue metatable) { + this.m_metatable = metatable; + } + /** Valid for tables */ public LValue luaPairs() { Enumeration e = m_hash.keys(); @@ -51,15 +61,18 @@ public class LTable extends LValue { } // perform a lua call - public void luaStackCall(StackState state, int base, int top) { + public void luaStackCall(StackState state, int base, int top, int nresults) { if ( e.hasMoreElements() ) { LValue key = (LValue) e.nextElement(); - state.adjustTop(base+2); state.stack[base] = key; state.stack[base+1] = t.luaGetTable(key); + state.top = base+2; } else { - state.adjustTop(base); + state.stack[base] = LNil.NIL; + state.top = base+1; } + if ( nresults >= 0 ) + state.adjustTop(base + nresults); } } diff --git a/src/main/java/lua/value/LValue.java b/src/main/java/lua/value/LValue.java index 21297293..c787495d 100644 --- a/src/main/java/lua/value/LValue.java +++ b/src/main/java/lua/value/LValue.java @@ -16,7 +16,7 @@ public class LValue { } // perform a lua call, return number of results actually produced - public void luaStackCall(StackState state, int base, int top) { + public void luaStackCall(StackState state, int base, int top, int nresults) { luaUnsupportedOperation(); } @@ -111,5 +111,15 @@ public class LValue { return luaUnsupportedOperation(); } + /** Valid for tables */ + public LValue luaGetMetatable() { + return luaUnsupportedOperation(); + } + + /** Valid for tables */ + public void luaSetMetatable(LValue metatable) { + luaUnsupportedOperation(); + } + } diff --git a/src/test/java/LuacRunner.java b/src/test/java/LuacRunner.java index 3d4b4844..d2e4df92 100644 --- a/src/test/java/LuacRunner.java +++ b/src/test/java/LuacRunner.java @@ -38,7 +38,7 @@ public class LuacRunner { state.push( c ); for ( int i=0; i zu^*7HOP_Yh&#jNRbc-{MeD@olZBY2t!;BEM6V&|Rvw_Qf9Z!12oE8bu%t?nw4r!r9 zF38ynv{=?*`dm!Eb8>pir0vY=@`?sOZ|RU zWcRIJGApGK8uMchdIK~lrbWGUXsTg&%k~Q+u?{agPR6F@K&8s|TP~k9e=Tu@xfZu0$tncsFQ+h_00000 literal 0 HcmV?d00001