Commit cb2864d
committed
GROOVY-12276: Extend the closure cycle check to the closures a wrapper calls
Closure.checkForReferenceCycle walks owner, delegate and thisObject, which
are the fields a closure dispatches through. A closure which wraps another
and invokes it recurses through its own field instead, so a forged graph
cycling there passed the check and then exhausted the stack on invocation.
Measured before the change, building each cycle by reflection, serializing
and reading it back:
CurriedClosure, cycle via owner rejected, InvalidObjectException
ComposedClosure, cycle via first/second accepted, then StackOverflowError
TrampolineClosure, cycle via original accepted, then StackOverflowError
ComposedClosure was the more surprising of the two: it already opts into the
check from its readResolve, so the check ran and had nothing to say about
the closure's own recursion. TrampolineClosure had no readResolve at all.
Add Closure.additionalReferences for a subclass to declare the closures it
calls through, and walk those as well. ComposedClosure declares first and
second; TrampolineClosure declares original and gains the readResolve it was
missing.
Only fields a closure calls belong there, which is why the walk is not
simply made reflective over every Closure-valued field: a captured closure
is not a recursion edge, and treating it as one would reject graphs that
invoke perfectly well.
The existing ComposedClosure cycle test forges its cycle through owner and
delegate, so it exercised the walk that already worked; the new tests forge
through the wrapped fields, and fail without this change.1 parent 389ab8c commit cb2864d
4 files changed
Lines changed: 145 additions & 2 deletions
File tree
- src
- main/java
- groovy/lang
- org/codehaus/groovy/runtime
- test/groovy/groovy/lang
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
56 | 56 | | |
57 | 57 | | |
58 | 58 | | |
| 59 | + | |
59 | 60 | | |
60 | 61 | | |
61 | 62 | | |
| |||
1466 | 1467 | | |
1467 | 1468 | | |
1468 | 1469 | | |
1469 | | - | |
| 1470 | + | |
| 1471 | + | |
| 1472 | + | |
| 1473 | + | |
1470 | 1474 | | |
1471 | 1475 | | |
1472 | 1476 | | |
1473 | | - | |
| 1477 | + | |
1474 | 1478 | | |
1475 | 1479 | | |
1476 | 1480 | | |
| |||
1480 | 1484 | | |
1481 | 1485 | | |
1482 | 1486 | | |
| 1487 | + | |
| 1488 | + | |
| 1489 | + | |
| 1490 | + | |
| 1491 | + | |
| 1492 | + | |
| 1493 | + | |
| 1494 | + | |
| 1495 | + | |
| 1496 | + | |
| 1497 | + | |
| 1498 | + | |
| 1499 | + | |
| 1500 | + | |
| 1501 | + | |
| 1502 | + | |
| 1503 | + | |
| 1504 | + | |
| 1505 | + | |
| 1506 | + | |
| 1507 | + | |
| 1508 | + | |
| 1509 | + | |
| 1510 | + | |
| 1511 | + | |
| 1512 | + | |
| 1513 | + | |
1483 | 1514 | | |
1484 | 1515 | | |
1485 | 1516 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
| 21 | + | |
21 | 22 | | |
22 | 23 | | |
23 | 24 | | |
| |||
43 | 44 | | |
44 | 45 | | |
45 | 46 | | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
46 | 66 | | |
47 | 67 | | |
48 | 68 | | |
| |||
Lines changed: 9 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
129 | 129 | | |
130 | 130 | | |
131 | 131 | | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
132 | 141 | | |
Lines changed: 83 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
45 | 45 | | |
46 | 46 | | |
47 | 47 | | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
48 | 64 | | |
49 | 65 | | |
50 | 66 | | |
| |||
96 | 112 | | |
97 | 113 | | |
98 | 114 | | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
99 | 150 | | |
100 | 151 | | |
101 | 152 | | |
| |||
120 | 171 | | |
121 | 172 | | |
122 | 173 | | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
123 | 184 | | |
124 | 185 | | |
125 | 186 | | |
| |||
136 | 197 | | |
137 | 198 | | |
138 | 199 | | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
139 | 222 | | |
140 | 223 | | |
141 | 224 | | |
| |||
0 commit comments