Commit f140841
committed
GROOVY-12269: Escape interpolation and line terminators in getOutputStatement
ScriptEngineFactory.getOutputStatement takes the text to display, which is
data, and Groovy renders it as a double-quoted literal escaping only the
quote and the backslash. Two characters were left to reach the generated
code unaltered:
- a dollar makes the literal an interpolating GString, so display text
containing ${...} is evaluated rather than printed, and a bare $name
leaks a binding;
- a line terminator ends the line, so display text spanning lines emits a
statement that does not compile at all.
Escape both, along with the carriage return. Other control characters such
as tab are legal inside a Groovy string literal and are left alone, so
output is unchanged for every input that already worked.
Nashorn is the precedent here: its factory had the same class of defect,
reported on nashorn-dev in January 2017 as producing a syntax error for
display text containing quotes, and was fixed by quoting the argument
rather than by reinterpreting it as code. Groovy had already chosen the
same reading by quoting and escaping at all; this completes it.
getProgram and getMethodCallSyntax take code by contract and are unchanged.
The factory's code-generating methods had no tests. The new ones assert the
emitted spelling for each escaped character, and separately evaluate the
generated statement and compare what it prints with the original text,
since displaying the text verbatim is the actual contract. Without the fix
the first fails on the dollar and the second fails to compile.1 parent e430766 commit f140841
2 files changed
Lines changed: 111 additions & 1 deletion
File tree
- subprojects/groovy-jsr223/src
- main/java/org/codehaus/groovy/jsr223
- test/groovy/org/codehaus/groovy/jsr223
Lines changed: 17 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
209 | 209 | | |
210 | 210 | | |
211 | 211 | | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
212 | 219 | | |
213 | 220 | | |
214 | | - | |
| 221 | + | |
215 | 222 | | |
216 | 223 | | |
217 | 224 | | |
| |||
227 | 234 | | |
228 | 235 | | |
229 | 236 | | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
230 | 246 | | |
231 | 247 | | |
232 | 248 | | |
| |||
Lines changed: 94 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
0 commit comments