Factor out loaders.

This commit is contained in:
James Roseborough
2010-04-28 04:43:50 +00:00
parent 3ca4849033
commit 27bf60b903

View File

@@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 200 Luaj.org. All rights reserved. * Copyright (c) 2010 Luaj.org. All rights reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@@ -36,12 +36,24 @@ import org.luaj.vm2.Varargs;
public class PackageLib extends OneArgFunction { public class PackageLib extends OneArgFunction {
public static String DEFAULT_LUA_PATH = "?.lua"; public static String DEFAULT_LUA_PATH = "?.lua";
/** Most recent instance of PackageLib */
public static PackageLib instance;
public InputStream STDIN = null; public InputStream STDIN = null;
public PrintStream STDOUT = System.out; public PrintStream STDOUT = System.out;
public LuaTable LOADED; public LuaTable LOADED;
public LuaTable PACKAGE; public LuaTable PACKAGE;
/** Loader that loads from preload table if found there */
public final LuaValue preload_loader;
/** Loader that loads as a lua script using the LUA_PATH */
public final LuaValue lua_loader;
/** Loader that loads as a Java class. Class must have public constructor and be a LuaValue */
public final LuaValue java_loader;
private static final LuaString _M = valueOf("_M"); private static final LuaString _M = valueOf("_M");
private static final LuaString _NAME = valueOf("_NAME"); private static final LuaString _NAME = valueOf("_NAME");
private static final LuaString _PACKAGE = valueOf("_PACKAGE"); private static final LuaString _PACKAGE = valueOf("_PACKAGE");
@@ -54,30 +66,34 @@ public class PackageLib extends OneArgFunction {
private static final LuaString _SEEALL = valueOf("seeall"); private static final LuaString _SEEALL = valueOf("seeall");
private static final LuaString _SENTINEL = valueOf("\u0001"); private static final LuaString _SENTINEL = valueOf("\u0001");
private static final int MODULE = 0; private static final int OP_MODULE = 0;
private static final int REQUIRE = 1; private static final int OP_REQUIRE = 1;
private static final int LOADLIB = 2; private static final int OP_LOADLIB = 2;
private static final int SEEALL = 3; private static final int OP_SEEALL = 3;
private static final int PRELOAD_LOADER = 4; private static final int OP_PRELOAD_LOADER = 4;
private static final int LUA_LOADER = 5; private static final int OP_LUA_LOADER = 5;
private static final int JAVA_LOADER = 6; private static final int OP_JAVA_LOADER = 6;
public PackageLib() { public PackageLib() {
instance = this;
preload_loader = new PkgLibV(env,"preload_loader", OP_PRELOAD_LOADER,this);
lua_loader = new PkgLibV(env,"lua_loader", OP_LUA_LOADER,this);
java_loader = new PkgLibV(env,"java_loader", OP_JAVA_LOADER,this);
} }
public LuaValue call(LuaValue arg) { public LuaValue call(LuaValue arg) {
env.set("require", new PkgLib1(env,"require",REQUIRE,this)); env.set("require", new PkgLib1(env,"require",OP_REQUIRE,this));
env.set("module", new PkgLibV(env,"module",MODULE,this)); env.set("module", new PkgLibV(env,"module",OP_MODULE,this));
env.set( "package", PACKAGE=tableOf( new LuaValue[] { env.set( "package", PACKAGE=tableOf( new LuaValue[] {
_LOADED, LOADED=tableOf(), _LOADED, LOADED=tableOf(),
_PRELOAD, tableOf(), _PRELOAD, tableOf(),
_PATH, valueOf(DEFAULT_LUA_PATH), _PATH, valueOf(DEFAULT_LUA_PATH),
_LOADLIB, new PkgLibV(env,"loadlib",LOADLIB,this), _LOADLIB, new PkgLibV(env,"loadlib",OP_LOADLIB,this),
_SEEALL, new PkgLib1(env,"seeall",SEEALL,this), _SEEALL, new PkgLib1(env,"seeall",OP_SEEALL,this),
_LOADERS, listOf(new LuaValue[] { _LOADERS, listOf(new LuaValue[] {
new PkgLibV(env,"preload_loader", PRELOAD_LOADER,this), preload_loader,
new PkgLibV(env,"lua_loader", LUA_LOADER,this), lua_loader,
new PkgLibV(env,"java_loader", JAVA_LOADER,this), java_loader,
}) }) ); }) }) );
return env; return env;
} }
@@ -92,9 +108,9 @@ public class PackageLib extends OneArgFunction {
} }
public LuaValue call(LuaValue arg) { public LuaValue call(LuaValue arg) {
switch ( opcode ) { switch ( opcode ) {
case REQUIRE: case OP_REQUIRE:
return lib.require(arg); return lib.require(arg);
case SEEALL: { case OP_SEEALL: {
LuaTable t = arg.checktable(); LuaTable t = arg.checktable();
LuaValue m = t.getmetatable(); LuaValue m = t.getmetatable();
if ( m == null ) if ( m == null )
@@ -117,17 +133,17 @@ public class PackageLib extends OneArgFunction {
} }
public Varargs invoke(Varargs args) { public Varargs invoke(Varargs args) {
switch ( opcode ) { switch ( opcode ) {
case MODULE: case OP_MODULE:
return lib.module(args); return lib.module(args);
case LOADLIB: case OP_LOADLIB:
return loadlib(args); return loadlib(args);
case PRELOAD_LOADER: { case OP_PRELOAD_LOADER: {
return lib.loader_preload(args); return lib.loader_preload(args);
} }
case LUA_LOADER: { case OP_LUA_LOADER: {
return lib.loader_Lua(args); return lib.loader_Lua(args);
} }
case JAVA_LOADER: { case OP_JAVA_LOADER: {
return lib.loader_Java(args); return lib.loader_Java(args);
} }
} }