Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Returning loop variables inside a object property getter causes crash #3599

Closed
merryman opened this issue May 22, 2020 · 3 comments
Closed
Assignees

Comments

@merryman
Copy link

I am able to reproduce this issue with the 20200517.0.0 version of the compiler.
I am also able to crash the service running on https://closure-compiler.appspot.com/ with this snippet.

I have not figured out exactly what causes the crash here but it seems like returning any const or let variables defined within the scope of a for loop within a dynamically defined property getter causes a crash:

// ==ClosureCompiler==
// @output_file_name default.js
// @language_out ecmascript5
// @compilation_level SIMPLE_OPTIMIZATIONS
// ==/ClosureCompiler==

for (let i = 0; i < 2; i++) {
   let bar = 42;
   let a = {
     get foo() {
      return bar; // <- this seems to cause the crash
     },
   };
}

I am also able to reproduce this very issue with "older" versions up until 20190618.0.0/.
I have not tested further though.

This is the crash dump I receive with the current version / the one hosted on https://closure-compiler.appspot.com/:

23: java.lang.IllegalStateException: Expected FUNCTION but was CALL. Reference node:
CALL 4 [length: 26] [free_call: 1] [source_file: Input_0]
    FUNCTION  4 [length: 26] [source_file: Input_0] [change_time: 3829]
        NAME  4 [length: 26] [source_file: Input_0]
        PARAM_LIST 4 [length: 26] [source_file: Input_0]
            NAME b 4 [length: 26] [source_file: Input_0] [constant_var_flags: 2]
        BLOCK 4 [length: 26] [source_file: Input_0]
            RETURN 4 [length: 26] [source_file: Input_0]
                FUNCTION  4 [length: 26] [source_file: Input_0] [change_time: 3830]
                    NAME  4 [length: 26] [source_file: Input_0]
                    PARAM_LIST 4 [length: 26] [source_file: Input_0]
                    BLOCK 4 [length: 26] [source_file: Input_0]
                        RETURN 5 [length: 11] [source_file: Input_0]
                            GETPROP 5 [length: 3] [source_file: Input_0]
                                NAME b 5 [length: 3] [source_file: Input_0]
                                STRING $jscomp$loop$prop$bar$1 5 [length: 3] [source_file: Input_0]
    NAME $jscomp$loop$0 4 [length: 26] [source_file: Input_0]

 Parent node:
GETTER_DEF foo 4 [length: 3] [source_file: Input_0]
    CALL 4 [length: 26] [free_call: 1] [source_file: Input_0]
        FUNCTION  4 [length: 26] [source_file: Input_0] [change_time: 3829]
            NAME  4 [length: 26] [source_file: Input_0]
            PARAM_LIST 4 [length: 26] [source_file: Input_0]
                NAME b 4 [length: 26] [source_file: Input_0] [constant_var_flags: 2]
            BLOCK 4 [length: 26] [source_file: Input_0]
                RETURN 4 [length: 26] [source_file: Input_0]
                    FUNCTION  4 [length: 26] [source_file: Input_0] [change_time: 3830]
                        NAME  4 [length: 26] [source_file: Input_0]
                        PARAM_LIST 4 [length: 26] [source_file: Input_0]
                        BLOCK 4 [length: 26] [source_file: Input_0]
                            RETURN 5 [length: 11] [source_file: Input_0]
                                GETPROP 5 [length: 3] [source_file: Input_0]
                                    NAME b 5 [length: 3] [source_file: Input_0]
                                    STRING $jscomp$loop$prop$bar$1 5 [length: 3] [source_file: Input_0]
        NAME $jscomp$loop$0 4 [length: 26] [source_file: Input_0]

	at com.google.javascript.jscomp.AstValidator$1.handleViolation(AstValidator.java:82)
	at com.google.javascript.jscomp.AstValidator.violation(AstValidator.java:1903)
	at com.google.javascript.jscomp.AstValidator.validateNodeType(AstValidator.java:1920)
	at com.google.javascript.jscomp.AstValidator.validateFunctionExpressionHelper(AstValidator.java:952)
	at com.google.javascript.jscomp.AstValidator.validateFunctionExpression(AstValidator.java:944)
	at com.google.javascript.jscomp.AstValidator.validateObjectLitGetKey(AstValidator.java:1661)
	at com.google.javascript.jscomp.AstValidator.validateObjectLitKey(AstValidator.java:1630)
	at com.google.javascript.jscomp.AstValidator.validateObjectLit(AstValidator.java:1623)
	at com.google.javascript.jscomp.AstValidator.validateExpression(AstValidator.java:389)
	at com.google.javascript.jscomp.AstValidator.validateNameDeclarationChild(AstValidator.java:1174)
	at com.google.javascript.jscomp.AstValidator.validateNameDeclarationHelper(AstValidator.java:1139)
	at com.google.javascript.jscomp.AstValidator.validateStatement(AstValidator.java:202)
	at com.google.javascript.jscomp.AstValidator.validateStatement(AstValidator.java:149)
	at com.google.javascript.jscomp.AstValidator.validateBlock(AstValidator.java:856)
	at com.google.javascript.jscomp.AstValidator.validateFor(AstValidator.java:1297)
	at com.google.javascript.jscomp.AstValidator.validateStatement(AstValidator.java:176)
	at com.google.javascript.jscomp.AstValidator.validateStatement(AstValidator.java:149)
	at com.google.javascript.jscomp.AstValidator.validateStatements(AstValidator.java:143)
	at com.google.javascript.jscomp.AstValidator.validateScript(AstValidator.java:132)
	at com.google.javascript.jscomp.AstValidator.validateCodeRoot(AstValidator.java:119)
	at com.google.javascript.jscomp.AstValidator.process(AstValidator.java:105)
	at com.google.javascript.jscomp.PhaseOptimizer$NamedPass.process(PhaseOptimizer.java:317)
	at com.google.javascript.jscomp.PhaseOptimizer.process(PhaseOptimizer.java:232)
	at com.google.javascript.jscomp.Compiler.performOptimizations(Compiler.java:2419)
	at com.google.javascript.jscomp.Compiler.lambda$stage2Passes$1(Compiler.java:804)
	at com.google.javascript.jscomp.CompilerExecutor.runInCompilerThread(CompilerExecutor.java:129)
	at com.google.javascript.jscomp.Compiler.runInCompilerThread(Compiler.java:831)
	at com.google.javascript.jscomp.Compiler.stage2Passes(Compiler.java:801)
	at com.google.javascript.jscomp.Compiler.compile(Compiler.java:691)
	at com.google.javascript.jscomp.webservice.backend.CompilerInvokerImpl.compile(CompilerInvokerImpl.java:44)
	at com.google.javascript.jscomp.webservice.backend.ServerController.executeRequest(ServerController.java:178)
	at com.google.javascript.jscomp.webservice.backend.CompilationRequestHandler.serviceParsedRequest(CompilationRequestHandler.java:178)
	at com.google.javascript.jscomp.webservice.backend.CompilationRequestHandler.service(CompilationRequestHandler.java:160)
	at com.google.javascript.jscomp.webservice.frontend.CompilationServlet.doPost(CompilationServlet.java:82)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:848)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1772)
	at com.google.apphosting.utils.servlet.JdbcMySqlConnectionCleanupFilter.doFilter(JdbcMySqlConnectionCleanupFilter.java:60)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1759)
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:582)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
	at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:524)
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134)
	at com.google.apphosting.runtime.jetty9.ParseBlobUploadHandler.handle(ParseBlobUploadHandler.java:119)
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1182)
	at com.google.apphosting.runtime.jetty9.AppEngineWebAppContext.doHandle(AppEngineWebAppContext.java:187)
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:512)
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1112)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
	at com.google.apphosting.runtime.jetty9.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:293)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134)
	at org.eclipse.jetty.server.Server.handle(Server.java:539)
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:333)
	at com.google.apphosting.runtime.jetty9.RpcConnection.handle(RpcConnection.java:213)
	at com.google.apphosting.runtime.jetty9.RpcConnector.serviceRequest(RpcConnector.java:81)
	at com.google.apphosting.runtime.jetty9.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:134)
	at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.dispatchServletRequest(JavaRuntime.java:757)
	at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.dispatchRequest(JavaRuntime.java:720)
	at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:690)
	at com.google.apphosting.runtime.JavaRuntime$NullSandboxRequestRunnable.run(JavaRuntime.java:882)
	at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:270)
	at java.lang.Thread.run(Thread.java:748)

@t-mangoe
Copy link

I have confirmed that the exception occurs in my local environment as well.
It appears that this occurs when the language-out option is ecmascript5 or ecmascript5_strict.

@lauraharker lauraharker self-assigned this May 12, 2023
@lauraharker
Copy link
Contributor

This problem seems to start happening after let/const transpilation in https://github.com/google/closure-compiler/blob/394a456cea8b42ed74af668afdc467bf3d5ba56c/src/com/google/javascript/jscomp/Es6RewriteBlockScopedDeclaration.java.

I've reproduced this in a unit test for that pass and am working on a fix.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants