[CLJ-1363] Field access via .- in reflective case does not work Created: 18/Feb/14 Updated: 28/Feb/14 Resolved: 28/Feb/14
|Affects Version/s:||Release 1.5|
|Fix Version/s:||Release 1.6|
|Attachments:||clj-1363-v1.patch clj-1363-v2.patch clj-1363-v3.patch|
|Patch:||Code and Test|
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)).
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.
|Comment by Rich Hickey [ 20/Feb/14 7:24 PM ]|
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.
|Comment by Alex Miller [ 21/Feb/14 5:42 AM ]|
Updated with new patch to thread this case through InstanceFieldExpr.
|Comment by Andy Fingerhut [ 28/Feb/14 6:02 AM ]|
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.