rt/vm/src/main/java/org/apidesign/vm4brwsr/VMLazy.java
branchclosure
changeset 1513 ba912ef24b27
parent 1029 b1fe994d4267
parent 1375 a6c71e376889
child 1550 cb9e273dfd51
     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