Completed
Details
Details
Assignee
Unassigned
UnassignedReporter
Kevin Downey
Kevin DowneyApproval
Ok
Patch
Code and Test
Priority
Affects versions
Fix versions
Created April 2, 2014 at 10:13 PM
Updated July 18, 2015 at 12:55 AM
Resolved July 18, 2015 at 12:55 AM
deftypes with fields whose names get munged fail when constructed in data reader functions.
user=> (deftype Foo [hello-world]) user.Foo user=> (alter-var-root #'default-data-readers assoc 'foo (fn [x] (->Foo x))) {inst #'clojure.instant/read-instant-date, uuid #'clojure.uuid/default-uuid-reader, foo #object[user$eval12$fn__13 0x23c89df9 "user$eval12$fn__13@23c89df9"]} user=> #foo "1" CompilerException java.lang.IllegalArgumentException: No matching field found: hello-world for class user.Foo, compiling:(NO_SOURCE_PATH:0:0)
Cause: To embed deftypes in the bytecode the compiler emits the value of each field, then emits a call to the deftypes underlying class's constructor. To get a list of fields the compiler calls .getBasis. The getBasis fields are the "clojure" level field names of the deftype, which the actual "jvm" level field names have been munged (replacing - with _, etc), so the compiler tries to generate code to set values on non-existent fields.
Approach: Munge the field name before emitting it in bytecode.
Patch: clj-1399-with-test.diff
Screened by: Alex Miller