diff --git a/src/jse/luajc.java b/src/jse/luajc.java index d6fa9176..959cae4f 100644 --- a/src/jse/luajc.java +++ b/src/jse/luajc.java @@ -215,16 +215,14 @@ public class luajc { if ( loadclasses ) { ClassLoader loader = new ClassLoader() { public Class findClass(String classname) throws ClassNotFoundException { - String key = classname.replace('.', '/'); - byte[] bytes = (byte[]) t.get(key); + byte[] bytes = (byte[]) t.get(classname); if ( bytes != null ) return defineClass(classname, bytes, 0, bytes.length); return super.findClass(classname); } }; for ( Enumeration e = t.keys(); e.hasMoreElements(); ) { - String key = (String) e.nextElement(); - String classname = key.replace('/', '.'); + String classname = (String) e.nextElement(); try { Class c = loader.loadClass(classname); Object o = c.newInstance(); diff --git a/src/jse/org/luaj/vm2/luajc/JavaGen.java b/src/jse/org/luaj/vm2/luajc/JavaGen.java index 9d795031..7d56dbab 100644 --- a/src/jse/org/luaj/vm2/luajc/JavaGen.java +++ b/src/jse/org/luaj/vm2/luajc/JavaGen.java @@ -31,9 +31,9 @@ import org.luaj.vm2.Prototype; */ public class JavaGen { - public String classname; - public byte[] bytecode; - public JavaGen[] inners; + public final String classname; + public final byte[] bytecode; + public final JavaGen[] inners; public JavaGen( Prototype p, String classname, String filename ) { this( new ProtoInfo(p,classname), classname, filename ); diff --git a/src/jse/org/luaj/vm2/luajc/LuaJC.java b/src/jse/org/luaj/vm2/luajc/LuaJC.java index 0a9a49ee..9e53f7dc 100644 --- a/src/jse/org/luaj/vm2/luajc/LuaJC.java +++ b/src/jse/org/luaj/vm2/luajc/LuaJC.java @@ -34,7 +34,7 @@ import org.luaj.vm2.compiler.LuaC; public class LuaJC implements LuaCompiler { - private static final String NON_IDENTIFIER = "[^a-zA-Z0-9_$]"; + private static final String NON_IDENTIFIER = "[^a-zA-Z0-9_$/.\\-]"; private static LuaJC instance; @@ -55,10 +55,12 @@ public class LuaJC implements LuaCompiler { public LuaJC() { } - public Hashtable compileAll(InputStream script, String classname, String filename) throws IOException { + public Hashtable compileAll(InputStream script, String chunkname, String filename) throws IOException { + String classname = toStandardJavaClassName( chunkname ); + String luaname = toStandardLuaFileName( filename ); Hashtable h = new Hashtable(); Prototype p = LuaC.instance.compile(script, classname); - JavaGen gen = new JavaGen(p, classname, filename); + JavaGen gen = new JavaGen(p, classname, luaname); insert( h, gen ); return h; } @@ -71,9 +73,29 @@ public class LuaJC implements LuaCompiler { public LuaFunction load(InputStream stream, String name, LuaValue env) throws IOException { Prototype p = LuaC.instance.compile(stream, name); - String classname = name.endsWith(".lua")? name.substring(0,name.length()-4): name; - classname = classname.replaceAll(NON_IDENTIFIER, "_"); + String classname = toStandardJavaClassName( name ); + String luaname = toStandardLuaFileName( name ); JavaLoader loader = new JavaLoader(env); - return loader.load(p, classname, name); + return loader.load(p, classname, luaname); + } + + private static String toStandardJavaClassName( String luachunkname ) { + String stub = toStub( luachunkname ); + String classname = stub.replace('/','.').replaceAll(NON_IDENTIFIER, "_"); + int c = classname.charAt(0); + if ( c!='_' && !Character.isJavaIdentifierStart(c) ) + classname = "_"+classname; + return classname; + } + + private static String toStandardLuaFileName( String luachunkname ) { + String stub = toStub( luachunkname ); + String filename = stub.replace('.','/')+".lua"; + return filename; + } + + private static String toStub( String s ) { + String stub = s.endsWith(".lua")? s.substring(0,s.length()-4): s; + return stub; } }