google / closure-compiler

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

ExpressionDecomposer throws IllegalStateException: Object method calls can not be decomposed #3220

Open rohanpadhye opened 5 years ago

rohanpadhye commented 5 years ago

Fuzzing with JQF led to the following discovery:

o_0 => i_1 &= (undefined[(i_1 => { i_1 })(y_3)])(true)

Compiling with SIMPLE_OPTIMIZATIONS throws:

java.lang.IllegalStateException: Object method calls can not be decomposed.
    at com.google.common.base.Preconditions.checkState(Preconditions.java:507)
    at com.google.javascript.jscomp.ExpressionDecomposer.exposeExpression(ExpressionDecomposer.java:187)
    at com.google.javascript.jscomp.ExpressionDecomposer.exposeExpression(ExpressionDecomposer.java:127)
    at com.google.javascript.jscomp.ExpressionDecomposer.maybeExposeExpression(ExpressionDecomposer.java:109)
    at com.google.javascript.jscomp.FunctionInjector$CallSiteType$6.prepare(FunctionInjector.java:421)
    at com.google.javascript.jscomp.FunctionInjector.maybePrepareCall(FunctionInjector.java:498)
    at com.google.javascript.jscomp.InlineFunctions.decomposeExpressions(InlineFunctions.java:785)
    at com.google.javascript.jscomp.InlineFunctions.process(InlineFunctions.java:142)
    at com.google.javascript.jscomp.PhaseOptimizer$NamedPass.process(PhaseOptimizer.java:310)
    at com.google.javascript.jscomp.PhaseOptimizer$Loop.process(PhaseOptimizer.java:455)
    at com.google.javascript.jscomp.PhaseOptimizer.process(PhaseOptimizer.java:231)
    at com.google.javascript.jscomp.Compiler.performOptimizations(Compiler.java:2384)
    at com.google.javascript.jscomp.Compiler.lambda$stage2Passes$1(Compiler.java:795)
    at com.google.javascript.jscomp.CompilerExecutor$2.call(CompilerExecutor.java:102
...

Repro link(true))

tjgq commented 5 years ago

Created Google internal issue b/123528334