1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/VMLazy.java Fri Apr 26 18:48:34 2013 +0200
1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/VMLazy.java Wed Apr 30 15:04:10 2014 +0200
1.3 @@ -20,7 +20,6 @@
1.4 import java.io.ByteArrayInputStream;
1.5 import java.io.IOException;
1.6 import java.io.InputStream;
1.7 -import java.lang.reflect.Array;
1.8 import org.apidesign.bck2brwsr.core.JavaScriptBody;
1.9
1.10 /**
1.11 @@ -43,27 +42,34 @@
1.12 throws IOException, ClassNotFoundException {
1.13 return new VMLazy(loader, arguments).load(name, false);
1.14 }
1.15 +
1.16 + static Object reload(Object loader, String name, Object[] arguments, byte[] arr)
1.17 + throws IOException, ClassNotFoundException {
1.18 + return new VMLazy(loader, arguments).defineClass(arr, name, false);
1.19 + }
1.20
1.21 - static byte[] loadBytes(Object loader, String name, Object[] arguments) throws Exception {
1.22 - return Zips.loadFromCp(arguments, name);
1.23 + static byte[] loadBytes(Object loader, String name, Object[] arguments, int skip) throws Exception {
1.24 + return Zips.loadFromCp(arguments, name, skip);
1.25 }
1.26
1.27 private Object load(String name, boolean instance)
1.28 throws IOException, ClassNotFoundException {
1.29 String res = name.replace('.', '/') + ".class";
1.30 - byte[] arr = Zips.loadFromCp(args, res);
1.31 + byte[] arr = Zips.loadFromCp(args, res, 0);
1.32 if (arr == null) {
1.33 throw new ClassNotFoundException(name);
1.34 }
1.35 -// beingDefined(loader, name);
1.36 +
1.37 + return defineClass(arr, name, instance);
1.38 + }
1.39 +
1.40 + private Object defineClass(byte[] arr, String name, boolean instance) throws IOException {
1.41 StringBuilder out = new StringBuilder(65535);
1.42 out.append("var loader = arguments[0];\n");
1.43 out.append("var vm = loader.vm;\n");
1.44 int prelude = out.length();
1.45 String initCode = new Gen(this, out).compile(new ByteArrayInputStream(arr));
1.46 String code = out.toString().toString();
1.47 -// dump("Loading " + name);
1.48 - dump(code);
1.49 String under = name.replace('.', '_');
1.50 Object fn = applyCode(loader, under, code, instance);
1.51
1.52 @@ -71,26 +77,12 @@
1.53 out.setLength(prelude);
1.54 out.append(initCode);
1.55 code = out.toString().toString();
1.56 - dump(code);
1.57 applyCode(loader, null, code, false);
1.58 }
1.59
1.60 return fn;
1.61 }
1.62
1.63 -// @JavaScriptBody(args = "s", body = "java.lang.System.out.println(s.toString());")
1.64 - static void dump(String s) {
1.65 - }
1.66 -
1.67 -/* possibly not needed:
1.68 - @JavaScriptBody(args = {"loader", "n" }, body =
1.69 - "var cls = n.replace__Ljava_lang_String_2CC(n, '.','_').toString();" +
1.70 - "loader.vm[cls] = true;\n"
1.71 - )
1.72 - private static native void beingDefined(Object loader, String name);
1.73 -*/
1.74 -
1.75 -
1.76 @JavaScriptBody(args = {"loader", "name", "script", "instance" }, body =
1.77 "try {\n" +
1.78 " new Function(script)(loader, name);\n" +
1.79 @@ -130,6 +122,14 @@
1.80
1.81 @Override
1.82 protected void requireScript(String resourcePath) throws IOException {
1.83 + if (!resourcePath.startsWith("/")) {
1.84 + resourcePath = "/" + resourcePath;
1.85 + }
1.86 + String code = readCode(resourcePath);
1.87 + applyCode(lazy.loader, null, code, false);
1.88 + }
1.89 +
1.90 + private String readCode(String resourcePath) throws IOException {
1.91 InputStream is = getClass().getResourceAsStream(resourcePath);
1.92 StringBuilder sb = new StringBuilder();
1.93 for (;;) {
1.94 @@ -139,7 +139,7 @@
1.95 }
1.96 sb.append((char)ch);
1.97 }
1.98 - applyCode(lazy.loader, null, sb.toString(), false);
1.99 + return sb.toString();
1.100 }
1.101
1.102 @Override