Field access via .- in reflective case does not work

Description

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.I user> (deftype T [a] I (a [_] "method")) user.T user> (def t (->T "field")) #'user/t user=> (. ^T t a) ;; as expected (prefer method) "method" user=> (. ^T t -a) ;; as expected (prefer field) "field" user> (. t a) ;; as expected (prefer method) "method" user> (. t -a) ;; WRONG - should return "field" "method"

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:

Environment

None

Attachments

3

Activity

Show:

Andy Fingerhut February 28, 2014 at 12:02 PM

A patch for this ticket has been committed as part of Clojure 1.6.0-beta2: https://github.com/clojure/clojure/commit/5fda6cb262d1807566ecadd3af9aaafb58ee5544

It appears this ticket could be closed now.

Alex Miller February 21, 2014 at 11:42 AM

Updated with new patch to thread this case through InstanceFieldExpr.

Rich Hickey February 21, 2014 at 1:24 AM

You can't change the semantics of invokeNoArgInstanceMember - they are correct when not using '-'. We need to feed the info that '-' was used through InstanceFieldExpr and make field-first conditional on that.

Completed

Details

Assignee

Reporter

Labels

Approval

Ok

Patch

Code and Test

Priority

Affects versions

Fix versions

Created February 18, 2014 at 10:33 PM
Updated February 28, 2014 at 1:52 PM
Resolved February 28, 2014 at 1:52 PM