Date: Wed, 14 May 2003 13:55:37 -0400 (EDT)
From: C. Scott Ananian
To: jsr14-prototype-comments@sun.com
Subject: Verify error in 1.3 prototype.

This code, compiled with the 1.3 prototype (also the 1.0 and 1.2
prototypes):

import java.util.*;
class A {
 public static void main (String argv[]) {
  ArrayList<Boolean> B = new ArrayList<Boolean>(10);
  Iterator<Boolean> i = B.iterator();
  boolean b = (i.next()).booleanValue();
 }
}

causes a verify error when it is run:

cananian@skiffserv:~/SUNBUG$ java A
Exception in thread "main" java.lang.VerifyError: (class: B, method:
methodC signature: ()V) Incompatible object argument for function call
        at A.main(Test.java:5)
cananian@skiffserv:~/SUNBUG$

Examining the bytecode makes it obvious that a required typecast is
missing:

Codeview "bytecode" for public static void A.main(java.lang.String[]):
  #3/A.java:5 - new class java.util.ArrayList
  #4/A.java:5 - dup
  #5/A.java:5 - bipush (byte)10
  #6/A.java:5 - invokespecial public java.util.ArrayList(int)
  #7/A.java:5 - astore_1 lv_1
  #8/A.java:6 - aload_1 lv_1
  #9/A.java:6 - invokevirtual public java.util.Iterator java.util.AbstractList.iterator()
  #10/A.java:6 - astore_2 lv_2
  #11/A.java:7 - aload_2 lv_2
  #12/A.java:7 - invokeinterface public abstract java.lang.Object java.util.Iterator.next()
  #13/A.java:7 - invokevirtual public final boolean java.lang.Boolean.booleanValue()
  #14/A.java:7 - istore_3 lv_3
  #15/A.java:8 - return

There should be a typecast between #12 and #13. 

This was discovered by "agentsmooth" on the GJ forums:
  http://forum.java.sun.com/thread.jsp?forum=316&thread=398785
(as noted on the forum) removing the parentheses around 'i.next()' in the
example is a valid workaround:

Codeview "bytecode" for public static void A2.main(java.lang.String[]):
  #3/A2.java:5 - new class java.util.ArrayList
  #4/A2.java:5 - dup
  #5/A2.java:5 - bipush (byte)10
  #6/A2.java:5 - invokespecial public java.util.ArrayList(int)
  #7/A2.java:5 - astore_1 lv_1
  #8/A2.java:6 - aload_1 lv_1
  #9/A2.java:6 - invokevirtual public java.util.Iterator java.util.AbstractList.iterator()
  #10/A2.java:6 - astore_2 lv_2
  #11/A2.java:7 - aload_2 lv_2
  #12/A2.java:7 - invokeinterface public abstract java.lang.Object java.util.Iterator.next()
  #13/A2.java:7 - checkcast class java.lang.Boolean
  #14/A2.java:7 - invokevirtual public final boolean java.lang.Boolean.booleanValue()
  #15/A2.java:7 - istore_3 lv_3
  #16/A2.java:8 - return

Note the new presence of instruction #13.
 --scott

chemical agent cracking Uzi Soviet  Mk 48 IDEA East Timor Minister 
TASS colonel BATF assassination politics Justice Panama Albanian Leitrim 
                         ( http://cscott.net/ )

Valid XHTML 1.0!