Val E created GROOVY-11769:
------------------------------
Summary: @CompileStatic incorrectly generates dynamic call for a
cast guarded by an instanceof check
Key: GROOVY-11769
URL: https://issues.apache.org/jira/browse/GROOVY-11769
Project: Groovy
Issue Type: Bug
Affects Versions: 4.0.28
Environment: JDK21
Reporter: Val E
Fix For: 4.0.28
Attachments: CompilerTest.groovy, decompiled.java
When using {{@CompileStatic}} the compiler fails to generate static bytecode
for a cast on a variable of type {{{}Object{}}}. Even when the cast is
explicitly guarded by an {{instanceof Collection}} check, the compiler
pessimistically inserts an {{invokedynamic}} call when the variable is passed
as an argument to a method (like {{{}list.addAll(){}}}) or a constructor
({{{}new ArrayList(){}}}).
This behavior defeats the purpose of the explicit {{instanceof}} guard and
explicit cast
Ex groovy method
{code:java}
static List<Object> resultToResultList(Object result) {
if (result == null) return new ArrayList()
else if (result instanceof Collection)return new
ArrayList<Object>((Collection)result)
else if( result instanceof Number) List.of(result)
else if( result instanceof String) List.of(result)
return List.of(result)
}{code}
the decompiled version of the same method, note the dynamic dipatch casting on
Collection
{code:java}
public static List<Object> resultToResultList(Object result) {
if (result == null) {
return new ArrayList();
} else if (result instanceof Collection) {
return new ArrayList(((Class)result).cast<invokedynamic>(result));
} else {
if (result instanceof Number) {
List.of(result);
} else if (result instanceof String) {
List.of(result);
}
return List.of(result);
}
} {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)