This is an automated email from the ASF dual-hosted git repository.
asf-gitbox-commits pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/groovy-dev-site.git
The following commit(s) were added to refs/heads/asf-site by this push:
new d9558c8b 2026/07/15 04:14:54: Generated dev website from
groovy-website@841c849
d9558c8b is described below
commit d9558c8b86d2d0c3f6336a44009b07596fb0d1b6
Author: jenkins <[email protected]>
AuthorDate: Wed Jul 15 04:14:54 2026 +0000
2026/07/15 04:14:54: Generated dev website from groovy-website@841c849
---
search/search-index.json | 2 +-
wiki/GEP-27.html | 27 +++++++++++++++++++++++----
2 files changed, 24 insertions(+), 5 deletions(-)
diff --git a/search/search-index.json b/search/search-index.json
index 10af223a..52b00c14 100644
--- a/search/search-index.json
+++ b/search/search-index.json
@@ -891,7 +891,7 @@
{
"id": "wiki/GEP-27.html",
"title": "The Apache Groovy programming language - Developer docs -
GEP-27",
- "content": "The Apache Groovy programming language - Developer docs -
GEP-27 Socialize Discuss on the mailing list Groovy on X Groovy on Bluesky
Groovy on Mastodon Groovy on LinkedIn Events and conferences Source code on
GitHub Report issues in Jira Stack Overflow questions Slack Community You are
using an outdated browser. Please upgrade your browser to improve your
experience. Apache Groovy™ Learn Documentation Download Support
Contribute Ecosystem Blog posts Socialize GE [...]
+ "content": "The Apache Groovy programming language - Developer docs -
GEP-27 Socialize Discuss on the mailing list Groovy on X Groovy on Bluesky
Groovy on Mastodon Groovy on LinkedIn Events and conferences Source code on
GitHub Report issues in Jira Stack Overflow questions Slack Community You are
using an outdated browser. Please upgrade your browser to improve your
experience. Apache Groovy™ Learn Documentation Download Support
Contribute Ecosystem Blog posts Socialize GE [...]
"url": "wiki/GEP-27.html",
"site": "dev"
},
diff --git a/wiki/GEP-27.html b/wiki/GEP-27.html
index 939a4881..d778c05a 100644
--- a/wiki/GEP-27.html
+++ b/wiki/GEP-27.html
@@ -679,6 +679,11 @@ a fine-grained <strong>opt-out</strong> that packs nothing
in its scope; the mos
<td class="tableblock halign-left valign-top"><p
class="tableblock">runtime</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">the
<em>invisible</em> wrong assumption — "did anyone misuse what I
packed?"</p></td>
</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p
class="tableblock"><code>PackedClosure</code> fails fast on serialization
(<code>writeObject</code>), naming the hoisted body and the opt-out</p></td>
+<td class="tableblock halign-left valign-top"><p
class="tableblock">runtime</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">the
<em>invisible</em> serialization route (a local later serialized, a callee that
serializes its argument); visible routes decline at compile time
instead</p></td>
+</tr>
</tbody>
</table>
<div class="paragraph">
@@ -687,6 +692,11 @@ closure literal that visibly escapes its method — stored
into a field/property
<code>static constraints = { … }</code> shape), returned, appended with
<code><<</code>, or placed in a collection literal
— is declined at compile time and kept as a class. This moves the clearest
delegate-risk cases from
a runtime throw to a compile-time non-event; those declines are also what
<code>WARN</code>/<code>STRICT</code> report.
+A sibling gate applies the same discipline to the serialization boundary: a
literal that is visibly
+serialization-bound — cast or coerced to a <code>Serializable</code> type, or
passed directly to a
+<code>writeObject</code> call — declines and keeps its class (so it serializes
as before), with transitive
+routes left to the adapter’s fail-fast <code>writeObject</code>, exactly
as transitive escapes are left to the
+delegate guard.
Because syntactic escape analysis cannot prove that, say, a custom
<code>each</code> does not set a delegate,
the runtime guard remains the essential backstop under dynamic compilation. (A
closure that is
fully self-contained — every free name binds to the owner or its own
parameters — is
@@ -1016,9 +1026,11 @@ display in variable views should be checked in IntelliJ
IDEA and Eclipse, and ag
expectations.</p>
</li>
<li>
-<p><strong>Serialization.</strong> Serializable closures/lambdas continue on
the class-based path in the first
-step; any future extension to hoist them must carry the
<code>$deserializeLambda$</code> machinery to the
-enclosing class (as Java does) and be validated for round-trip and
versioning.</p>
+<p><strong>Serialization.</strong> Serializable lambdas and visibly
serialization-bound closures continue on the
+class-based path (and so serialize as before); a packed closure serialized via
a transitive route
+fails fast with a message naming the closure and the opt-out. Any future
extension to hoist the
+serializable cases must carry the <code>$deserializeLambda$</code> machinery
to the enclosing class (as Java
+does) and be validated for round-trip and versioning.</p>
</li>
<li>
<p><strong>Stub generation / joint compilation and Groovydoc.</strong>
Synthetic hoisted methods must remain
@@ -1064,6 +1076,13 @@ correctly excluded from public-API views (Groovydoc, IDE
member lists, stub gene
<p>Because the hoisted body reuses the original AST statements, source
positions propagate
unchanged; there is no separate line-mapping step that could drift.</p>
</div>
+<div class="paragraph">
+<p>The packed-closure leg has the equivalent automated coverage
(<code>PackedClosureDebugMetadataTest</code>):
+line-number entries per body line and named locals — including captured values
(a written capture
+threaded as a shared <code>Reference</code> still appears under its original
name), typed and implicit-<code>it</code>
+parameters, and body locals — on the <code>$packed$closure$</code> methods
under both compilation modes, plus
+<code>ACC_SYNTHETIC</code> on the hoisted bodies and on all generated dispatch
machinery.</p>
+</div>
</div>
<div class="sect2">
<h3 id="_remaining_human_only_verification_cannot_be_scripted">Remaining
human-only verification (cannot be scripted)</h3>
@@ -1312,7 +1331,7 @@ stretch goal) builds on the shared backend proven in
phases 1–2; phases 4–5
<tr>
<td class="tableblock halign-left valign-top"><p
class="tableblock">Serializable closure/lambda hoisting</p></td>
<td class="tableblock halign-left valign-top"><p
class="tableblock">Deferred</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Kept on
the class-based path initially; hoisting them requires carrying the
deserialisation machinery to the enclosing class.</p></td>
+<td class="tableblock halign-left valign-top"><p
class="tableblock">Serializable lambdas and <em>visibly</em>
serialization-bound closures (cast/coerced to a <code>Serializable</code> type,
or passed directly to <code>writeObject</code>) are kept on the class-based
path; a packed closure reached by a transitive serialization route fails fast
at runtime with an actionable message. Hoisting the serializable cases would
require carrying the deserialisation machinery to the enclosing class.< [...]
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Packing
default-parameter (multi-arity) closures</p></td>