[
https://issues.apache.org/jira/browse/GROOVY-11591?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Paul King closed GROOVY-11591.
------------------------------
> safe call evaluates arguments
> ------------------------------
>
> Key: GROOVY-11591
> URL: https://issues.apache.org/jira/browse/GROOVY-11591
> Project: Groovy
> Issue Type: Bug
> Components: class generator
> Reporter: OC
> Assignee: Eric Milles
> Priority: Minor
> Fix For: 5.0.0-beta-1
>
>
> A safe method call first evaluates method's arguments, and only then trashes
> the call. It would seem to me much better if the arguments were not evaluated
> in this case (precisely same way as if we used the java-like “if (obj)
> obj.whatever...” approach instead of the safe call).
> Based on Jochen insight, what probably happens is
> * push arguments on stack
> * push receiver on stack
> * write jmp if null
> * write method call
> * jmp to after call
> * marker for null case
> * remove elements from stack
> * push null
> * marker for after call
> Testable e.g., by
> {code:java}
> 1040 ocs /tmp> <q.groovy
> class qq {
> def foo(String s) {
> println "foo called!"
> s
> }
> def bar(String s) {
> println "bar: $s"
> }
> }
> null?.bar(new qq().foo('Oops!'))
> 1041 ocs /tmp> /usr/local/groovy-4.0.25/bin/groovy q
> foo called!
> 1042 ocs /tmp> {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)