1.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/GenJS.java Tue Oct 16 18:04:11 2012 +0200
1.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/GenJS.java Tue Oct 30 22:35:32 2012 +0100
1.3 @@ -23,11 +23,13 @@
1.4 import java.io.InputStream;
1.5 import java.io.Writer;
1.6 import java.net.URL;
1.7 +import java.util.ArrayList;
1.8 import java.util.Arrays;
1.9 import java.util.Collections;
1.10 import java.util.Enumeration;
1.11 import java.util.HashMap;
1.12 import java.util.Iterator;
1.13 +import java.util.LinkedHashSet;
1.14 import java.util.LinkedList;
1.15 import java.util.List;
1.16 import java.util.Map;
1.17 @@ -59,8 +61,16 @@
1.18 }
1.19 static void compile(ClassLoader l, Appendable out, List<String> names) throws IOException {
1.20 for (String baseClass : names) {
1.21 - Map<String,String> processed = new HashMap<String, String>();
1.22 - LinkedList<String> toProcess = new LinkedList<String>();
1.23 + final Map<String,String> processed = new HashMap<String, String>();
1.24 + LinkedHashSet<String> toProcess = new LinkedHashSet<String>() {
1.25 + @Override
1.26 + public boolean add(String e) {
1.27 + if (processed.containsKey(e)) {
1.28 + return false;
1.29 + }
1.30 + return super.add(e);
1.31 + }
1.32 + };
1.33 toProcess.add(baseClass);
1.34 for (;;) {
1.35 String name = null;
1.36 @@ -75,25 +85,7 @@
1.37 if (name == null) {
1.38 break;
1.39 }
1.40 - if (name.startsWith("java/")
1.41 - && !name.equals("java/lang/Object")
1.42 - && !name.equals("java/lang/Class")
1.43 - && !name.equals("java/lang/Math")
1.44 - && !name.equals("java/lang/Number")
1.45 - && !name.equals("java/lang/NumberFormatException")
1.46 - && !name.equals("java/lang/IllegalArgumentException")
1.47 - && !name.equals("java/lang/Integer")
1.48 - && !name.equals("java/lang/Float")
1.49 - && !name.equals("java/lang/Double")
1.50 - && !name.equals("java/lang/Throwable")
1.51 - && !name.equals("java/lang/Exception")
1.52 - && !name.equals("java/lang/RuntimeException")
1.53 - && !name.equals("java/lang/UnsupportedOperationException")
1.54 - && !name.equals("java/lang/String")
1.55 - && !name.equals("java/lang/String$CaseInsensitiveComparator")
1.56 - && !name.equals("java/lang/StringBuilder")
1.57 - && !name.equals("java/lang/AbstractStringBuilder")
1.58 - ) {
1.59 + if (name.startsWith("sun/")) {
1.60 processed.put(name, "");
1.61 continue;
1.62 }
1.63 @@ -134,10 +126,11 @@
1.64 readResource(emul, out);
1.65 }
1.66 }
1.67 -
1.68 - Collections.reverse(toProcess);
1.69
1.70 - for (String clazz : toProcess) {
1.71 + List<String> toInit = new ArrayList<String>(toProcess);
1.72 + Collections.reverse(toInit);
1.73 +
1.74 + for (String clazz : toInit) {
1.75 String initCode = processed.remove(clazz);
1.76 if (initCode != null) {
1.77 out.append(initCode).append("\n");