diff --git a/src/core/org/luaj/vm2/LoadState.java b/src/core/org/luaj/vm2/LoadState.java index 37c74e9e..5c380c92 100644 --- a/src/core/org/luaj/vm2/LoadState.java +++ b/src/core/org/luaj/vm2/LoadState.java @@ -24,6 +24,7 @@ package org.luaj.vm2; import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; +import java.util.Hashtable; /* ** Loader to load compiled function prototypes @@ -275,10 +276,18 @@ public class LoadState { } public static LuaFunction load( InputStream stream, String name, LuaValue env ) throws IOException { + Prototype p = compile( stream, name ); + if ( compiler != null ) + return compiler.load(p, name, env); + else + return new LuaClosure( p, env ); + } + + public static Prototype compile( InputStream stream, String name ) throws IOException { int c = stream.read(); if ( c != LUA_SIGNATURE[0] ) { if ( compiler != null ) - return compiler.load(c, stream, name, env); + return compiler.compile(c, stream, name); throw new LuaError("no compiler"); } @@ -302,14 +311,9 @@ public class LoadState { default: throw new LuaError("unsupported int size"); } - - Prototype p = s.loadFunction( LuaString.valueOf(sname) ); - if ( compiler != null ) - return compiler.load(p, name, env); - else - return new LuaClosure( p, env ); + return s.loadFunction( LuaString.valueOf(sname) ); } - + public static String getSourceName(String name) { String sname = name; if ( name.startsWith("@") || name.startsWith("=") ) diff --git a/src/jse/org/luaj/vm2/luajc/JavaBytecodeCompiler.java b/src/jse/org/luaj/vm2/luajc/JavaBytecodeCompiler.java index a13fd651..c9abb865 100644 --- a/src/jse/org/luaj/vm2/luajc/JavaBytecodeCompiler.java +++ b/src/jse/org/luaj/vm2/luajc/JavaBytecodeCompiler.java @@ -23,11 +23,11 @@ package org.luaj.vm2.luajc; import java.io.IOException; import java.io.InputStream; +import java.util.Hashtable; import org.luaj.vm2.LoadState; import org.luaj.vm2.LuaClosure; import org.luaj.vm2.LuaFunction; -import org.luaj.vm2.LuaTable; import org.luaj.vm2.LuaValue; import org.luaj.vm2.Prototype; import org.luaj.vm2.LoadState.LuaCompiler; @@ -92,7 +92,21 @@ public class JavaBytecodeCompiler implements LuaCompiler { return gen.generateBytecode(p, toClassname(filename), toSourcename(filename)); } - + /** Compile all classes produced by a prototype, and put results in a hashtable */ + public static Hashtable loadClasses( InputStream stream, String filename ) throws IOException { + Prototype p = LoadState.compile( stream, filename ); + Hashtable t = new Hashtable(); + getInstance().genClass(t, p, toClassname(filename), toSourcename(filename)); + return t; + } + + private void genClass( Hashtable t, Prototype p, String className, String sourceName ) throws IOException { + for ( int i=0, n=p.p!=null? p.p.length: 0; i