Fix midlet example including luajc-compiled scripts

This commit is contained in:
James Roseborough
2010-04-25 05:35:24 +00:00
parent 90ca65c7d9
commit de9c967ac5
3 changed files with 96 additions and 73 deletions

View File

@@ -1,5 +1,5 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<project name="sample" default="build" basedir="."> <project name="sample" default="all" basedir=".">
<!-- find wtk --> <!-- find wtk -->
<property environment="env"/> <property environment="env"/>
@@ -16,42 +16,75 @@
<delete failonerror="false" dir="build"/> <delete failonerror="false" dir="build"/>
</target> </target>
<target name="build"> <target name="dirs">
<mkdir dir="build"/> <mkdir dir="build"/>
<mkdir dir="build/tool"/>
<mkdir dir="build/classes"/> <mkdir dir="build/classes"/>
</target>
<target name="tools" depends="dirs">
<ant antfile="build.xml" target="bcel-lib"/>
<javac destdir="build/tool" classpath="lib/bcel-5.2.jar">
<src path="src/core"/>
<src path="src/jse"/>
</javac>
</target>
<target name="scripts" depends="tools">
<java classname="luajc" classpath="build/tool:lib/bcel-5.2.jar">
<arg line="-verbose"/>
<arg line="-srcdir examples/lua"/>
<arg line="-destdir build/classes"/>
<arg line="hello.lua"/>
</java>
</target>
<target name="classes" depends="dirs">
<wtkbuild srcdir="src/core" destdir="build/classes" preverify="false"/> <wtkbuild srcdir="src/core" destdir="build/classes" preverify="false"/>
<wtkbuild srcdir="src/jme" destdir="build/classes" preverify="false"/> <wtkbuild srcdir="src/jme" destdir="build/classes" preverify="false"/>
<wtkbuild srcdir="examples/jme" destdir="build/classes" preverify="false"/> <wtkbuild srcdir="examples/jme" destdir="build/classes" preverify="false"/>
</target>
<target name="jad">
<wtkjad jadfile="build/sample.jad" <wtkjad jadfile="build/sample.jad"
manifest="build/MANIFEST.MF" manifest="build/MANIFEST.MF"
name="LuaJ Sample Midlet" name="LuaJ Sample Midlet"
vendor="luaj.org" vendor="luaj.org"
version="0.1" > version="0.1" >
<midlet name="LuaJ Sample Midlet" class="SampleMIDlet"/> <midlet name="LuaJ Sample Midlet" class="SampleMIDlet"/>
<attribute name="script" value="hello"/>
</wtkjad> </wtkjad>
</target>
<target name="jar" depends="scripts,classes,jad">
<wtkpackage jarfile="build/sample.jar" <wtkpackage jarfile="build/sample.jar"
jadfile="build/sample.jad" jadfile="build/sample.jad"
obfuscate="false" obfuscate="false"
preverify="false" preverify="false"
autoversion="true"> autoversion="true">
<fileset dir="build/classes"/> <fileset dir="build/classes"/>
</wtkpackage> </wtkpackage>
</target>
<target name="obf" depends="jar">
<wtkobfuscate jarfile="build/sample.jar" <wtkobfuscate jarfile="build/sample.jar"
jadfile="build/sample.jad"> jadfile="build/sample.jad">
<preserve class="hello"/>
<argument value="-printmapping build/mapping.txt"/> <argument value="-printmapping build/mapping.txt"/>
<argument value="-repackageclasses"/> <argument value="-repackageclasses"/>
<argument value='""'/> <argument value='""'/>
</wtkobfuscate> </wtkobfuscate>
</target>
<target name="package" depends="jad,jar,obf">
<wtkpreverify jarfile="build/sample.jar" <wtkpreverify jarfile="build/sample.jar"
jadfile="build/sample.jad"/> jadfile="build/sample.jad"/>
<wtkrun jadfile="build/sample.jad" device="DefaultColorPhone"/>
</target> </target>
<target name="run" depends="package">
<wtkrun jadfile="build/sample.jad" device="DefaultColorPhone"/>
</target>
<target name="all" depends="package,run"/>
</project> </project>

View File

@@ -22,7 +22,7 @@ public class SampleMIDlet extends MIDlet {
// create an environment to run in // create an environment to run in
LuaC.install(); LuaC.install();
LuaValue _G = JmePlatform.standardGlobals(); LuaValue _G = JmePlatform.standardGlobals();
_G.get("dofile").call( LuaValue.valueOf(script) ); _G.get("require").call( LuaValue.valueOf(script) );
} }
protected void destroyApp(boolean arg0) throws MIDletStateChangeException { protected void destroyApp(boolean arg0) throws MIDletStateChangeException {

View File

@@ -24,18 +24,16 @@ 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.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.Vector;
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.luajc.LuaJC; import org.luaj.vm2.luajc.LuaJC;
/** /**
* Compiler for lua files to compile lua sources into java sources. * Compiler for lua files to compile lua sources or lua binaries into java classes.
*/ */
public class luajc { 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";
@@ -44,9 +42,9 @@ public class luajc {
"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] [filenames].\n" +
"Available options are:\n" + "Available options are:\n" +
" - process stdin\n" + " - process stdin\n" +
" -o name output to file 'name' (default is \"luac.out\")\n" + " -s source directory\n" +
" -p parse only\n" + " -d destination directory\n" +
" -s strip debug information\n" + " -n no debug information (strip debug)\n" +
" -e little endian format for numbers\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" + " -v show version information\n" +
@@ -57,13 +55,12 @@ public class luajc {
System.exit(-1); System.exit(-1);
} }
private String output = "luacj.out"; private String srcdir = null;
private boolean parseonly = false; private String destdir = null;
private boolean stripdebug = false; private boolean stripdebug = false;
private boolean littleendian = false; private boolean littleendian = false;
private int numberformat = DumpState.NUMBER_FORMAT_DEFAULT; private int numberformat = DumpState.NUMBER_FORMAT_DEFAULT;
private boolean versioninfo = false; private boolean verbose = false;
private boolean processing = true;
public static void main( String[] args ) throws IOException { public static void main( String[] args ) throws IOException {
new luajc( args ); new luajc( args );
@@ -73,23 +70,25 @@ public class luajc {
// process args // process args
try { try {
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 ( ! processing || ! args[i].startsWith("-") ) { if ( ! args[i].startsWith("-") ) {
// input file - defer to next stage files.add(args[i]);
} else if ( args[i].length() <= 1 ) {
// input file - defer to next stage
} else { } else {
switch ( args[i].charAt(1) ) { switch ( args[i].charAt(1) ) {
case 'o': case 's':
if ( ++i >= args.length ) if ( ++i >= args.length )
usageExit(); usageExit();
output = args[i]; srcdir = args[i];
break; break;
case 'p': case 'd':
parseonly = true; if ( ++i >= args.length )
usageExit();
destdir = args[i];
break; break;
case 's': case 'n':
stripdebug = true; stripdebug = true;
break; break;
case 'e': case 'e':
@@ -101,12 +100,7 @@ public class luajc {
numberformat = Integer.parseInt(args[i].substring(2)); numberformat = Integer.parseInt(args[i].substring(2));
break; break;
case 'v': case 'v':
versioninfo = true; verbose = true;
break;
case '-':
if ( args[i].length() > 2 )
usageExit();
processing = false;
break; break;
default: default:
usageExit(); usageExit();
@@ -116,34 +110,28 @@ public class luajc {
} }
// echo version // echo version
if ( versioninfo ) if ( verbose ) {
System.out.println(version); System.out.println(version);
System.out.println("srcdir: "+srcdir);
System.out.println("destdir: "+srcdir);
System.out.println("stripdebug: "+stripdebug);
System.out.println("littleendian: "+littleendian);
System.out.println("numberformat: "+numberformat);
System.out.println("files: "+files);
}
// open output file
OutputStream fos = new FileOutputStream( output );
// process input files // process input files
try { for ( int i=0; i<files.size(); i++ ) {
processing = true; String filename = (String) files.elementAt(i);
for ( int i=0; i<args.length; i++ ) { int index = filename.lastIndexOf('.');
if ( ! processing || ! args[i].startsWith("-") ) { if ( index < 0 )
String chunkname = args[i]; usageExit();
processScript( new FileInputStream(args[i]), chunkname, fos ); String chunkname = filename.substring(0,index);
} else if ( args[i].length() <= 1 ) { String sourcepath = srcdir!=null? srcdir+"/"+filename: filename;
processScript( System.in, "stdin", fos ); if ( verbose )
} else { System.out.println("filename="+filename+" chunkname="+filename+" sourcepath="+sourcepath);
switch ( args[i].charAt(1) ) { InputStream is = new FileInputStream( sourcepath );
case 'o': processScript( is, chunkname, filename );
++i;
break;
case '-':
processing = false;
break;
}
}
}
} finally {
fos.close();
} }
} catch ( IOException ioe ) { } catch ( IOException ioe ) {
@@ -152,23 +140,25 @@ public class luajc {
} }
} }
private void processScript( InputStream script, String chunkname, OutputStream out ) throws IOException { private void processScript( InputStream script, String chunkname, String filename) throws IOException {
try { try {
// create the chunk // create the chunk
Hashtable t = LuaJC.getInstance().compileAll(script, chunkname, chunkname); Hashtable t = LuaJC.getInstance().compileAll(script, chunkname, filename);
// write out the chunk // write out the chunk
if (!parseonly) { 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); String destpath = (destdir!=null? destdir+"/": "") + key + ".class";
String filename = key + ".class"; if ( verbose )
if ( versioninfo ) System.out.println(
System.out.println(filename+": "+bytes.length+" bytes"); "chunk "+chunkname+
FileOutputStream fos = new FileOutputStream( filename ); " from "+filename+
fos.write( bytes ); " written to "+destpath
fos.close(); +" length="+bytes.length+" bytes");
} FileOutputStream fos = new FileOutputStream( destpath );
fos.write( bytes );
fos.close();
} }
} catch ( Throwable t ) { } catch ( Throwable t ) {