Details
Assignee
UnassignedUnassignedReporter
Nicola MomettoNicola MomettoLabels
Approval
TriagedPatch
CodePriority
Minor
Details
Details
Assignee
Unassigned
UnassignedReporter
Nicola Mometto
Nicola MomettoLabels
Approval
Triaged
Patch
Code
Priority
Created August 2, 2018 at 10:42 AM
Updated September 21, 2021 at 5:36 PM
Before patch:
user=> (definterface I (f [])) user.I user=> (def p (proxy [Object I] [] (f [] 1))) #'user/p user=> (definterface I (f [])) user.I user=> (def p (proxy [Object I] [] (f [] 1))) #'user/p user=> (.f ^I p) ClassCastException user.proxy$java.lang.Object$I$383c225e cannot be cast to user.I user$eval7491.invokeStatic (:1)
After patch:
user=> (definterface I (f [])) user.I user=> (def p (proxy [Object I] [] (f [] 1))) #'user/p user=> (definterface I (f [])) user.I user=> (def p (proxy [Object I] [] (f [] 1))) #'user/p user=> (.f ^I p) 1
Cause: `proxy` caches the generated class using a set of classnames (see https://github.com/clojure/clojure/blob/master/src/clj/clojure/core_proxy.clj#L280-L286), this is not safe under redefinition of interfaces
Proposed: change the hashing function used to determine proxy class cache hits to take into account the identity of each interface/super class rather than just their name
Patch: 0001-CLJ-2379-idempotent-proxy-name-just-on-identical-ins-v2.patch