Daniel Sun created GROOVY-12285:
-----------------------------------
Summary: STC: index extension methods by name and skip cloning
non-generic parameters
Key: GROOVY-12285
URL: https://issues.apache.org/jira/browse/GROOVY-12285
Project: Groovy
Issue Type: Improvement
Reporter: Daniel Sun
The static type checker resolves DGM (Default Groovy Methods) and other
extension methods by walking the receiver hierarchy and collecting methods of a
given name. {{ExtensionMethodCache}} stores a flat list per receiver type, so
each named lookup scans every method on that type. Receivers such as {{Object}}
and {{Collection}} have hundreds of DGM methods, and that scan sits on the
compile hot path.
{{chooseBestMethod}} erases generic parameter types before measuring
argument-parameter distance. It currently clones every candidate's parameter
array to do so, including methods that have no generic parameters.
h3. Proposed change
* When a class loader's extension methods are scanned, index each receiver list
by method name so a named lookup is a hash get rather than a linear scan.
* Clone a candidate's parameter array only when at least one parameter is a
generics placeholder or otherwise uses generics.
* Drop derived indexes together with the loader's method map so they cannot go
stale independently.
{code:java}
// today
for (MethodNode node : fromDGM) {
if (node.getName().equals(name)) accumulator.add(node);
}
// proposed
accumulator.addAll(EXTENSION_METHOD_CACHE.get(loader, className, name));
{code}
h3. Impact
Compile-time only. Named lookup results and overload selection stay the same.
{{MethodNode}} parameter arrays are not mutated.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)