jaroslav@29: package org.apidesign.vm4brwsr; jaroslav@29: jaroslav@29: import java.io.BufferedWriter; jaroslav@29: import java.io.FileWriter; jaroslav@29: import java.io.IOException; jaroslav@29: import java.io.InputStream; jaroslav@29: import java.io.Writer; jaroslav@29: import java.util.Arrays; jaroslav@29: import java.util.HashSet; jaroslav@29: import java.util.LinkedList; jaroslav@29: import java.util.List; jaroslav@29: import java.util.Set; jaroslav@29: jaroslav@29: /** Generator of JavaScript from bytecode of classes on classpath of the VM. jaroslav@29: * jaroslav@29: * @author Jaroslav Tulach jaroslav@29: */ jaroslav@29: final class GenJS { jaroslav@29: private GenJS() {} jaroslav@29: jaroslav@29: public static void main(String... args) throws IOException { jaroslav@29: if (args.length < 2) { jaroslav@29: System.err.println("Usage: java -cp ... -jar ... java/lang/Class org/your/App ..."); jaroslav@29: return; jaroslav@29: } jaroslav@29: jaroslav@29: Writer w = new BufferedWriter(new FileWriter(args[0])); jaroslav@29: List classes = Arrays.asList(args).subList(1, args.length); jaroslav@29: compile(w, classes); jaroslav@29: w.close(); jaroslav@29: } jaroslav@29: jaroslav@29: static void compile(Appendable out, String... names) throws IOException { jaroslav@29: compile(out, Arrays.asList(names)); jaroslav@29: } jaroslav@29: static void compile(Appendable out, List names) throws IOException { jaroslav@29: Set processed = new HashSet(); jaroslav@29: LinkedList toProcess = new LinkedList(names); jaroslav@29: for (;;) { jaroslav@29: toProcess.removeAll(processed); jaroslav@29: if (toProcess.isEmpty()) { jaroslav@29: break; jaroslav@29: } jaroslav@29: String name = toProcess.getFirst(); jaroslav@29: processed.add(name); jaroslav@29: if (name.startsWith("java/") && !name.equals("java/lang/Object")) { jaroslav@29: continue; jaroslav@29: } jaroslav@29: InputStream is = GenJS.class.getClassLoader().getResourceAsStream(name + ".class"); jaroslav@29: if (is == null) { jaroslav@29: throw new IOException("Can't find class " + name); jaroslav@29: } jaroslav@29: try { jaroslav@29: ByteCodeToJavaScript.compile(is, out, toProcess); jaroslav@29: } catch (RuntimeException ex) { jaroslav@29: if (out instanceof CharSequence) { jaroslav@29: CharSequence seq = (CharSequence)out; jaroslav@29: int lastBlock = seq.length(); jaroslav@29: while (lastBlock-- >= 0) { jaroslav@29: if (seq.charAt(lastBlock) == '{') { jaroslav@29: break; jaroslav@29: } jaroslav@29: } jaroslav@29: throw new IOException("Error while compiling " + name + "\n" jaroslav@29: + seq.subSequence(lastBlock + 1, seq.length()), ex jaroslav@29: ); jaroslav@29: } else { jaroslav@29: throw new IOException("Error while compiling " + name + "\n" jaroslav@29: + out, ex jaroslav@29: ); jaroslav@29: } jaroslav@29: } jaroslav@29: } jaroslav@29: } jaroslav@29: jaroslav@29: }