experiences with prototype
Peter Levart
peter.levart at gmail.com
Wed Feb 4 09:53:09 UTC 2015
Hi,
Anybody interested in changes to original JDK code? Here's a webrev:
http://cr.openjdk.java.net/~plevart/misc/valhala-hacks/javany-webrev.01/
Peter
On 02/04/2015 09:46 AM, Peter Levart wrote:
> Hi Maurizio,
>
> I have now managed to successfully compile the code. Here's the
> updated source:
>
> http://cr.openjdk.java.net/~plevart/misc/valhala-hacks/javany-src.jar
>
>
> But there's a StringIndexOutOfBoundsException thrown from specializer
> when running the following Test:
>
> public class Test {
> public static void main(String[] args) {
> List<int> ints = Arrays.asList(new int[]{1, 2, 3, 4, 5, 6, 7,
> 8});
> Iterator<int> it = ints.iterator();
> while (it.hasNext()) {
> System.out.println(it.next());
> }
> }
> }
>
>
> Specializing javany.util.List${0=I}; searching for
> javany/util/List.class (not found)
> Specializing javany.util.List${0=I}; searching for
> javany/util/List.class (found)
> Specializing javany.util.Collection${0=I}; searching for
> javany/util/Collection.class (not found)
> Specializing javany.util.Collection${0=I}; searching for
> javany/util/Collection.class (found)
> Specializing javany.lang.Iterable${0=I}; searching for
> javany/lang/Iterable.class (not found)
> Specializing javany.lang.Iterable${0=I}; searching for
> javany/lang/Iterable.class (found)
> Specializing method
> javany/util/Arrays$asList${0=I}.asList([Ljava/lang/Object;)Ljavany/util/List;
> with class=[] and method=[I]
> Specializing javany.util.Arrays$ArrayList${0=I}; searching for
> javany/util/Arrays$ArrayList.class (not found)
> Specializing javany.util.Arrays$ArrayList${0=I}; searching for
> javany/util/Arrays$ArrayList.class (found)
> Exception in thread "main" java.lang.StringIndexOutOfBoundsException:
> String index out of range: 0
> at java.lang.String.charAt(String.java:646)
> at
> jdk.internal.org.objectweb.asm.signature.SignatureReader.accept(SignatureReader.java:107)
> at
> valhalla.specializer.SignatureSpecializer.forType(SignatureSpecializer.java:72)
> at
> valhalla.specializer.Specializer$ManglingMethodVisitor.visitInvokeDynamicInsn(Specializer.java:679)
> at
> jdk.internal.org.objectweb.asm.ClassReader.readCode(ClassReader.java:1507)
> at
> jdk.internal.org.objectweb.asm.ClassReader.readMethod(ClassReader.java:1084)
> at
> jdk.internal.org.objectweb.asm.ClassReader.accept(ClassReader.java:729)
> at
> valhalla.specializer.Specializer.specialize(Specializer.java:79)
> at java.net.URLClassLoader$1.run(URLClassLoader.java:409)
> at java.net.URLClassLoader$1.run(URLClassLoader.java:386)
> at java.security.AccessController.doPrivileged(Native Method)
> at java.net.URLClassLoader.findClass(URLClassLoader.java:385)
> at java.lang.ClassLoader.loadClass(ClassLoader.java:426)
> at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:317)
> at java.lang.ClassLoader.loadClass(ClassLoader.java:359)
> at
> javany.util.Arrays$asList${0=I}/511754216.asList(Arrays.java:810)
> at Test.main(Test.java:10)
>
>
> Appart from that, I learned that when the component type of vararg
> array is an <any> type variable (for example: <any T> T[]
> Arrays.asList(T ... a)), the invocation doesn't compile:
>
> src/Test.java:10: error: method invoked with incorrect number of
> arguments; expected 3, found 1
> List<int> ints = Arrays.<int>asList(1, 2, 3);
> ^
> 1 error
>
>
> Non-specialized code also has problems at runtime:
>
> public class Test {
> public static void main(String[] args) {
> List<String> strings = Arrays.<String>asList("a", "b", "c");
> Iterator<String> it = strings.iterator();
> while (it.hasNext()) {
> System.out.println(it.next());
> }
> }
> }
>
>
> Exception in thread "main" java.lang.ClassFormatError: Absent Code
> attribute in method that is not native or abstract in class file
> javany/util/AbstractList
> at java.lang.ClassLoader.defineClass1(Native Method)
> at java.lang.ClassLoader.defineClass(ClassLoader.java:762)
> at
> java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
> at java.net.URLClassLoader.defineClass(URLClassLoader.java:537)
> at java.net.URLClassLoader.access$300(URLClassLoader.java:78)
> at java.net.URLClassLoader$1.run(URLClassLoader.java:438)
> at java.net.URLClassLoader$1.run(URLClassLoader.java:386)
> at java.security.AccessController.doPrivileged(Native Method)
> at java.net.URLClassLoader.findClass(URLClassLoader.java:385)
> at java.lang.ClassLoader.loadClass(ClassLoader.java:426)
> at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:317)
> at java.lang.ClassLoader.loadClass(ClassLoader.java:359)
> at java.lang.ClassLoader.defineClass1(Native Method)
> at java.lang.ClassLoader.defineClass(ClassLoader.java:762)
> at
> java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
> at java.net.URLClassLoader.defineClass(URLClassLoader.java:537)
> at java.net.URLClassLoader.access$300(URLClassLoader.java:78)
> at java.net.URLClassLoader$1.run(URLClassLoader.java:438)
> at java.net.URLClassLoader$1.run(URLClassLoader.java:386)
> at java.security.AccessController.doPrivileged(Native Method)
> at java.net.URLClassLoader.findClass(URLClassLoader.java:385)
> at java.lang.ClassLoader.loadClass(ClassLoader.java:426)
> at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:317)
> at java.lang.ClassLoader.loadClass(ClassLoader.java:359)
> at javany.util.Arrays.asList(Arrays.java:810)
> at Test.main(Test.java:10)
>
>
>
> Regards, Peter
>
> On 02/03/2015 10:34 PM, Maurizio Cimadamore wrote:
>>
>> On 03/02/15 21:05, Peter Levart wrote:
>>> Hi Maurizio,
>>>
>>> I see. I thought this could be a nice idiom for boxing, since the
>>> following:
>>>
>>> (Object) 42
>>>
>>> ...is legal and results in an Integer object at runtime.
>> I'm not saying this will never work - actually the compiler is
>> currently accepting this kind of idioms, but the specializer does
>> nothing with it, so you'll get runtime errors.
>>>
>>> But I don't know if a checkcast is actually inserted for (Object).
>>> Could javac redundantly do it in case casting to Object is from
>>> expression of <any> type and also equip checkcast with BMA
>>> indicating the type of expression so that specialization could
>>> replace it with boxing code?
>> That will be the way forward, yes
>>
>> Maurizio
>>>
>>> Regards, Peter
>>>
>>>
>>> On 02/03/2015 08:09 PM, Maurizio Cimadamore wrote:
>>>>
>>>> On 03/02/15 18:46, Maurizio Cimadamore wrote:
>>>>> I will also investigate on the crash you are getting...
>>>> Hi Peter,
>>>> the crash is coming from this code in AbstractCollection (see code
>>>> in bold):
>>>>
>>>> public boolean contains(Object o) {
>>>> __WhereVal(E) {
>>>> Iterator<E> it = iterator();
>>>> if (o == null) {
>>>> return false;
>>>> } else {
>>>> while (it.hasNext())
>>>> *if (o.equals((Object) it.next()))*
>>>> return true;
>>>> }
>>>> return false;
>>>> }
>>>> __WhereRef(E) {
>>>> Iterator<E> it = iterator();
>>>> if (o == null) {
>>>> while (it.hasNext())
>>>> if (it.next() == null)
>>>> return true;
>>>> } else {
>>>> while (it.hasNext())
>>>> if (o.equals(it.next()))
>>>> return true;
>>>> }
>>>> return false;
>>>> }
>>>> }
>>>>
>>>> I believe that, apart from the obvious javac bug, the code has an
>>>> issue, as it.next() is supposed to return a value there, but you
>>>> are casting to Object?
>>>>
>>>> For the records - a simpler test case for the bug is this:
>>>>
>>>> class Foo<any E> {
>>>> E e;
>>>> E get() { return e; }
>>>>
>>>> void test() {
>>>> __WhereVal(E) {
>>>> Object o = (Object)get();
>>>> }
>>>> }
>>>> }
>>>>
>>>> Maurizio
>>>
>>
>>
>
>
More information about the valhalla-dev
mailing list