# HG changeset patch # User Jaroslav Tulach # Date 1354110712 -3600 # Node ID a0f4460130b98464de8bf7a71775c77768b21cf8 # Parent 9dc53108d3df27a02352e5f5bed57eba000d1513 We can load in dependant classes diff -r 9dc53108d3df -r a0f4460130b9 emul/src/main/resources/org/apidesign/vm4brwsr/emul/java_lang_String.js --- a/emul/src/main/resources/org/apidesign/vm4brwsr/emul/java_lang_String.js Wed Nov 28 13:41:33 2012 +0100 +++ b/emul/src/main/resources/org/apidesign/vm4brwsr/emul/java_lang_String.js Wed Nov 28 14:51:52 2012 +0100 @@ -409,6 +409,7 @@ } java_lang_String.prototype = new String; java_lang_String.prototype.toString = function() { return this.r; };; +java_lang_String.prototype.valueOf = function() { return this.toString().valueOf(); };; //java_lang_String_classV(); /* new method for JavaScript String */ diff -r 9dc53108d3df -r a0f4460130b9 vm/src/test/java/org/apidesign/vm4brwsr/VMLazy.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/VMLazy.java Wed Nov 28 13:41:33 2012 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/VMLazy.java Wed Nov 28 14:51:52 2012 +0100 @@ -19,25 +19,42 @@ import java.io.ByteArrayInputStream; import java.io.IOException; +import org.apidesign.bck2brwsr.core.JavaScriptBody; /** * * @author Jaroslav Tulach */ class VMLazy extends ByteCodeToJavaScript { - private VMLazy(Appendable out) { + private final Object vm; + private final Object global; + + private VMLazy(Object global, Object vm, Appendable out) { super(out); + this.vm = vm; + this.global = global; } - static String toJavaScript(byte[] is) throws IOException { + static String toJavaScript(Object global, Object vm, byte[] is) throws IOException { StringBuilder sb = new StringBuilder(); - new VMLazy(sb).compile(new ByteArrayInputStream(is)); + new VMLazy(global, vm, sb).compile(new ByteArrayInputStream(is)); return sb.toString().toString(); } + @JavaScriptBody(args = { "self", "n" }, + body= + "var cls = n.replaceLjava_lang_StringCC(n,'/','_').toString();" + + "var glb = self.fld_global;" + + "var vm = self.fld_vm;" + + "if (glb[cls]) return false;" + + "glb[cls] = function() {" + + " return vm.loadClass(n,cls);" + + "};" + + "return true;" + ) @Override protected boolean requireReference(String internalClassName) { - return false; + throw new UnsupportedOperationException(); } @Override diff -r 9dc53108d3df -r a0f4460130b9 vm/src/test/java/org/apidesign/vm4brwsr/VMLazyTest.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/VMLazyTest.java Wed Nov 28 13:41:33 2012 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/VMLazyTest.java Wed Nov 28 14:51:52 2012 +0100 @@ -42,16 +42,21 @@ StringBuilder sb = new StringBuilder(); sb.append("\nfunction test(clazz, as, method) {"); - sb.append("\n var l = new lazyVM();"); + sb.append("\n var l = new lazyVM(this);"); sb.append("\n var c = l.loadClass(clazz, as);"); sb.append("\n return c[method]();"); sb.append("\n}"); - sb.append("\nfunction lazyVM() {"); + sb.append("\nfunction lazyVM(global) {"); sb.append("\n var self = this;"); - sb.append("\n this.constructor.prototype.loadClass = function(res, name) {"); - sb.append("\n var script = org_apidesign_vm4brwsr_VMLazy(true).toJavaScriptLjava_lang_StringAB(loader.get(res + '.class'));"); + sb.append("\n var glb = global;"); + sb.append("\n lazyVM.prototype.loadClass = function(res, name) {"); + sb.append("\n var script = org_apidesign_vm4brwsr_VMLazy(true)." + + "toJavaScriptLjava_lang_StringLjava_lang_ObjectLjava_lang_ObjectAB(" + + " glb, self," + + " loader.get(res + '.class')" + + ");"); sb.append("\n try {"); sb.append("\n new Function(script)(self, name);"); sb.append("\n } catch (ex) {"); @@ -75,7 +80,12 @@ "org/apidesign/vm4brwsr/StaticMethod", "org_apidesign_vm4brwsr_StaticMethod", "minusOneI" ); } - + + @Test public void loadDependantClass() throws Exception { + assertExec("Trying to get zero", "test", Double.valueOf(0), + "org/apidesign/vm4brwsr/InstanceSub", "org_apidesign_vm4brwsr_InstanceSub", "recallDblD" + ); + } private static void assertExec(String msg, String methodName, Object expRes, Object... args) throws Exception { Object ret = null;