Field access via .- in reflective case does not work


  • Type: Defect Defect
  • Status: Closed Closed
  • Priority: Major Major
  • Resolution: Completed
  • Affects Version/s: Release 1.5
  • Fix Version/s: Release 1.6
  • Component/s: None
  • Labels:
  • Patch:
    Code and Test
  • Approval:


The (.-foo instance) syntax will properly resolve to either a field or a no-arg method if the type of instance is known. However, in the reflective case, it will only resolve to a method. This behavior should match the non-reflective case. The method case always be forced by using (. foo (method)).

user> (definterface I (a []))
user> (deftype T [a] I (a [_] "method"))
user> (def t (->T "field"))
user=> (. ^T t a)  ;; as expected (prefer method)
user=> (. ^T t -a) ;; as expected (prefer field)
user> (. t a)      ;; as expected (prefer method)
user> (. t -a)     ;; WRONG - should return "field"

Approach: This case falls into Reflector.invokeNoArgInstanceMember() (this is the only place this method is used). InstanceFieldExpr now takes another flag (requireField) which will be set to true if "-field" and false if "field". InstanceFieldExpr will invoke (or emit) a call to Reflector.invokeNoArgInstanceMember() which now takes the same flag. If the flag is set to true, it first looks only for a field, otherwise it looks for a method and falls back to field which throws an error if necessary. I added a new invokeNoArgInstanceMember() with an arity to match the old arity - existing bytecode compiled on older Clojure versions will be trying to call this arity.

Patch: clj-1363-v3.patch

Screened by:

  1. clj-1363-v1.patch
    20/Feb/14 10:40 AM
    2 kB
    Alex Miller
  2. clj-1363-v2.patch
    21/Feb/14 5:41 AM
    5 kB
    Alex Miller
  3. clj-1363-v3.patch
    27/Feb/14 8:24 AM
    5 kB
    Alex Miller



Vote (0)
Watch (0)


  • Created: