This is an automated email from the ASF dual-hosted git repository. paulk-asert pushed a commit to branch asf-site in repository https://gitbox.apache.org/repos/asf/groovy-website.git
commit 83b0540d411d8121a16a476984dd2b629e788730 Author: Paul King <[email protected]> AuthorDate: Sat Jul 11 14:54:11 2026 +1000 GEP-27: update the closure reference-implementation to the current state All three safety layers are now implemented (add the decline-diagnostics layer); the capability analysis and typed static dispatch are implemented and validated (compile-time packing across the core module and others), so the remaining Groovy 7 work is restated as S3 elision, writer unification, nested-closure owner retargeting, and hardening the automatic path from experimental to default-on. --- site/src/site/wiki/GEP-27.adoc | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/site/src/site/wiki/GEP-27.adoc b/site/src/site/wiki/GEP-27.adoc index c73b107..a342236 100644 --- a/site/src/site/wiki/GEP-27.adoc +++ b/site/src/site/wiki/GEP-27.adoc @@ -559,8 +559,8 @@ development: arbitrary-depth nesting, written captures via `Reference`, implicit `it` — under both compilation modes. It confirms the writer is the right home (no `@CompileStatic` boundary, unlike an AST-transform approach), establishes the soundness cliff empirically, and confirms what is - preserved (`curry`/`memoize`/`trampoline` all keep working on the adapter). Two of the three - safety layers from _Guarding the dynamic trust assertion_ are now implemented and validated: + preserved (`curry`/`memoize`/`trampoline` all keep working on the adapter). All three safety layers + from _Guarding the dynamic trust assertion_ are now implemented and validated: ** the *runtime guard* — `PackedClosure` rejects `setDelegate`/`setResolveStrategy` set to any non-owner configuration. Probing confirmed every delegate-redirect path (`with`/`tap`, `rehydrate`, builder DSLs, DGM) funnels through those two setters, so the guard turns what was a @@ -570,9 +570,17 @@ development: into a field/property/index, returned, appended with `<<`, or placed in a collection literal) is kept as a class, moving the clearest delegate-risk cases from a runtime throw to a compile-time non-event. - -The remaining Groovy 7 work is the *capability/escape analysis* for the `@CompileStatic` automatic -path (proving packing sound so no annotation is needed) and typed static dispatch. +** the *decline diagnostics* — `@PackedClosures(mode = WARN | STRICT)` surfaces closures that could + not be packed (a compiler warning or error, with the reason and source position); `DISABLED` opts + a scope out entirely. The automatic flag path stays lenient. + +Also implemented and validated: the *capability analysis* (STC's delegate-independence proof driving +automatic packing under `@CompileStatic`, no annotation needed) and *typed static dispatch* +(statically-compiled hoisted bodies with typed captures/params/return — zero `invokedynamic`), with +compile-time packing exercised across the core module and several others. The remaining Groovy 7 +work is S3 object elision, unifying the closure and lambda writers, owner-correct retargeting so +nested closures can hoist, and hardening the automatic path from experimental (opt-in flag) to +default-on. === Measured impact
