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. > On 2018. May 30., at 8:01, Richard Tolbert <rictolber...@gmail.com> wrote: > > 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>