# HG changeset patch # User Jaroslav Tulach # Date 1357845311 -3600 # Node ID aef4fd91e99ca7fe4d63c6562382a64004eb5386 # Parent 9b5868bf56ec849d892432852d9da91c3abd9441 Can read resources as streams diff -r 9b5868bf56ec -r aef4fd91e99c emul/src/main/java/java/lang/Class.java --- a/emul/src/main/java/java/lang/Class.java Thu Jan 10 13:09:19 2013 +0100 +++ b/emul/src/main/java/java/lang/Class.java Thu Jan 10 20:15:11 2013 +0100 @@ -25,6 +25,7 @@ package java.lang; +import java.io.ByteArrayInputStream; import org.apidesign.bck2brwsr.emul.AnnotationImpl; import java.io.InputStream; import java.lang.annotation.Annotation; @@ -881,13 +882,14 @@ */ public InputStream getResourceAsStream(String name) { name = resolveName(name); - ClassLoader cl = getClassLoader0(); - if (cl==null) { - // A system class. - return ClassLoader.getSystemResourceAsStream(name); - } - return cl.getResourceAsStream(name); - } + byte[] arr = getResourceAsStream0(name); + return arr == null ? null : new ByteArrayInputStream(arr); + } + + @JavaScriptBody(args = "name", body = + "return (vm.loadBytes) ? vm.loadBytes(name) : null;" + ) + private static native byte[] getResourceAsStream0(String name); /** * Finds a resource with a given name. The rules for searching resources @@ -925,7 +927,7 @@ */ public java.net.URL getResource(String name) { name = resolveName(name); - ClassLoader cl = getClassLoader0(); + ClassLoader cl = null; if (cl==null) { // A system class. return ClassLoader.getSystemResource(name); @@ -989,9 +991,6 @@ throw new SecurityException(); } - // Package-private to allow ClassLoader access - native ClassLoader getClassLoader0(); - /** * Returns the {@code Class} representing the component type of an * array. If this class does not represent an array class this method diff -r 9b5868bf56ec -r aef4fd91e99c vm/src/main/java/org/apidesign/vm4brwsr/Bck2Brwsr.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/Bck2Brwsr.java Thu Jan 10 13:09:19 2013 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/Bck2Brwsr.java Thu Jan 10 20:15:11 2013 +0100 @@ -37,7 +37,7 @@ * return null; // byte[] for the resource * }); * - * In this scenario, when a request for a unknown class is made, the loader + * In this scenario, when a request for an unknown class is made, the loader * function is asked for its byte code and the system dynamically transforms * it to JavaScript. * diff -r 9b5868bf56ec -r aef4fd91e99c vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Thu Jan 10 13:09:19 2013 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Thu Jan 10 20:15:11 2013 +0100 @@ -255,7 +255,8 @@ final byte[] byteCodes = m.getCode(); if (byteCodes == null) { out.append(" throw 'no code found for ") - .append(m.getInternalSig()).append("';\n"); + .append(jc.getClassName()).append('.') + .append(m.getName()).append("';\n"); out.append("};"); return; } diff -r 9b5868bf56ec -r aef4fd91e99c vm/src/main/java/org/apidesign/vm4brwsr/VM.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Thu Jan 10 13:09:19 2013 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Thu Jan 10 20:15:11 2013 +0100 @@ -124,7 +124,13 @@ + " return vm.org_apidesign_vm4brwsr_VMLazy(false).\n" + " load__Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_String_2_3Ljava_lang_Object_2(loader, name, args);\n" + " }\n" - + " if (args[0]) vm.loadClass = loader.loadClass;\n" + + " if (args[0]) {\n" + + " vm.loadClass = loader.loadClass;\n" + + " vm.loadBytes = function(name) {\n" + + " if (!args[0]) throw 'bck2brwsr initialized without loader function, cannot load ' + name;\n" + + " return args[0](name);\n" + + " }\n" + + " }\n" + " return loader;\n" + " };\n"); out.append("}(this));"); diff -r 9b5868bf56ec -r aef4fd91e99c vmtest/src/test/java/org/apidesign/bck2brwsr/tck/ResourcesTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/ResourcesTest.java Thu Jan 10 20:15:11 2013 +0100 @@ -0,0 +1,32 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package org.apidesign.bck2brwsr.tck; + +import java.io.InputStream; +import org.apidesign.bck2brwsr.vmtest.Compare; +import org.apidesign.bck2brwsr.vmtest.VMTest; +import org.testng.annotations.Factory; + +/** + * + * @author Jaroslav Tulach + */ +public class ResourcesTest { + + @Compare public String readResourceAsStream() throws Exception { + InputStream is = getClass().getResourceAsStream("Resources.txt"); + byte[] b = new byte[30]; + int len = is.read(b); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < len; i++) { + sb.append((char)b[i]); + } + return sb.toString(); + } + + @Factory public static Object[] create() { + return VMTest.create(ResourcesTest.class); + } +} diff -r 9b5868bf56ec -r aef4fd91e99c vmtest/src/test/resources/org/apidesign/bck2brwsr/tck/Resources.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vmtest/src/test/resources/org/apidesign/bck2brwsr/tck/Resources.txt Thu Jan 10 20:15:11 2013 +0100 @@ -0,0 +1,1 @@ +Ahoj