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)

Reply via email to