google / closure-compiler

A JavaScript checker and optimizer.
https://developers.google.com/closure/compiler/
Apache License 2.0
7.4k stars 1.15k forks source link

Crash involving this inside arrow function inside for loop #1462

Closed ochafik closed 8 years ago

ochafik commented 8 years ago

Got this strangest crash (es6->es5 lowering), reduced to:

var i;
for (i = 0;;) (() => this)();

See crash live on appspot instance:

23: java.lang.RuntimeException: INTERNAL COMPILER ERROR.
Please report this problem.

Invalid attempt to remove node: NAME i 2 [source_file: Input_0] of ASSIGN 2 [source_file: Input_0]
  Node(NAME i): Input_0:2:5
for (i = 0;;) (() => this)();
  Parent(ASSIGN): Input_0:2:5
for (i = 0;;) (() => this)();

    at com.google.javascript.jscomp.NodeUtil.removeChild(NodeUtil.java:2341)
    at com.google.javascript.jscomp.UnreachableCodeElimination$EliminationPass.removeNode(UnreachableCodeElimination.java:259)
    at com.google.javascript.jscomp.UnreachableCodeElimination$EliminationPass.removeDeadExprStatementSafely(UnreachableCodeElimination.java:249)
    at com.google.javascript.jscomp.UnreachableCodeElimination$EliminationPass.visit(UnreachableCodeElimination.java:105)
    at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:625)
    at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:619)
    at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:619)
    at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:619)
    at com.google.javascript.jscomp.NodeTraversal.traverse(NodeTraversal.java:301)
    at com.google.javascript.jscomp.NodeTraversal.traverseEs6(NodeTraversal.java:568)
    at com.google.javascript.jscomp.UnreachableCodeElimination$1.enterFunction(UnreachableCodeElimination.java:82)
    at com.google.javascript.jscomp.NodeTraversal$1.shouldTraverse(NodeTraversal.java:545)
    at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:606)
    at com.google.javascript.jscomp.NodeTraversal.traverse(NodeTraversal.java:301)
    at com.google.javascript.jscomp.NodeTraversal.traverseEs6(NodeTraversal.java:568)
    at com.google.javascript.jscomp.NodeTraversal.traverseChangedFunctions(NodeTraversal.java:540)
    at com.google.javascript.jscomp.UnreachableCodeElimination.process(UnreachableCodeElimination.java:67)
    at com.google.javascript.jscomp.PhaseOptimizer$NamedPass.process(PhaseOptimizer.java:285)
    at com.google.javascript.jscomp.PhaseOptimizer$Loop.process(PhaseOptimizer.java:458)
    at com.google.javascript.jscomp.PhaseOptimizer.process(PhaseOptimizer.java:217)
    at com.google.javascript.jscomp.Compiler.optimize(Compiler.java:1886)
    at com.google.javascript.jscomp.Compiler.compileInternal(Compiler.java:705)
    at com.google.javascript.jscomp.Compiler.access$000(Compiler.java:85)
    at com.google.javascript.jscomp.Compiler$2.call(Compiler.java:656)
    at com.google.javascript.jscomp.Compiler$2.call(Compiler.java:653)
    at com.google.javascript.jscomp.CompilerExecutor.runInCompilerThread(CompilerExecutor.java:118)
    at com.google.javascript.jscomp.Compiler.runInCompilerThread(Compiler.java:679)
    at com.google.javascript.jscomp.Compiler.compile(Compiler.java:653)
    at com.google.javascript.jscomp.Compiler.compile(Compiler.java:623)
    at com.google.javascript.jscomp.webservice.backend.CompilerInvokerImpl.compile(CompilerInvokerImpl.java:46)
    at com.google.javascript.jscomp.webservice.backend.ServerController.executeRequest(ServerController.java:178)
    at com.google.javascript.jscomp.webservice.backend.CompilationRequestHandler.serviceParsedRequest(CompilationRequestHandler.java:180)
    at com.google.javascript.jscomp.webservice.backend.CompilationRequestHandler.service(CompilationRequestHandler.java:162)
    at com.google.javascript.jscomp.webservice.frontend.CompilationServlet.doPost(CompilationServlet.java:83)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
    at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:125)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:37)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.utils.servlet.JdbcMySqlConnectionCleanupFilter.doFilter(JdbcMySqlConnectionCleanupFilter.java:60)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:260)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
    at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:78)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:148)
    at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:469)
    at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:437)
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:444)
    at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:256)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:308)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:300)
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:441)
    at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:235)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalStateException: Invalid attempt to remove node: NAME i 2 [source_file: Input_0] of ASSIGN 2 [source_file: Input_0]
    ... 68 more

Original Post Data: 
output_format=json&output_info=compiled_code&output_info=warnings&output_info=errors&output_info=statistics&compilation_level=SIMPLE_OPTIMIZATIONS&warning_level=default&language_out=ES5&js_code=var%20i%3B%0Afor%20(i%20%3D%200%3B%3B)%20(()%20%3D%3E%20this)()%3B
MatrixFrog commented 8 years ago

There may be something wrong with the webservice right now. Are you seeing this when invoking the compiler from the command line too?

ochafik commented 8 years ago

Same crash in command-line (compiled from head)

MatrixFrog commented 8 years ago

It looks like some pass added an ASSIGN and forgot to wrap it in an EXPR_RESULT.

ochafik commented 8 years ago

Sweet, thanks!