# HG changeset patch # User Jaroslav Tulach # Date 1349912985 25200 # Node ID 9fb17a3cbbb6d128075db06c30502893c8bedfb6 # Parent 437df2a719e7c1ab1439103e67dadee84ed969ca Support reordering of class declarations diff -r 437df2a719e7 -r 9fb17a3cbbb6 vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Tue Oct 09 18:47:42 2012 -0700 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Wed Oct 10 16:49:45 2012 -0700 @@ -118,22 +118,29 @@ out.append("\n this." + v.getName() + " = 0;"); } } - out.append("\n}"); + out.append("\n}\n\nfunction ").append(className).append("_proto() {"); + out.append("\n if (").append(className). + append(".prototype.$instOf_").append(className).append(") {"); + out.append("\n return ").append(className).append(".prototype;"); + out.append("\n }"); ClassName sc = jc.getSuperClass(); if (sc != null) { - out.append("\n").append(className) + out.append("\n ").append(sc.getInternalName().replace('/', '_')).append("_proto();"); + out.append("\n ").append(className) .append(".prototype = new ").append(sc.getInternalName().replace('/', '_')).append(';'); } for (Method m : jc.getMethods()) { if (!m.isStatic() && !m.isPrivate() && !m.getName().contains("")) { - compiler.generateMethodReference("\n" + className + ".prototype.", m); + compiler.generateMethodReference("\n " + className + ".prototype.", m); } } - out.append("\n" + className + ".prototype.$instOf_").append(className).append(" = true;"); + out.append("\n " + className + ".prototype.$instOf_").append(className).append(" = true;"); for (ClassName superInterface : jc.getInterfaces()) { - out.append("\n" + className + ".prototype.$instOf_").append(superInterface.getInternalName().replace('/', '_')).append(" = true;"); + out.append("\n " + className + ".prototype.$instOf_").append(superInterface.getInternalName().replace('/', '_')).append(" = true;"); } - + out.append("\n return ").append(className).append(".prototype;"); + out.append("\n}"); + out.append("\n").append(className).append("_proto();"); StringBuilder sb = new StringBuilder(); for (String init : toInitilize) { sb.append("\n").append(init).append("();"); diff -r 437df2a719e7 -r 9fb17a3cbbb6 vm/src/test/java/org/apidesign/vm4brwsr/InstanceSubTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/InstanceSubTest.java Wed Oct 10 16:49:45 2012 -0700 @@ -0,0 +1,15 @@ +package org.apidesign.vm4brwsr; + +/** Checks if everything works OK, when we switch the + * order of loaded classes. + * + * @author Jaroslav Tulach + */ +public class InstanceSubTest extends InstanceTest { + + @Override + protected String startCompilationWith() { + return "org/apidesign/vm4brwsr/InstanceSub"; + } + +} diff -r 437df2a719e7 -r 9fb17a3cbbb6 vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java Tue Oct 09 18:47:42 2012 -0700 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java Wed Oct 10 16:49:45 2012 -0700 @@ -102,11 +102,15 @@ ); } - private static void assertExec(String msg, String methodName, Object expRes, Object... args) throws Exception { + protected String startCompilationWith() { + return "org/apidesign/vm4brwsr/Instance"; + } + + private void assertExec( + String msg, String methodName, Object expRes, Object... args + ) throws Exception { StringBuilder sb = new StringBuilder(); - Invocable i = StaticMethodTest.compileClass(sb, - "org/apidesign/vm4brwsr/Instance" - ); + Invocable i = StaticMethodTest.compileClass(sb, startCompilationWith()); Object ret = null; try {