Bug in genclass?

70 views
Skip to first unread message

Michael Reid

unread,
Nov 6, 2008, 1:12:09 PM11/6/08
to clo...@googlegroups.com
Hi,

I am getting the following error trying to extend java.lang.Exception
in the latest revision of Clojure:

user=>(defmacro defexception [name]
`(try
(gen-and-load-class (quote ~name) :extends Exception)
(catch java.lang.LinkageError le#
(. le# (printStackTrace)))))

user=> (defexception my.Exception)
java.lang.ClassFormatError: JVMCFRE114 field name is invalid;
class=my/Exception, offset=0
at java.lang.ClassLoader.defineClassImpl(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:265)
at java.lang.ClassLoader.defineClass(ClassLoader.java:202)
at clojure.lang.DynamicClassLoader.defineClass(DynamicClassLoader.java:39)
at clojure.gen_and_load_class__2231.doInvoke(genclass.clj:461)
at clojure.lang.RestFn.invoke(RestFn.java:443)
at user.fn__2491.invoke(Unknown Source)
at clojure.lang.AFn.applyToHelper(AFn.java:182)
at clojure.lang.AFn.applyTo(AFn.java:175)
at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:2664)
at clojure.lang.Compiler.eval(Compiler.java:4116)
at clojure.lang.Repl.main(Repl.java:91)
nil
user=>

The 'defexception macro is actually from swank-clojure. I have used
this successfully in the past, the difference here is that I am using
the IBM 1.6.0 JRE in this case:

[mike@mreid-rhel trunk]$ java -version
java version "1.6.0"
Java(TM) SE Runtime Environment (build pxi3260sr2-20080818_01(SR2))
IBM J9 VM (build 2.4, J2RE 1.6.0 IBM J9 2.4 Linux x86-32
jvmxi3260-20080816_22093 (JIT enabled, AOT enabled)
J9VM - 20080816_022093_lHdSMr
JIT - r9_20080721_1330ifx2
GC - 20080724_AA)
JCL - 20080808_02

I'm not sure if this is Clojure's bug or IBM's. I don't have the
luxury of testing this on any other JVMs at the moment. I presume that
since everyone is able to use swank-clojure at the latest revision
that this is not happening on other JVMs?

/mike.

Michael Reid

unread,
Nov 6, 2008, 2:23:33 PM11/6/08
to clo...@googlegroups.com
Update:

I used gen-and-save-class to see what it is complaining about. It is
failing due to the following fields:

public static final clojure.lang.Var printStackTrace-void__var;
public static final clojure.lang.Var printStackTrace-PrintWriter__var;
public static final clojure.lang.Var printStackTrace-PrintStream__var;

The patch seems to be fairly trivial. I patched genclass.clj with:

Index: src/clj/clojure/genclass.clj
===================================================================
--- src/clj/clojure/genclass.clj (revision 1087)
+++ src/clj/clojure/genclass.clj (working copy)
@@ -53,9 +53,9 @@

(defn- overload-name [mname pclasses]
(if (seq pclasses)
- (apply str mname (interleave (repeat \-)
+ (apply str mname (interleave (repeat \$)
(map escape-class-name pclasses)))
- (str mname "-void")))
+ (str mname "$void")))

I am not 100% sure this doesn't haven't any other effects within the
genclass code, but I did a test and it seems to be behave properly.

/mike.

Reply all
Reply to author
Forward
0 new messages