experiences with prototype

Peter Levart peter.levart at gmail.com
Sun Feb 8 11:50:35 UTC 2015


Hi Maurizzio,

Testing javany.util further, I found that the following compiles without 
errors:


     default Comparator<T> thenComparing(Comparator<? super T> other) {
         Objects.requireNonNull(other);
         return (Comparator<T> & Serializable) (c1, c2) -> {
             int res = compare(c1, c2);
             return (res != 0) ? res : other.compare(c1, c2);
         };
     }


...but fails at runtime:


Specializing method 
javany/util/Comparators$naturalOrder${}.naturalOrder()Ljavany/util/Comparator; 
with class=[] and method=[TT;]
Specializing javany.util.Comparator${0=Z}; searching for 
javany/util/Comparator.class (not found)
Specializing javany.util.Comparator${0=Z}; searching for 
javany/util/Comparator.class (found)
Exception in thread "main" java.lang.BootstrapMethodError: call site 
initialization exception
         at java.lang.invoke.CallSite.makeSite(CallSite.java:341)
         at 
java.lang.invoke.MethodHandleNatives.linkCallSiteImpl(MethodHandleNatives.java:307)
         at 
java.lang.invoke.MethodHandleNatives.linkCallSite(MethodHandleNatives.java:297)
         at javany.util.Comparators.<clinit>(Comparators.java:55)
         at 
javany.util.Comparators$naturalOrder${}/1831932724.naturalOrder(Comparators.java:44)
         at javany.util.Comparator.reverseOrder(Comparator.java:337)
         at Test.testStrings(Test.java:14)
         at Test.main(Test.java:26)
Caused by: java.lang.VerifyError: Bad type on operand stack
Exception Details:
   Location:
javany/util/Comparator${0=Z}.lambda$thenComparing$10d9995b$1(Ljavany/util/Comparator;Ljava/lang/Object;Ljava/lang/Object;)I 
@3: invokeinterface
   Reason:
     Type 'java/lang/Object' (current frame, stack[2]) is not assignable 
to integer
   Current Frame:
     bci: @3
     flags: { }
     locals: { 'javany/util/Comparator${0=Z}', 'javany/util/Comparator', 
'java/lang/Object', 'java/lang/Object' }
     stack: { 'javany/util/Comparator${0=Z}', 'java/lang/Object', 
'java/lang/Object' }
   Bytecode:
     0000000: 2a2c 2db9 007b 0300 3604 1504 9900 0815
     0000010: 04a7 000b 2b2c 2db9 007d 0300 ac
   Stackmap Table:
     append_frame(@20,Integer)
     same_locals_1_stack_item_frame(@28,Integer)

         at sun.misc.Unsafe.defineAnonymousClass(Native Method)
         at 
java.lang.invoke.InnerClassLambdaMetafactory.spinInnerClass(InnerClassLambdaMetafactory.java:324)
         at 
java.lang.invoke.InnerClassLambdaMetafactory.buildCallSite(InnerClassLambdaMetafactory.java:194)
         at 
java.lang.invoke.LambdaMetafactory.metafactory(LambdaMetafactory.java:304)
         at java.lang.invoke.CallSite.makeSite(CallSite.java:302)
         ... 7 more


Are lambdas/method references also not compatible with specialization 
currently?


Peter


On 02/08/2015 11:43 AM, Peter Levart wrote:
> I've got it.
>
> The problem was that Any.<int>toStringImpl() instance method was 
> private. Since it is located in a specialized (Any${0=I}) class, it is 
> not accessible from Any class (or specialized VM anonymous class 
> generated for a specialized generic static method). The VerifyError: 
> "Bad invokespecial instruction: current class isn't assignable to 
> reference class." is not very informative though.
>
> By making the method(s) package-private, my test now runs correctly.
>
> Regards, Peter
>
> On 02/08/2015 11:27 AM, Peter Levart wrote:
>> Hi Maurizio,
>>
>> This is great. I replaced all new-style for loops on <any T> T[] 
>> arrays with classic on-index iteration and applied your patch 
>> selectively without the redundant cast in javany/util/Arrays.java:823:
>>
>>     a = (E[])Objects.requireNonNull(array)
>>
>> ... as I think your last langtools patch (99ab651be669) fixes that, 
>> right?
>>
>>
>> Now with the following code:
>>
>> http://cr.openjdk.java.net/~plevart/misc/valhala-hacks/javany-src.02.jar
>>
>> And this test:
>>
>> public class Test {
>>
>>     static void testStrings() {
>>         List<String> strings = Arrays.<String>asList("a", "b", "c");
>>         System.out.println(strings);
>>     }
>>
>>     static void testInts() {
>>         List<int> ints = Arrays.<int>asList(1, 2, 3);
>>         System.out.println(ints);
>>     }
>>
>>     public static void main(String[] args) {
>>         testStrings();
>>         testInts();
>>     }
>> }
>>
>>
>> I get:
>>
>> [a, b, c]
>> 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)
>> Specializing javany.util.AbstractList${0=I}; searching for 
>> javany/util/AbstractList.class (not found)
>> Specializing javany.util.AbstractList${0=I}; searching for 
>> javany/util/AbstractList.class (found)
>> Specializing javany.util.AbstractCollection${0=I}; searching for 
>> javany/util/AbstractCollection.class (not found)
>> Specializing javany.util.AbstractCollection${0=I}; searching for 
>> javany/util/AbstractCollection.class (found)
>> Specializing javany.util.Iterator${0=I}; searching for 
>> javany/util/Iterator.class (not found)
>> Specializing javany.util.Iterator${0=I}; searching for 
>> javany/util/Iterator.class (found)
>> Specializing javany.util.ListIterator${0=I}; searching for 
>> javany/util/ListIterator.class (not found)
>> Specializing javany.util.ListIterator${0=I}; searching for 
>> javany/util/ListIterator.class (found)
>> Specializing javany.util.AbstractList$Itr${0=I}; searching for 
>> javany/util/AbstractList$Itr.class (not found)
>> Specializing javany.util.AbstractList$Itr${0=I}; searching for 
>> javany/util/AbstractList$Itr.class (found)
>> Specializing method 
>> javany/util/Any$toString${0=I}.toString(Ljava/lang/Object;)Ljava/lang/String; 
>> with class=[] and method=[I]
>> Specializing javany.util.Any${0=I}; searching for 
>> javany/util/Any.class (not found)
>> Specializing javany.util.Any${0=I}; searching for 
>> javany/util/Any.class (found)
>> Exception in thread "main" java.lang.BootstrapMethodError: call site 
>> initialization exception
>>         at java.lang.invoke.CallSite.makeSite(CallSite.java:341)
>>         at 
>> java.lang.invoke.MethodHandleNatives.linkCallSiteImpl(MethodHandleNatives.java:307)
>>         at 
>> java.lang.invoke.MethodHandleNatives.linkCallSite(MethodHandleNatives.java:297)
>>         at 
>> javany.util.AbstractCollection${0=I}.toString(AbstractCollection.java:514)
>>         at java.lang.String.valueOf(String.java:2987)
>>         at java.io.PrintStream.println(PrintStream.java:821)
>>         at Test.testInts(Test.java:17)
>>         at Test.main(Test.java:22)
>> Caused by: java.lang.VerifyError: Bad invokespecial instruction: 
>> current class isn't assignable to reference class.
>> Exception Details:
>>   Location:
>>     javany/util/Any$toString${0=I}.toString(I)Ljava/lang/String; @8: 
>> invokespecial
>>   Reason:
>>     Error exists in the bytecode
>>   Bytecode:
>>     0000000: bb00 0959 b700 0d1a b700 10b0
>>
>>         at sun.misc.Unsafe.defineAnonymousClass(Native Method)
>>         at 
>> java.lang.invoke.GenericMethodSpecializer.metafactory(GenericMethodSpecializer.java:98)
>>         at java.lang.invoke.CallSite.makeSite(CallSite.java:302)
>>         ... 7 more
>>
>>
>> But looking at generated bytecode:
>>
>>
>> Classfile 
>> /home/peter/work/local/valhalla-test/dump/javany.util.Any$toString${0=I}_ERROR.class
>>   Last modified Feb 8, 2015; size 321 bytes
>>   MD5 checksum 7dac6f4f515394e0aa2ed1990a092697
>>   Compiled from "Any.java"
>> public class javany.util.Any$toString${0=I}
>>   minor version: 0
>>   major version: 52
>>   flags: ACC_PUBLIC, ACC_SUPER
>> Constant pool:
>>    #1 = Utf8               javany/util/Any$toString${0=I}
>>    #2 = Class              #1             // 
>> "javany/util/Any$toString${0=I}"
>>    #3 = Utf8               java/lang/Object
>>    #4 = Class              #3             // java/lang/Object
>>    #5 = Utf8               Any.java
>>    #6 = Utf8               toString
>>    #7 = Utf8               (I)Ljava/lang/String;
>>    #8 = Utf8               javany/util/Any${0=I}
>>    #9 = Class              #8             // "javany/util/Any${0=I}"
>>   #10 = Utf8               <init>
>>   #11 = Utf8               ()V
>>   #12 = NameAndType        #10:#11        // "<init>":()V
>>   #13 = Methodref          #9.#12         // 
>> "javany/util/Any${0=I}"."<init>":()V
>>   #14 = Utf8               toStringImpl
>>   #15 = NameAndType        #14:#7         // 
>> toStringImpl:(I)Ljava/lang/String;
>>   #16 = Methodref          #9.#15         // 
>> "javany/util/Any${0=I}".toStringImpl:(I)Ljava/lang/String;
>>   #17 = Utf8               Code
>>   #18 = Utf8               LineNumberTable
>>   #19 = Utf8               Signature
>>   #20 = Utf8               SourceFile
>> {
>>   public static java.lang.String toString(int);
>>     descriptor: (I)Ljava/lang/String;
>>     flags: ACC_PUBLIC, ACC_STATIC
>>     Code:
>>       stack=2, locals=1, args_size=1
>>          0: new           #9                  // class 
>> "javany/util/Any${0=I}"
>>          3: dup
>>          4: invokespecial #13                 // Method 
>> "javany/util/Any${0=I}"."<init>":()V
>>          7: iload_0
>>          8: invokespecial #16                 // Method 
>> "javany/util/Any${0=I}".toStringImpl:(I)Ljava/lang/String;
>>         11: areturn
>>       LineNumberTable:
>>         line 31: 0
>>     Signature: #7                           // (I)Ljava/lang/String;
>> }
>> SourceFile: "Any.java"
>>
>>
>> Comparing it to original Any.class bytecode:
>>
>>
>>   public static <T extends java.lang.Object> java.lang.String 
>> toString(T);
>>     descriptor: (Ljava/lang/Object;)Ljava/lang/String;
>>     flags: ACC_PUBLIC, ACC_STATIC
>>     Code:
>>       stack=2, locals=1, args_size=1
>>          0: new           #3                  // class javany/util/Any
>>          3: dup
>>          4: invokespecial #4                  // Method "<init>":()V
>>          7: aload_0
>>          8: invokespecial #8                  // Method 
>> toStringImpl:(Ljava/lang/Object;)Ljava/lang/String;
>>         11: areturn
>>       LineNumberTable:
>>         line 31: 0
>> Error: unknown attribute
>>       BytecodeMapping: length = 0x12
>>        00 04 00 00 00 8C 00 04 00 8D 00 07 00 87 00 08
>>        00 9F
>>     Signature: #160                         // 
>> <T:Ljava/lang/Object;>(TT;)Ljava/lang/String;
>> Error: unknown attribute
>>       TypeVariablesMap: length = 0x9
>>        01 00 A1 01 01 00 92 00 86
>>
>>
>> And also peeking at Any${0=I}.class:
>>
>>
>>   private java.lang.String toStringImpl(int);
>>     descriptor: (I)Ljava/lang/String;
>>     flags: ACC_PRIVATE
>>     Code:
>>       stack=2, locals=2, args_size=2
>>          0: aload_0
>>          1: iload_1
>>          2: invokespecial #45                 // Method 
>> toStringNonNullImpl:(I)Ljava/lang/String;
>>          5: areturn
>>       LineNumberTable:
>>         line 181: 0
>>     Signature: #33                          // (I)Ljava/lang/String;
>>
>>
>> ...I can't spot what's wrong. Can you?
>>
>>
>> Regards, Peter
>>
>>
>> On 02/06/2015 03:38 PM, Maurizio Cimadamore wrote:
>>> Peter,
>>> I think I fixed most of the issues in the way; I've been able to 
>>> compile and run some tests successfully.
>>> Attached is a patch of the changes that are required for the code to 
>>> run correctly; I had to desugar some constructs (i.e. for-each, 
>>> non-static inner class) as all desugared stuff currently has an 
>>> issue in that javac won't emit the special sauce that is required by 
>>> the specializer to correctly specialize a class. That's an issue 
>>> with timing of the compilation pipeline - we are aware of it; but, 
>>> as it's a no trivial fix, it means that, for now, it's better not to 
>>> rely too much of compiler-desugared code.
>>>
>>> Maurizio
>>>
>>> On 04/02/15 12:42, Maurizio Cimadamore wrote:
>>>> Compiler fixes have been pushed, I will now look into the runtime 
>>>> issues you are getting...
>>>>
>>>> Maurizio
>>>>
>>>> On 04/02/15 10:18, Maurizio Cimadamore wrote:
>>>>> Thanks for the additional feedback, I'll try to get at the bottom 
>>>>> of those issues.
>>>>>
>>>>> Maurizio
>>>>>
>>>>> On 04/02/15 08:46, 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