[ 
https://issues.apache.org/jira/browse/GROOVY-12325?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18110395#comment-18110395
 ] 

ASF GitHub Bot commented on GROOVY-12325:
-----------------------------------------

codecov-commenter commented on PR #2852:
URL: https://github.com/apache/groovy/pull/2852#issuecomment-5498937244

   ## 
[Codecov](https://app.codecov.io/gh/apache/groovy/pull/2852?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)
 Report
   :x: Patch coverage is `80.40000%` with `49 lines` in your changes missing 
coverage. Please review.
   :white_check_mark: Project coverage is 70.8202%. Comparing base 
([`03e303e`](https://app.codecov.io/gh/apache/groovy/commit/03e303e9fdb2715c1be064849984c19a14cab4b8?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache))
 to head 
([`c17676b`](https://app.codecov.io/gh/apache/groovy/commit/c17676b9e7e3625fdcf0bfdaa7bb1e993e641d47?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)).
   :warning: Report is 2 commits behind head on master.
   
   | [Files with missing 
lines](https://app.codecov.io/gh/apache/groovy/pull/2852?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)
 | Patch % | Lines |
   |---|---|---|
   | 
[...groovy/internal/runtime/invoke/InvokerFactory.java](https://app.codecov.io/gh/apache/groovy/pull/2852?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Forg%2Fapache%2Fgroovy%2Finternal%2Fruntime%2Finvoke%2FInvokerFactory.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-c3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2dyb292eS9pbnRlcm5hbC9ydW50aW1lL2ludm9rZS9JbnZva2VyRmFjdG9yeS5qYXZh)
 | 68.8679% | [18 Missing and 15 partials :warning: 
](https://app.codecov.io/gh/apache/groovy/pull/2852?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)
 |
   | 
[...ava/org/apache/groovy/util/HiddenClassDefiner.java](https://app.codecov.io/gh/apache/groovy/pull/2852?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Forg%2Fapache%2Fgroovy%2Futil%2FHiddenClassDefiner.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-c3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2dyb292eS91dGlsL0hpZGRlbkNsYXNzRGVmaW5lci5qYXZh)
 | 57.1429% | [10 Missing and 2 partials :warning: 
](https://app.codecov.io/gh/apache/groovy/pull/2852?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)
 |
   | 
[...a/org/codehaus/groovy/reflection/CachedMethod.java](https://app.codecov.io/gh/apache/groovy/pull/2852?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Forg%2Fcodehaus%2Fgroovy%2Freflection%2FCachedMethod.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-c3JjL21haW4vamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3JlZmxlY3Rpb24vQ2FjaGVkTWV0aG9kLmphdmE=)
 | 87.8788% | [1 Missing and 3 partials :warning: 
](https://app.codecov.io/gh/apache/groovy/pull/2852?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)
 |
   
   <details><summary>Additional details and impacted files</summary>
   
   
   
   [![Impacted file tree 
graph](https://app.codecov.io/gh/apache/groovy/pull/2852/graphs/tree.svg?width=650&height=150&src=pr&token=1r45138NfQ&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)](https://app.codecov.io/gh/apache/groovy/pull/2852?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)
   
   ```diff
   @@                Coverage Diff                 @@
   ##               master      #2852        +/-   ##
   ==================================================
   + Coverage     70.7930%   70.8202%   +0.0272%     
   - Complexity      36966      37059        +93     
   ==================================================
     Files            1576       1578         +2     
     Lines          134769     135018       +249     
     Branches        24946      24996        +50     
   ==================================================
   + Hits            95407      95620       +213     
   - Misses          30761      30781        +20     
   - Partials         8601       8617        +16     
   ```
   
   | [Files with missing 
lines](https://app.codecov.io/gh/apache/groovy/pull/2852?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)
 | Coverage Δ | |
   |---|---|---|
   | 
[...roovy/internal/runtime/invoke/InvokerBytecode.java](https://app.codecov.io/gh/apache/groovy/pull/2852?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Forg%2Fapache%2Fgroovy%2Finternal%2Fruntime%2Finvoke%2FInvokerBytecode.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-c3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2dyb292eS9pbnRlcm5hbC9ydW50aW1lL2ludm9rZS9JbnZva2VyQnl0ZWNvZGUuamF2YQ==)
 | `100.0000% <100.0000%> (ø)` | |
   | 
[...a/org/codehaus/groovy/reflection/CachedMethod.java](https://app.codecov.io/gh/apache/groovy/pull/2852?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Forg%2Fcodehaus%2Fgroovy%2Freflection%2FCachedMethod.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-c3JjL21haW4vamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3JlZmxlY3Rpb24vQ2FjaGVkTWV0aG9kLmphdmE=)
 | `80.9859% <87.8788%> (+3.7132%)` | :arrow_up: |
   | 
[...ava/org/apache/groovy/util/HiddenClassDefiner.java](https://app.codecov.io/gh/apache/groovy/pull/2852?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Forg%2Fapache%2Fgroovy%2Futil%2FHiddenClassDefiner.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-c3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2dyb292eS91dGlsL0hpZGRlbkNsYXNzRGVmaW5lci5qYXZh)
 | `75.9494% <57.1429%> (-10.3251%)` | :arrow_down: |
   | 
[...groovy/internal/runtime/invoke/InvokerFactory.java](https://app.codecov.io/gh/apache/groovy/pull/2852?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Forg%2Fapache%2Fgroovy%2Finternal%2Fruntime%2Finvoke%2FInvokerFactory.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-c3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2dyb292eS9pbnRlcm5hbC9ydW50aW1lL2ludm9rZS9JbnZva2VyRmFjdG9yeS5qYXZh)
 | `68.8679% <68.8679%> (ø)` | |
   
   ... and [11 files with indirect coverage 
changes](https://app.codecov.io/gh/apache/groovy/pull/2852/indirect-changes?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)
   </details>
   <details><summary> :rocket: New features to boost your workflow: </summary>
   
   - :snowflake: [Test 
Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, 
report on failures, and find test suite problems.
   - :package: [JS Bundle 
Analysis](https://docs.codecov.com/docs/javascript-bundle-analysis): Save 
yourself from yourself by tracking and limiting bundle sizes in JS merges.
   </details>




> Speed up CachedMethod.invoke with a generated JIT-constant trampoline
> ---------------------------------------------------------------------
>
>                 Key: GROOVY-12325
>                 URL: https://issues.apache.org/jira/browse/GROOVY-12325
>             Project: Groovy
>          Issue Type: Improvement
>            Reporter: Daniel Sun
>            Priority: Major
>
> h2. Problem
> {{CachedMethod.invoke}} is the MOP/Java fallback used by {{MetaClassImpl}}, 
> classic uncompiled call sites, and the default indy cold tier 
> ({{invokeColdReflective}} -> {{doMethodInvoke}}).
> That path still calls {{java.lang.reflect.Method.invoke}}. A {{MethodHandle}} 
> held in an instance field is in the same performance band. After C2, only a 
> JIT-constant callee (direct {{invokevirtual}} / {{invokestatic}} / 
> {{invokeinterface}} in generated bytecode, or {{invokeExact}} of a {{static 
> final}} / classData handle, or a linked {{invokedynamic}} CallSite) runs like 
> a Java direct call.
> Hot monomorphic indy and {{@CompileStatic}} already have that shape. 
> {{CachedMethod.invoke}} does not.
> h2. Approach
> After {{groovy.cachedmethod.invoker.threshold}} hits (default 100, below 
> {{groovy.indy.optimize.threshold}} of 1000 so cold indy is still on 
> {{doMethodInvoke}} when the trampoline appears), install a generated 
> {{DirectInvoker}} behind {{CachedMethod.invoke}} only.
> Internal types live in {{org.apache.groovy.internal.runtime.invoke}} 
> (japicmp-excluded). Definition reuses {{HiddenClassDefiner}} (GROOVY-12223) 
> and {{ClassLoaderForClassArtifacts}}.
> Define order:
> # InvokerFactory nestmate + direct invoke when the member is publicly 
> invocable from that class ({{String.startsWith}}).
> # Declaring-class nestmate + direct invoke when {{privateLookupIn}} is 
> possible. Private class methods use {{invokevirtual}}; private interface 
> methods use {{invokeinterface}} (hidden nestmates do not subclass the host, 
> so {{invokespecial}} fails verification).
> # InvokerFactory nestmate + classData {{MethodHandle}} + {{invokeExact}} when 
> types are still resolvable from the runtime loader.
> # {{ClassLoaderForClassArtifacts}} when the host loader can resolve 
> {{DirectInvoker}} — never for bootstrap types.
> Failures sticky-return {{null}}; {{CachedMethod.invoke}} keeps 
> {{Method.invoke}}. Generation is skipped for caller-sensitive and abstract 
> methods, Android, native image, and when hidden classes are disabled.
> This is the MOP "Groovy as caller" path ({{makeAccessible}}). Indy continues 
> to {{unreflect}} with the call-site {{Lookup}} and must not be fed the 
> trampoline.
> h2. Configuration
> {noformat}
> -Dgroovy.cachedmethod.invoker.threshold=100
> -Dgroovy.cachedmethod.invoker.disable=true
> {noformat}
> The existing {{-Dgroovy.hidden.classes.disable=true}} also turns generation 
> off.
> h2. Compatibility
> * No change to the {{MetaMethod.invoke}} / {{CachedMethod.invoke}} signatures.
> * Selection (categories, EMC, interceptable, per-instance MetaClass) is 
> unchanged; the trampoline is bound to the Java {{Method}}, not to a 
> {{MetaMethod}} wrapper.
> * Wrong-argument type on the generated path is {{ClassCastException}} 
> (rethrown), matching DGM / {{CallSiteGenerator}}. The reflective path still 
> wraps {{IllegalArgumentException}} in {{InvokerInvocationException}}.
> * Opt-out: {{-Dgroovy.cachedmethod.invoker.disable=true}}.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to