Discussion:
Nashorn StackOverflowError
(too old to reply)
Richard Tolbert
2018-05-30 06:01:51 UTC
Permalink
Nashorn throws a StackOverflowError if there are a few hundred if else
statements in a function.


function whyDoesThisThrowStackOverflowError(x) {
if (true) { print(x); }
else if (true) { print(x); }
else if (true) { print(x); }
else if (true) { print(x); }
else if (true) { print(x); }
else if (true) { print(x); }
else if (true) { print(x); }
else if (true) { print(x); }
else if (true) { print(x); }
else if (true) { print(x); }
<snip>
else if (true) { print(x); }
}

whyDoesThisThrowStackOverflowError(1);


java.lang.StackOverflowError
at jdk.nashorn.internal.parser.Lexer.valueOfIdent(Lexer.java:756)
at jdk.nashorn.internal.parser.Lexer.getValueOf(Lexer.java:1661)
at
jdk.nashorn.internal.parser.AbstractParser.getValue(AbstractParser.java:391)
at
jdk.nashorn.internal.parser.AbstractParser.getValue(AbstractParser.java:379)
at
jdk.nashorn.internal.parser.AbstractParser.expectValue(AbstractParser.java:366)
at
jdk.nashorn.internal.parser.AbstractParser.getIdent(AbstractParser.java:431)
at
jdk.nashorn.internal.parser.Parser.primaryExpression(Parser.java:1956)
at jdk.nashorn.internal.parser.Parser.memberExpression(Parser.java:2511)
at
jdk.nashorn.internal.parser.Parser.leftHandSideExpression(Parser.java:2372)
at jdk.nashorn.internal.parser.Parser.unaryExpression(Parser.java:3147)
at
jdk.nashorn.internal.parser.Parser.assignmentExpression(Parser.java:3353)
at jdk.nashorn.internal.parser.Parser.argumentList(Parser.java:2588)
at
jdk.nashorn.internal.parser.Parser.leftHandSideExpression(Parser.java:2375)
at jdk.nashorn.internal.parser.Parser.unaryExpression(Parser.java:3147)
at jdk.nashorn.internal.parser.Parser.expression(Parser.java:3282)
at
jdk.nashorn.internal.parser.Parser.expressionStatement(Parser.java:1150)
at jdk.nashorn.internal.parser.Parser.statement(Parser.java:967)
at jdk.nashorn.internal.parser.Parser.statement(Parser.java:863)
at jdk.nashorn.internal.parser.Parser.statementList(Parser.java:1013)
at jdk.nashorn.internal.parser.Parser.getBlock(Parser.java:531)
at jdk.nashorn.internal.parser.Parser.getStatement(Parser.java:555)
at jdk.nashorn.internal.parser.Parser.ifStatement(Parser.java:1187)
at jdk.nashorn.internal.parser.Parser.statement(Parser.java:890)
at jdk.nashorn.internal.parser.Parser.getStatement(Parser.java:560)
at jdk.nashorn.internal.parser.Parser.ifStatement(Parser.java:1192)
at jdk.nashorn.internal.parser.Parser.statement(Parser.java:890)
at jdk.nashorn.internal.parser.Parser.getStatement(Parser.java:560)
at jdk.nashorn.internal.parser.Parser.ifStatement(Parser.java:1192)
at jdk.nashorn.internal.parser.Parser.statement(Parser.java:890)
at jdk.nashorn.internal.parser.Parser.getStatement(Parser.java:560)
at jdk.nashorn.internal.parser.Parser.ifStatement(Parser.java:1192)
at jdk.nashorn.internal.parser.Parser.statement(Parser.java:890)
at jdk.nashorn.internal.parser.Parser.getStatement(Parser.java:560)
at jdk.nashorn.internal.parser.Parser.ifStatement(Parser.java:1192)
at jdk.nashorn.internal.parser.Parser.statement(Parser.java:890)
at jdk.nashorn.internal.parser.Parser.getStatement(Parser.java:560)
at jdk.nashorn.internal.parser.Parser.ifStatement(Parser.java:1192)
at jdk.nashorn.internal.parser.Parser.statement(Parser.java:890)
at jdk.nashorn.internal.parser.Parser.getStatement(Parser.java:560)
at jdk.nashorn.internal.parser.Parser.ifStatement(Parser.java:1192)
<snip>
Attila Szegedi
2018-05-30 13:37:47 UTC
Permalink
This is because the parser is recursively processing the if-else branches. This is one huge if statement. It's basically equivalent to

if (true) {
print(x);
} else {
if (true) {
print(x);
} else {
if (true) {
print(x);
} else {

}
}

so the parser code eventually exhausts the call stack. Try increasing -Xss setting on the JVM.
Post by Richard Tolbert
Nashorn throws a StackOverflowError if there are a few hundred if else
statements in a function.
function whyDoesThisThrowStackOverflowError(x) {
if (true) { print(x); }
else if (true) { print(x); }
else if (true) { print(x); }
else if (true) { print(x); }
else if (true) { print(x); }
else if (true) { print(x); }
else if (true) { print(x); }
else if (true) { print(x); }
else if (true) { print(x); }
else if (true) { print(x); }
<snip>
else if (true) { print(x); }
}
whyDoesThisThrowStackOverflowError(1);
java.lang.StackOverflowError
at jdk.nashorn.internal.parser.Lexer.valueOfIdent(Lexer.java:756)
at jdk.nashorn.internal.parser.Lexer.getValueOf(Lexer.java:1661)
at
jdk.nashorn.internal.parser.AbstractParser.getValue(AbstractParser.java:391)
at
jdk.nashorn.internal.parser.AbstractParser.getValue(AbstractParser.java:379)
at
jdk.nashorn.internal.parser.AbstractParser.expectValue(AbstractParser.java:366)
at
jdk.nashorn.internal.parser.AbstractParser.getIdent(AbstractParser.java:431)
at
jdk.nashorn.internal.parser.Parser.primaryExpression(Parser.java:1956)
at jdk.nashorn.internal.parser.Parser.memberExpression(Parser.java:2511)
at
jdk.nashorn.internal.parser.Parser.leftHandSideExpression(Parser.java:2372)
at jdk.nashorn.internal.parser.Parser.unaryExpression(Parser.java:3147)
at
jdk.nashorn.internal.parser.Parser.assignmentExpression(Parser.java:3353)
at jdk.nashorn.internal.parser.Parser.argumentList(Parser.java:2588)
at
jdk.nashorn.internal.parser.Parser.leftHandSideExpression(Parser.java:2375)
at jdk.nashorn.internal.parser.Parser.unaryExpression(Parser.java:3147)
at jdk.nashorn.internal.parser.Parser.expression(Parser.java:3282)
at
jdk.nashorn.internal.parser.Parser.expressionStatement(Parser.java:1150)
at jdk.nashorn.internal.parser.Parser.statement(Parser.java:967)
at jdk.nashorn.internal.parser.Parser.statement(Parser.java:863)
at jdk.nashorn.internal.parser.Parser.statementList(Parser.java:1013)
at jdk.nashorn.internal.parser.Parser.getBlock(Parser.java:531)
at jdk.nashorn.internal.parser.Parser.getStatement(Parser.java:555)
at jdk.nashorn.internal.parser.Parser.ifStatement(Parser.java:1187)
at jdk.nashorn.internal.parser.Parser.statement(Parser.java:890)
at jdk.nashorn.internal.parser.Parser.getStatement(Parser.java:560)
at jdk.nashorn.internal.parser.Parser.ifStatement(Parser.java:1192)
at jdk.nashorn.internal.parser.Parser.statement(Parser.java:890)
at jdk.nashorn.internal.parser.Parser.getStatement(Parser.java:560)
at jdk.nashorn.internal.parser.Parser.ifStatement(Parser.java:1192)
at jdk.nashorn.internal.parser.Parser.statement(Parser.java:890)
at jdk.nashorn.internal.parser.Parser.getStatement(Parser.java:560)
at jdk.nashorn.internal.parser.Parser.ifStatement(Parser.java:1192)
at jdk.nashorn.internal.parser.Parser.statement(Parser.java:890)
at jdk.nashorn.internal.parser.Parser.getStatement(Parser.java:560)
at jdk.nashorn.internal.parser.Parser.ifStatement(Parser.java:1192)
at jdk.nashorn.internal.parser.Parser.statement(Parser.java:890)
at jdk.nashorn.internal.parser.Parser.getStatement(Parser.java:560)
at jdk.nashorn.internal.parser.Parser.ifStatement(Parser.java:1192)
at jdk.nashorn.internal.parser.Parser.statement(Parser.java:890)
at jdk.nashorn.internal.parser.Parser.getStatement(Parser.java:560)
at jdk.nashorn.internal.parser.Parser.ifStatement(Parser.java:1192)
<snip>
Loading...