From b493230edb8356bb41641261cf35bf1d02479a13 Mon Sep 17 00:00:00 2001 From: James Roseborough Date: Thu, 29 Nov 2007 01:11:18 +0000 Subject: [PATCH] Initial implementation of module, package.seeall --- src/core/org/luaj/lib/BaseLib.java | 18 ++-- src/core/org/luaj/lib/PackageLib.java | 123 ++++++++++++++++++++++-- src/core/org/luaj/vm/LNil.java | 3 +- src/core/org/luaj/vm/LString.java | 11 +++ src/core/org/luaj/vm/LuaState.java | 10 +- src/test/java/org/luaj/vm/LuaJTest.java | 6 +- src/test/res/module.lua | 63 ++++++++++++ src/test/res/module.luac | Bin 0 -> 3366 bytes 8 files changed, 210 insertions(+), 24 deletions(-) create mode 100644 src/test/res/module.lua create mode 100644 src/test/res/module.luac diff --git a/src/core/org/luaj/lib/BaseLib.java b/src/core/org/luaj/lib/BaseLib.java index a43a1306..087a82c9 100644 --- a/src/core/org/luaj/lib/BaseLib.java +++ b/src/core/org/luaj/lib/BaseLib.java @@ -153,7 +153,7 @@ public class BaseLib extends LFunction { } case GETMETATABLE: { checkargexists(vm,2,Lua.LUA_TVALUE); - if ( 0 == vm.getmetatable(2) ) { + if ( ! vm.getmetatable(2) ) { vm.resettop(); vm.pushnil(); } else { @@ -248,14 +248,16 @@ public class BaseLib extends LFunction { vm.pushlvalue(t); } break; case GETFENV: { - if ( vm.gettop() <= 1 ) { - vm.pushlvalue(vm._G); - } else { - if ( ! vm.isfunction(2) ) { - int i = (vm.isnil(2)? 1: vm.tointeger(2)); - vm.pushlvalue( vm.getStackFrame(i).closure ); - } + if ( vm.isfunction(2) ) { vm.getfenv(-1); + } else { + int i = (vm.isnil(2)? 1: vm.tointeger(2)); + if ( i <= 0 ) + vm.pushlvalue(vm._G); + else if ( i-1 <= vm.cc ) + vm.pushlvalue( vm.getStackFrame(i-1).closure.env ); + else + vm.pushnil(); } vm.insert(1); vm.settop(1); diff --git a/src/core/org/luaj/lib/PackageLib.java b/src/core/org/luaj/lib/PackageLib.java index 9830fe28..35c40c40 100644 --- a/src/core/org/luaj/lib/PackageLib.java +++ b/src/core/org/luaj/lib/PackageLib.java @@ -24,12 +24,14 @@ package org.luaj.lib; import java.io.InputStream; import java.io.PrintStream; +import org.luaj.vm.CallInfo; import org.luaj.vm.LBoolean; import org.luaj.vm.LFunction; import org.luaj.vm.LNil; import org.luaj.vm.LString; import org.luaj.vm.LTable; import org.luaj.vm.LValue; +import org.luaj.vm.Lua; import org.luaj.vm.LuaState; @@ -38,6 +40,13 @@ public class PackageLib extends LFunction { public static InputStream STDIN = null; public static PrintStream STDOUT = System.out; public static LTable LOADED = new LTable(); + + private static final LString _M = new LString("_M"); + private static final LString _NAME = new LString("_NAME"); + private static final LString _PACKAGE = new LString("_PACKAGE"); + private static final LString _DOT = new LString("."); + private static final LString _EMPTY = new LString(""); + private static final LString __INDEX = new LString("__index"); private static final String[] NAMES = { "package", @@ -51,7 +60,8 @@ public class PackageLib extends LFunction { private static final int MODULE = 1; private static final int REQUIRE = 2; private static final int LOADLIB = 3; - private static final int SEEALL = 4; + private static final int SEEALL = 4; + public static void install( LTable globals ) { for ( int i=1; i= m_offset; --i ) { + if ( equals( m_bytes, i, s.m_bytes, s.m_offset, slen ) ) { + return i; + } + } + return -1; + } + public static LString valueOf( double d ) { return new LString( String.valueOf( d ) ); } diff --git a/src/core/org/luaj/vm/LuaState.java b/src/core/org/luaj/vm/LuaState.java index 49aa0ed0..bbb56289 100644 --- a/src/core/org/luaj/vm/LuaState.java +++ b/src/core/org/luaj/vm/LuaState.java @@ -1355,15 +1355,17 @@ public class LuaState extends Lua { *

* Pushes onto the stack the metatable of the value at the given acceptable * index. If the index is not valid, or if the value does not have a - * metatable, the function returns 0 and pushes nothing on the stack. + * metatable, the function returns false and pushes nothing on the stack. + * + * @return true if the metatable was pushed onto the stack, false otherwise */ - public int getmetatable(int index) { + public boolean getmetatable(int index) { LTable mt = topointer(index).luaGetMetatable(); if ( mt != null ) { pushlvalue( mt ); - return 1; + return true; } - return 0; + return false; } /** diff --git a/src/test/java/org/luaj/vm/LuaJTest.java b/src/test/java/org/luaj/vm/LuaJTest.java index eda119dd..d7e98023 100644 --- a/src/test/java/org/luaj/vm/LuaJTest.java +++ b/src/test/java/org/luaj/vm/LuaJTest.java @@ -13,7 +13,7 @@ import org.luaj.lib.j2se.LuajavaLib; public class LuaJTest extends TestCase { - + public void testTest1() throws IOException, InterruptedException { runTest( "test1" ); } @@ -78,6 +78,10 @@ public class LuaJTest extends TestCase { runTest( "metatables" ); } + public void testModule() throws IOException, InterruptedException { + runTest( "module" ); + } + public void testNext() throws IOException, InterruptedException { runTest( "next" ); } diff --git a/src/test/res/module.lua b/src/test/res/module.lua new file mode 100644 index 00000000..c25a49fe --- /dev/null +++ b/src/test/res/module.lua @@ -0,0 +1,63 @@ +-- unit tests for module() function +local ids = {} +local function id(obj) + if not obj or type(obj) == 'number' or type(obj) == 'string' then + return obj + end + local v = ids[obj] + if v then + return v + end + table.insert(ids,obj) + ids[obj] = type(obj)..'.'..tostring(#ids) + return ids[obj] +end + +-- module tests +local pr = print +local pkg = package +local g = _G +local md = module +local rq = require +local sa = package.seeall +local gfe = getfenv +local gmt = getmetatable +local function envs() + return id(gfe(0)), id(gfe(1)), id(gfe(2)), + id(gmt(gfe(0))), id(gmt(gfe(1))), id(gmt(gfe(2))) +end +local function trymodule(name) + pr( '_G['..name..']', id(g[name]) ) + pr( 'pkg.loaded['..name..']', id(pkg.loaded[name]) ) + pr( 'envs', envs() ) + md(name) + pr( 'envs', envs() ) + pr( 'status,result', status, result ) + pr( '_G['..name..']', id(g[name]) ) + local t = pkg.loaded[name] + pr( 't=pkg.loaded['..name..']', id(t) ) + pr( 't._M, t._NAME, t._PACKAGE', id(t._M), id(t._NAME), id(t._PACKAGE) ) + pr( 'rq('..name..')', id( rq(name) ) ) + pr( 'print', id(print) ) + pr( 'seeall(t)', sa(t) ) + pr( 'print, _G['..name..']', id(print), id(g[name]) ) +end +trymodule('abc.def.ghi') +trymodule('abc.def.ghi') +trymodule('abc.def') +trymodule('abc.def.lmn') +trymodule('abc.def') +trymodule('abc') +package.loaded['opq.rst'] = {} +trymodule('opq.rst') +trymodule('opq.rst') +uvw = { xyz="x1y1z1" } +--print( "uvw", id(uvw) ) +--print( "uvw.xyz", id(uvw.xyz) ) +--print( "uvw.abc", id(uvw.abc) ) +print( pcall( trymodule, 'uvw.xyz' ) ) +print( pcall( trymodule, 'uvw' ) ) +print( pcall( trymodule, 'uvw.abc' ) ) +print( "uvw", id(uvw) ) +print( "uvw.xyz", id(uvw.xyz) ) +print( "uvw.abc", id(uvw.abc) ) diff --git a/src/test/res/module.luac b/src/test/res/module.luac new file mode 100644 index 0000000000000000000000000000000000000000..003d4253b28eab92e17f652a91e1df0d70446ec1 GIT binary patch literal 3366 zcmcImT~i}P6uq691Xx#HzjoD)h##x0Vidm~)OBYJVXIUueX>g9QUe)cBngmAaM`B` z1T5e6jq=GKl0e`e_{O6@z@Okb)6*e==mx8tsxy82^yxd@eQ$Tq_0JpLSE6j&9+%4^ z;#AfOjk2F9H$2qLlen@7^Ab>qsa=#uj!3d8lIw`Ri{Hce46mp}h06ilnS;>Qi`~$nNY# zzOvS--`Ktc-GtTsX>7-mB(%A#jZuWj&WwHGiW~ zszJbpy6=1CvTi8)!HQqq6#HQ`pi=PzFYuPikTMCprR7Y)U&$1|FKK;D47QdlRk0CR z%JnD8YhJ-G=q_vP8<|=iBc-CT`J*=OZQa+>d$U`!_h;iNE%ycnVJ6aWeyq?pr^koo zBLGru>=l&H0#}_xm_r!?`B2o?PFt>u8sM&lK?tq68g3Gz1L%s9@R{ zFd`f?$F{cg1KuJx0CJo1Xk6n)r=nD-<1O+GkOmOb2{W@ftX&ga9_yG6Mdo0)z;ztN z1RUZUt#ucig75^~KDaJ)wnA(b`r|`+*lCoA8+n;Sy@j@p3qP>YF6m~(GoGr8Hnj~s zY_zk#AXk7e$~op;^u)$rw+-Wv=J1({{}tEK_x}Kwmk$R^l&~{V6jzXwEGq%tBF_Oc zz_^m}D#|$kiz977xgx(J`MKg)NtIHP;Hu}HSQie{g(}r?66dtoT3w{Y34H1PVFKN0 zN4v6lt{vlWaI1t$k{v}|V)U_vYQEi$c6tln=r9`*RTuN&uC)k9_ zWxjd9?1-{yuX7;W>CB#Ebr@yOsUC|;pG~Xh6PboP<1_<%+O`$>&UJ7D^?wtQz&EY) zW3kVTH|iUYi&?wJQz-VuOnn^lw9ySW!MFMp`A(nL>#N0#KAFMuBrwNx5;ksuy4c*q zbzA|B`b^EQH_AAMDAbg;4NqxsYrrQHKgcXD%uM0^g}ac8j4$2nXYQR`d^;`Z^Db)E zhudOLz(LnGruCq2YGHiM@s~qiT+;zscy2{4GgF);AExZ&hPH z@e;VRcp2O%xB;C3Pm~AYRcJ1PY3N7AO=ySVHSojmI{1r%M-Db6|Nf-vReTiqc>zcU z@@`z?jfH)NsGBp4?YKS3trny1Q4Uj7DMX^$MpV>2;a@BDOj_bGfcxYLfPYj^0r(4u za1G_t0FTXnaG(#u8_*bJU>m#%+u$wO2D7jY-iB@P4(xt#6%5{kZSX#9gAZU2!-wF9 z;Un