You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "ASF GitHub Bot (Jira)" <ji...@apache.org> on 2026/07/08 00:06:00 UTC

[jira] [Commented] (GROOVY-12138) emit invokedynamic call sites for property writes

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

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

paulk-asert opened a new pull request, #2674:
URL: https://github.com/apache/groovy/pull/2674

   Property writes were the last un-cached dispatch surface: even in indy mode they compiled to static ScriptBytecodeAdapter.setProperty calls, paying getMetaClass() plus a full MetaClassImpl.setProperty resolution walk on every write, in both indy and classic modes.
   
   Behind the compile-time flag groovy.indy.setproperty (default: off), AsmClassGenerator now diverts plain (non-safe, non-spread) property writes to a new CallSiteWriter.makeSetPropertySite hook. The default implementation is the classic adapter call, so classic mode and flag-off builds are unchanged; IndyCallSiteWriter overrides it to emit invokedynamic setProperty:(ReceiverType, ValueType)V with the receiver first, preserving the runtime's arguments[0]-is-receiver invariant.
   
   The new SetPropertySelector (replacing the 'not supported' GroovyBugError for CallType.SET) fast-paths only shapes whose resolution is provably sender- and metaclass-independent: a public setter whose backing field is private or absent (GROOVY-8283 field-precedence is sender-dependent), or a public non-final field, each accepting the runtime value type directly. Everything else — Maps (GROOVY-8065/11367), Class receivers, categories, overridden/mixed-in/expando setProperty (detected by both a reflection probe and a metaclass pickMethod probe; ExpandoMetaClass is excluded wholesale, mirroring the GET selector), value coercion, listeners, propertyMissing — binds the sender-aware ScriptBytecodeAdapter.setProperty as the call-site handle, making non-fast-path behavior identical to the classic path by construction. Guards, PIC, and hit-count promotion come free from the existing call-site machinery; the value participates in the argument-class guards so type changes at a site re-select correctly.
   
   Measured: ~42x on a hot property-write loop (6M mixed setter/field writes: ~435ms -> ~10ms, written state consumed and verified). Full root test suite (15678 tests) passes with the flag enabled for all test-code compilation; a 12-scenario semantic stress produces identical output compiled with and without the flag.




> emit invokedynamic call sites for property writes
> -------------------------------------------------
>
>                 Key: GROOVY-12138
>                 URL: https://issues.apache.org/jira/browse/GROOVY-12138
>             Project: Groovy
>          Issue Type: Improvement
>            Reporter: Paul King
>            Priority: Major
>




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