Improve arguments to luajc command.

This commit is contained in:
James Roseborough
2010-07-30 00:16:12 +00:00
parent 1f68fbc013
commit 860ca581ab
3 changed files with 145 additions and 84 deletions

View File

@@ -118,7 +118,7 @@ public class lua2java {
System.out.println(version); System.out.println(version);
System.out.println("srcdir: "+srcdir); System.out.println("srcdir: "+srcdir);
System.out.println("destdir: "+destdir); System.out.println("destdir: "+destdir);
System.out.println("files: "+files); System.out.println("files: "+seeds);
System.out.println("encoding: "+encoding); System.out.println("encoding: "+encoding);
System.out.println("recurse: "+recurse); System.out.println("recurse: "+recurse);
} }

View File

@@ -20,16 +20,18 @@
* THE SOFTWARE. * THE SOFTWARE.
******************************************************************************/ ******************************************************************************/
import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.util.ArrayList;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.Vector; import java.util.List;
import org.luaj.vm2.Lua; import org.luaj.vm2.Lua;
import org.luaj.vm2.compiler.DumpState; import org.luaj.vm2.compiler.DumpState;
import org.luaj.vm2.lib.JsePlatform;
import org.luaj.vm2.luajc.LuaJC; import org.luaj.vm2.luajc.LuaJC;
/** /**
@@ -39,16 +41,16 @@ public class luajc {
private static final String version = Lua._VERSION + "Copyright (C) 2009 luaj.org"; private static final String version = Lua._VERSION + "Copyright (C) 2009 luaj.org";
private static final String usage = private static final String usage =
"usage: java -cp luaj-jse.jar,bcel-5.2.jar luajc [options] [filenames].\n" + "usage: java -cp luaj-jse.jar,bcel-5.2.jar luajc [options] fileordir [, fileordir ...]\n" +
"Available options are:\n" + "Available options are:\n" +
" - process stdin\n" + " - process stdin\n" +
" -s source directory\n" + " -s src source directory\n" +
" -d destination directory\n" + " -d dir destination directory\n" +
" -p pkg package prefix to apply to all classes\n" +
" -n no debug information (strip debug)\n" + " -n no debug information (strip debug)\n" +
" -e little endian format for numbers\n" +
" -i<n> number format 'n', (n=0,1 or 4, default="+DumpState.NUMBER_FORMAT_DEFAULT+")\n" + " -i<n> number format 'n', (n=0,1 or 4, default="+DumpState.NUMBER_FORMAT_DEFAULT+")\n" +
" -v show version information\n" + " -r recursively compile all\n" +
" -- stop handling options\n"; " -v verbose\n";
private static void usageExit() { private static void usageExit() {
System.out.println(usage); System.out.println(usage);
@@ -58,9 +60,11 @@ public class luajc {
private String srcdir = null; private String srcdir = null;
private String destdir = null; private String destdir = null;
private boolean stripdebug = false; private boolean stripdebug = false;
private boolean littleendian = false;
private int numberformat = DumpState.NUMBER_FORMAT_DEFAULT; private int numberformat = DumpState.NUMBER_FORMAT_DEFAULT;
private boolean recurse = false;
private boolean verbose = false; private boolean verbose = false;
private String pkgprefix = null;
private List<InputFile> files = new ArrayList<InputFile>();
public static void main( String[] args ) throws IOException { public static void main( String[] args ) throws IOException {
new luajc( args ); new luajc( args );
@@ -69,93 +73,150 @@ public class luajc {
private luajc( String[] args ) throws IOException { private luajc( String[] args ) throws IOException {
// process args // process args
try { List<String> seeds = new ArrayList<String> ();
Vector files = new Vector();
// get stateful args
// get stateful args for ( int i=0; i<args.length; i++ ) {
for ( int i=0; i<args.length; i++ ) { if ( ! args[i].startsWith("-") ) {
if ( ! args[i].startsWith("-") ) { seeds.add(args[i]);
files.add(args[i]); } else {
} else { switch ( args[i].charAt(1) ) {
switch ( args[i].charAt(1) ) { case 's':
case 's': if ( ++i >= args.length )
if ( ++i >= args.length )
usageExit();
srcdir = args[i];
break;
case 'd':
if ( ++i >= args.length )
usageExit();
destdir = args[i];
break;
case 'n':
stripdebug = true;
break;
case 'e':
littleendian = true;
break;
case 'i':
if ( args[i].length() <= 2 )
usageExit();
numberformat = Integer.parseInt(args[i].substring(2));
break;
case 'v':
verbose = true;
break;
default:
usageExit(); usageExit();
break; srcdir = args[i];
} break;
case 'd':
if ( ++i >= args.length )
usageExit();
destdir = args[i];
break;
case 'n':
stripdebug = true;
break;
case 'i':
if ( args[i].length() <= 2 )
usageExit();
numberformat = Integer.parseInt(args[i].substring(2));
break;
case 'p':
if ( ++i >= args.length )
usageExit();
pkgprefix = args[i];
break;
case 'r':
recurse = true;
break;
case 'v':
verbose = true;
break;
default:
usageExit();
break;
} }
} }
}
// echo version
if ( verbose ) { // echo version
System.out.println(version); if ( verbose ) {
System.out.println("srcdir: "+srcdir); System.out.println(version);
System.out.println("destdir: "+srcdir); System.out.println("srcdir: "+srcdir);
System.out.println("stripdebug: "+stripdebug); System.out.println("destdir: "+srcdir);
System.out.println("littleendian: "+littleendian); System.out.println("stripdebug: "+stripdebug);
System.out.println("numberformat: "+numberformat); System.out.println("numberformat: "+numberformat);
System.out.println("files: "+files); System.out.println("files: "+seeds);
} System.out.println("recurse: "+recurse);
}
// process input files // need at least one seed
for ( int i=0; i<files.size(); i++ ) { if ( seeds.size() <= 0 ) {
String filename = (String) files.elementAt(i); System.err.println(usage);
int index = filename.lastIndexOf('.'); System.exit(-1);
if ( index < 0 ) }
usageExit();
String chunkname = filename.substring(0,index); // collect up files to process
String sourcepath = srcdir!=null? srcdir+"/"+filename: filename; for ( int i=0; i<seeds.size(); i++ )
if ( verbose ) collectFiles( srcdir+"/"+seeds.get(i) );
System.out.println("filename="+filename+" chunkname="+filename+" sourcepath="+sourcepath);
InputStream is = new FileInputStream( sourcepath ); // check for at least one file
processScript( is, chunkname, filename ); if ( files.size() <= 0 ) {
} System.err.println("no files found in "+seeds);
System.exit(-1);
} catch ( IOException ioe ) { }
System.err.println( ioe.toString() );
System.exit(-2); // process input files
JsePlatform.standardGlobals();
for ( InputFile inf : files )
processFile( inf );
}
private void collectFiles(String path) {
File f = new File(path);
if ( f.isDirectory() && recurse )
scandir(f,pkgprefix);
else if ( f.isFile() ) {
File dir = f.getAbsoluteFile().getParentFile();
if ( dir != null )
scanfile( dir, f, pkgprefix );
}
}
private void scandir(File dir, String javapackage) {
File[] f = dir.listFiles();
for ( int i=0; i<f.length; i++ )
scanfile( dir, f[i], javapackage );
}
private void scanfile(File dir, File f, String javapackage) {
if ( f.exists() ) {
if ( f.isDirectory() && recurse )
scandir( f, (javapackage!=null? javapackage+"."+f.getName(): f.getName()) );
else if ( f.isFile() && f.getName().endsWith(".lua") )
files.add( new InputFile(dir,f,javapackage) );
}
}
class InputFile {
public String luachunkname;
public String srcfilename;
public File infile;
public File outdir;
public String javapackage;
public InputFile(File dir, File f, String javapackage) {
this.infile = f;
String subdir = javapackage!=null? javapackage.replace('.', '/'): null;
String outdirpath = subdir!=null? destdir+"/"+subdir: destdir;
this.javapackage = javapackage;
this.srcfilename = (subdir!=null? subdir+"/": "")+infile.getName();
this.luachunkname = (subdir!=null? subdir+"/": "")+infile.getName().substring( 0, infile.getName().lastIndexOf('.') );
this.infile = f;
this.outdir = new File(outdirpath);
} }
} }
private void processScript( InputStream script, String chunkname, String filename) throws IOException {
private void processFile( InputFile inf ) {
inf.outdir.mkdirs();
try { try {
// create the chunk if ( verbose )
Hashtable t = LuaJC.getInstance().compileAll(script, chunkname, filename); System.out.println("chunk="+inf.luachunkname+" srcfile="+inf.srcfilename);
// create the chunk
FileInputStream fis = new FileInputStream( inf.infile );
Hashtable t = LuaJC.getInstance().compileAll(fis, inf.luachunkname, inf.srcfilename);
fis.close();
// write out the chunk // write out the chunk
for ( Enumeration e = t.keys(); e.hasMoreElements(); ) { for ( Enumeration e = t.keys(); e.hasMoreElements(); ) {
String key = (String) e.nextElement(); String key = (String) e.nextElement();
byte[] bytes = (byte[]) t.get(key); byte[] bytes = (byte[]) t.get(key);
if ( key.indexOf('/')>=0 ) {
String d = (destdir!=null? destdir+"/": "")+key.substring(0,key.lastIndexOf('/'));
new File(d).mkdirs();
}
String destpath = (destdir!=null? destdir+"/": "") + key + ".class"; String destpath = (destdir!=null? destdir+"/": "") + key + ".class";
if ( verbose ) if ( verbose )
System.out.println( System.out.println( " "+destpath +" ("+bytes.length+" bytes)");
"chunk "+chunkname+
" from "+filename+
" written to "+destpath
+" length="+bytes.length+" bytes");
FileOutputStream fos = new FileOutputStream( destpath ); FileOutputStream fos = new FileOutputStream( destpath );
fos.write( bytes ); fos.write( bytes );
fos.close(); fos.close();
@@ -163,8 +224,6 @@ public class luajc {
} catch ( Throwable t ) { } catch ( Throwable t ) {
t.printStackTrace( System.err ); t.printStackTrace( System.err );
} finally {
script.close();
} }
} }
} }

View File

@@ -317,6 +317,8 @@ public class Slots {
} }
private boolean propogatebranch(int src, int dest) { private boolean propogatebranch(int src, int dest) {
if ( dest >= slots.length )
return false;
boolean hadchanges = false; boolean hadchanges = false;
byte[] s = slots[src]; byte[] s = slots[src];
byte[] d = slots[dest]; byte[] d = slots[dest];