Hmm, the formatting of the offered fix was mangled (had used a format which was obviously not o.k.). So here another attempt to present the code in a way that makes it hopefully easy to copy and paste (in a fixed pitch the ".replace(...)" invocations are aligned to the same column):
----- code ---- @Override // enquote string in double-quotes and escape the characters '\', '\n', '"' in the string public String getOutputStatement(final String toDisplay) { return "print(\"" + toDisplay.replace("\\", "\\\\") .replace("\n", "\\n" ) .replace("\"", "\\\"") + "\")"; } ----- code ---- ---rony On 05.11.2019 12:09, Rony G. Flatscher wrote: > Almost two years ago I brought up a bug in > NashornScriptEngineFactory.getOutputStatement(String). > Further attention obviously stopped with the question where an appropriate > place would be to file a > bug. > > The bug is caused by not quoting and escaping the passed string such that a > proper JavaScript > statement gets created, if the string contains e.g. comma or wrong characters > because they do not > get escaped. Currently > > nashornFractory.getOutputStatement("'hello world', this is \"Nashorn"\ > speaking! ") > > will yield > > print('hello world', this is "Nashorn" speaking! ) > > which is syntactically wrong and causes a ScriptException if executed by > Nashorn. > > Rather the returned statement in this case should be > > print("'hello world', this is \"Nashorn"\ speaking! ") > > --- > > Although I signed the OCA I have no rights to open a bug, so I kindly ask > someone with the power to > do so. > > Also, a possible, simple fix for getOutputStatement() in > jdk.nashorn.api.scripting.NashornScriptEngineFactory would be: > > @Override // enquote string in double-quotes and escape the characters > '\', '\n', '"' in the > string public String getOutputStatement(final String toDisplay) { return > "print(\"" + > toDisplay.replace("\\", "\\\\") .replace("\n", "\\n" ) .replace("\"", > "\\\"") + "\")"; } > > Again, having signed the OCA it should be o.k. to use this code directly to > fix the bug. > > If you prefer a patch, then please point me to the exact mercurial repository > I should check out in > order to produce the patch. (The original code is merely a one-liner: return > "print(" + toDisplay + > ")"; so it should be easy and safe to apply the above code directly.) > > ---rony ... cut ...