Bug in NashornScriptEngineFactory.getOutputStatement(...) with a possible fix (Re: Nashorn's javax.script.ScriptEngineFactory produces wrong code

Rony G. Flatscher Rony.Flatscher at wu.ac.at
Tue Nov 5 11:15:48 UTC 2019


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 ...


More information about the nashorn-dev mailing list