Read the arrays fully and be ready for loading a resource to load a new extension closure
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Sat, 03 May 2014 20:31:11 +0200
branchclosure
changeset 1520f14753e81f06
parent 1519 4d3780a69843
child 1521 6c709f05afa5
Read the arrays fully and be ready for loading a resource to load a new extension
rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java
     1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java	Sat May 03 06:46:57 2014 +0200
     1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java	Sat May 03 20:31:11 2014 +0200
     1.3 @@ -102,9 +102,23 @@
     1.4              append(r).append("', '");
     1.5              InputStream is = this.resources.get(r);
     1.6              byte[] arr = new byte[is.available()];
     1.7 -            int len = is.read(arr);
     1.8 -            if (len != arr.length) {
     1.9 -                throw new IOException("Not read as much as expected for " + r + " expected: " + arr.length + " was: " + len);
    1.10 +            int offset = 0;
    1.11 +            for (;;) {
    1.12 +                if (offset == arr.length) {
    1.13 +                    byte[] tmp = new byte[arr.length * 2];
    1.14 +                    System.arraycopy(arr, 0, tmp, 0, arr.length);
    1.15 +                    arr = tmp;
    1.16 +                }
    1.17 +                int len = is.read(arr, offset, arr.length - offset);
    1.18 +                if (len == -1) {
    1.19 +                    break;
    1.20 +                }
    1.21 +                offset += len;
    1.22 +            }
    1.23 +            if (offset != arr.length) {
    1.24 +                byte[] tmp = new byte[offset];
    1.25 +                System.arraycopy(arr, 0, tmp, 0, offset);
    1.26 +                arr = tmp;
    1.27              }
    1.28              append(btoa(arr));
    1.29              append("');");
    1.30 @@ -544,11 +558,22 @@
    1.31                  + "      skip = typeof skip == 'number' ? skip : 0;\n"
    1.32                  + "      var arr = resources[name];\n"
    1.33                  + "      if (arr) {\n"
    1.34 -                + "        if (skip < arr.length) return arr[skip];\n"
    1.35 -                + "        skip -= arr.length;\n"
    1.36 +                + "        var arrSize = arr.length;\n"
    1.37 +                + "        if (skip < arrSize) return arr[skip];\n"
    1.38 +                + "        skip -= arrSize;\n"
    1.39 +                + "      } else {\n"
    1.40 +                + "        var arrSize = 0;\n"
    1.41                  + "      };\n"
    1.42 -                + "      return vm.org_apidesign_vm4brwsr_VMLazy(false).\n"
    1.43 +                + "      var ret = vm.org_apidesign_vm4brwsr_VMLazy(false).\n"
    1.44                  + "        loadBytes___3BLjava_lang_Object_2Ljava_lang_String_2_3Ljava_lang_Object_2I(loader, name, args, skip);\n"
    1.45 +                + "      if (ret !== null) return ret;\n"
    1.46 +                + "      while (knownExtensions < extensions.length) {\n"
    1.47 +                + "        vm.registerResource = registerResource;\n"
    1.48 +                + "        extensions[knownExtensions++](vm);\n"
    1.49 +                + "        vm.registerResource = null;\n"
    1.50 +                + "      }\n"
    1.51 +                + "      var arr = resources[name];\n"
    1.52 +                + "      return (arr && arr.length > arrSize) ? arr[arrSize] : null;\n"
    1.53                  + "    }\n"
    1.54                  + "    vm.java_lang_reflect_Array(false);\n"
    1.55                  + "    vm.org_apidesign_vm4brwsr_VMLazy(false).\n"