missing field munging when recreating deftypes serialized into byte code

Description

deftypes with fields whose names get munged fail when constructed in data reader functions.

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

Environment

None

Activity

Show:
Kevin Downey
April 2, 2014, 10:26 PM

reproducing case

Kevin Downey
April 2, 2014, 10:39 PM

this patch fixes the issue on the latest master for me

Chas Emerick
April 2, 2014, 10:57 PM

FWIW, this was precipitated by real experience (I think I created the refheap paste). The workaround is easy (don't use dashes in field names of deftypes you want to return from data reader functions), but I wouldn't expect anyone to guess that that wasn't already oversensitized to munging edge cases.

Alex Miller
April 29, 2015, 5:36 PM

Could the patch have a test?

Kevin Downey
April 29, 2015, 7:20 PM

clj-1399-with-test.diff adds a test

Completed

Assignee

Unassigned

Reporter

Kevin Downey

Labels

Approval

Ok

Patch

Code and Test

Fix versions

Affects versions

Priority

Critical