Scott Murphy Heiberg created GROOVY-12667:
---------------------------------------------
Summary: Implicit-this call in a DELEGATE_FIRST closure with a
null delegate throws NullPointerException instead of calling the owner
Key: GROOVY-12667
URL: https://issues.apache.org/jira/browse/GROOVY-12667
Project: Groovy
Issue Type: Bug
Affects Versions: 5.0.8, 4.0.33, 6.0.0, 7.0.0-alpha-1
Reporter: Scott Murphy Heiberg
{code:groovy}
class Owner {
def foo() { 'owner' }
def test() {
def c = { -> foo() }
c.resolveStrategy = Closure.DELEGATE_FIRST
c.delegate = null
c()
}
}
assert new Owner().test() == 'owner'
{code}
*Actual:* {{java.lang.NullPointerException: Cannot invoke method foo() on null
object}}. The same happens for OWNER_FIRST with a null owner (the delegate is
never tried), for a dehydrated closure, and for a method that neither candidate
has (NPE instead of MissingMethodException). Since GROOVY-11858, {{toString()}}
in such a closure returns "null" and {{is(null)}} returns true, because they
run against NullObject.
*Expected:* a null delegate (or owner) is skipped and the other candidate
answers, as in Groovy 3 and as property access ({{Closure.getProperty}}) still
does. When neither answers, a MissingMethodException is thrown.
Cause: GROOVY-7232 removed the {{instanceof GroovyObject}} check from the
DELEGATE_FIRST and OWNER_FIRST branches of {{ClosureMetaClass.invokeMethod}},
which also let a null delegate or owner through to
{{InvokerHelper.invokeMethod(null, ...)}}.
Verified: 4.0.33, 5.0.8, 6.0.0 and master affected; 3.0.25 and 2.4.15 not
affected.
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)