I'm getting an error when trying to compile the following classes with gcj: | $ scalac hamming.scala | $ ls -lh *.class | -rw-rw-r-- 1 vadim vadim 1.1K Sep 7 20:16 hamming$$anonfun$0.class | -rw-rw-r-- 1 vadim vadim 1.1K Sep 7 20:16 hamming$$anonfun$1.class | -rw-rw-r-- 1 vadim vadim 1.1K Sep 7 20:16 hamming$$anonfun$2.class | -rw-rw-r-- 1 vadim vadim 1.5K Sep 7 20:16 hamming$$anonfun$3$$anonfun$4.class | -rw-rw-r-- 1 vadim vadim 1.5K Sep 7 20:16 hamming$$anonfun$3$$anonfun$5.class | -rw-rw-r-- 1 vadim vadim 1.5K Sep 7 20:16 hamming$$anonfun$3$$anonfun$6.class | -rw-rw-r-- 1 vadim vadim 1.3K Sep 7 20:16 hamming$$anonfun$3.class | -rw-rw-r-- 1 vadim vadim 868 Sep 7 20:16 hamming.class | -rw-rw-r-- 1 vadim vadim 2.4K Sep 7 20:16 hamming$.class | $ jar cf hamming.jar *.class | $ gcj --main=hamming --classpath=/usr/local/scala/share/scala/lib/scala-library.jar hamming.jar | hamming.scala: In class 'hamming$': | hamming.scala: In constructor '()': | hamming$.java:0: warning: assignment to final static field `MODULE$' not in class initializer | /tmp/cc8cPsFr.s: Assembler messages: | /tmp/cc8cPsFr.s:85: Error: symbol `_ZN18hamming$$anonfun$05applyEv' is already defined | /tmp/cc8cPsFr.s:514: Error: symbol `_ZN18hamming$$anonfun$15applyEv' is already defined | /tmp/cc8cPsFr.s:841: Error: symbol `_ZN18hamming$$anonfun$25applyEv' is already defined | /tmp/cc8cPsFr.s:2416: Error: symbol `_ZN18hamming$$anonfun$35applyEv' is already defined The .class files were produced by Scala 2.1.8: http://scala.epfl.ch/downloads/distrib/files/scala-2.1.8.tar.gz The above is under the following version of GCJ: | $ gcj -v | Using built-in specs. | Reading specs from /usr/lib/gcc/x86_64-redhat-linux/4.1.1/libgcj.spec | rename spec lib to liborig | Target: x86_64-redhat-linux | Configured with: ../configure --prefix=/usr --mandir=/usr/share/man \ | --infodir=/usr/share/info --enable-shared --enable-threads=posix \ | --enable-checking=release --with-system-zlib --enable-__cxa_atexit \ | --disable-libunwind-exceptions --enable-libgcj-multifile \ | --enable-languages=c,c++,objc,obj-c++,java,fortran,ada \ | --enable-java-awt=gtk --disable-dssi \ | --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre \ | --with-cpu=generic --host=x86_64-redhat-linux | Thread model: posix | gcc version 4.1.1 20060525 (Red Hat 4.1.1-1) I will attach the offending .jar file in a minute.
Created attachment 12208 [details] hamming.jar the promised jar file
Created attachment 12209 [details] hamming.scala the offending Scala program
I bet this was fixed in 4.2.0 with the ABI changing patch which changed the ABI to also include the return type.
Also see PR 28892
PR 28892 reminded me that I had forgotten to mention one thing. The attached program (attachment 12208 [details]) runs fine under gij. To be more precise, it does more or less the same thing it does under Sun's JDK. Under Sun: | $ time java \ | -classpath /usr/local/scala/share/scala/lib/scala-library.jar:hamming.jar \ | hamming | The first 20 numbers: | 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32, 36 | | The 100th number (counting from 0): 1600 | | The 1000th: | Exception in thread "main" java.lang.OutOfMemoryError: Java heap space | | real 0m9.922s | user 0m6.532s | sys 0m2.780s Under gij: | $ gij \ | --classpath /usr/local/scala/share/scala/lib/scala-library.jar:hamming.jar \ | hamming | The first 20 numbers: | 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32, 36 | | The 100th number (counting from 0): 1600 | | The 1000th: | Killed Under Sun, it causes an OOM when trying to compute the 1000th Hamming number. Under gij, it starts paging like there is no tomorrow, but keeps on going and hoses up my machine pretty quickly.
This is fixed in svn head. Part was fixed by the mangling change, which we can't backport to 4.1. The other part was fixed when the PR 28892 fix went in today. I didn't let it try to compute the 1000th number but the rest worked.