Nashorn StackOverflowError

Attila Szegedi szegedia at gmail.com
Wed May 30 13:37:47 UTC 2018


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 <rictolbert30 at 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>



More information about the nashorn-dev mailing list