Wrong code generation

Michael Koch konqueror@gmx.de
Fri Mar 21 12:27:00 GMT 2003


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Am Dienstag, 18. März 2003 15:43 schrieb Michael Koch:
> Hi list,
>
>
> The attached testcase produces wrong bytecode when compiled with
> gcj.
>
> When compiled and run with Sun's JDK it prints "Michael". ;-)
>
> When compiled with gcj and run with Sun's java it prints:
> Exception in thread "main" java.lang.VerifyError: (class:
> InvokeTest, method: test signature: ()V) Illegal use of nonvirtual
> function call
>
> (Thats a testcase I made for a bug found when bootstrapping ant
> 1.5.2)

I investigated this a bit more and looked at the differences in 
jcf-dump output of InvokeTest.class generated from SUN's javac 
1.4.1_01 and gcj from trunk (today).

Sun generates for InvokeTest.test:

Method name:"test" public Signature: 16=()void
Attribute "Code", length:46, max_stack:3, max_locals:2, code_length:14
  0: new #5=<Class InvokeTest$InnerClass>
  3: dup
  4: aload_0
  5: invokespecial #6=<Method InvokeTest$InnerClass.<init> 
(InvokeTest)void>
  8: astore_1
  9: aload_1
 10: invokestatic #7=<Method InvokeTest$InnerClass.access$000 
(InvokeTest$InnerClass)void>
 13: return
Attribute "LineNumberTable", length:14, count: 3
  line: 15 at pc: 0
  line: 16 at pc: 9
  line: 17 at pc: 13

GCJ generates for the same method:

Method name:"test" public Signature: 9=()void
Attribute "Code", length:42, max_stack:3, max_locals:2, code_length:14
  0: new #18=<Class InvokeTest$InnerClass>
  3: dup
  4: aload_0
  5: invokespecial #21=<Method InvokeTest$InnerClass.<init> 
(InvokeTest)void>
  8: astore_1
  9: aload_1
 10: invokespecial #24=<Method InvokeTest$InnerClass.invoke ()void>
 13: return
Attribute "LineNumberTable", length:10, count: 2
  line: 15 at pc: 0
  line: 16 at pc: 9

The main difference is this

sun: 10: invokestatic #7=<Method InvokeTest$InnerClass.access$000
(InvokeTest$InnerClass)void>

gcj: 10: invokespecial #24=<Method InvokeTest$InnerClass.invoke 
()void>


The call of InvokeTest.InnerClass.invoke() is just generated wrongly.


I hope this helps fixing this bug.


Michael
- -- 
Homepage: http://www.worldforge.org/
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)

iD8DBQE+ewV+WSOgCCdjSDsRAvvHAJ9GoYKPYT8wd7Mg0+piP90UBBW20gCfftpV
oIk1oOA8J7hE4uESNZkb1JM=
=dnDV
-----END PGP SIGNATURE-----



More information about the Java mailing list