closure-compiler icon indicating copy to clipboard operation
closure-compiler copied to clipboard

Closure internal error on '[].slice.call(arguments)'

Open juj opened this issue 1 month ago • 1 comments

From https://stackoverflow.com/a/960870 I randomly stumbled to using [].slice.call(arguments) to convert the old arguments object to an array (for use in scenarios where ES6 constructs are not allowed).

Though then got to see Closure compiler croak in that construct:

null
  Node(NAME arguments): C:/Users/clb/AppData/Local/Temp/emscripten_temp_9jd6b43i/a.out.jso1.js:158:31
      var args = [].slice.call(arguments);
  Parent(CALL): C:/Users/clb/AppData/Local/Temp/emscripten_temp_9jd6b43i/a.out.jso1.js:158:17
      var args = [].slice.call(arguments);

        at com.google.javascript.jscomp.Compiler.throwInternalError(Compiler.java:3282)
        at com.google.javascript.jscomp.NodeTraversal.throwUnexpectedException(NodeTraversal.java:516)
        at com.google.javascript.jscomp.NodeTraversal.traverse(NodeTraversal.java:536)
        at com.google.javascript.jscomp.NodeTraversal$Builder.traverse(NodeTraversal.java:472)
        at com.google.javascript.jscomp.NodeTraversal.traverse(NodeTraversal.java:542)
        at com.google.javascript.jscomp.OptimizeArgumentsArray.process(OptimizeArgumentsArray.java:98)
        at com.google.javascript.jscomp.PhaseOptimizer$NamedPass.process(PhaseOptimizer.java:240)
        at com.google.javascript.jscomp.PhaseOptimizer.process(PhaseOptimizer.java:179)
        at com.google.javascript.jscomp.Compiler.performTranspilationAndOptimizations(Compiler.java:2968)
        at com.google.javascript.jscomp.Compiler.lambda$stage2Passes$7(Compiler.java:1025)
        at com.google.javascript.jscomp.CompilerExecutor.lambda$runInCompilerThread$0(CompilerExecutor.java:100)
        at [email protected]/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at [email protected]/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
        at [email protected]/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
        at [email protected]/java.lang.Thread.run(Thread.java:833)
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:775)
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.windows.WindowsPlatformThreads.osThreadStartRoutine(WindowsPlatformThreads.java:178)
Caused by: java.lang.UnsupportedOperationException
        at com.google.common.collect.ImmutableCollection.add(ImmutableCollection.java:268)
        at com.google.javascript.jscomp.OptimizeArgumentsArray.visit(OptimizeArgumentsArray.java:141)
        at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:961)
        at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:951)
        at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:951)
        at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:951)
        at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:951)
        at com.google.javascript.jscomp.NodeTraversal.traverseFunction(NodeTraversal.java:1006)
        at com.google.javascript.jscomp.NodeTraversal.handleFunction(NodeTraversal.java:857)
        at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:903)
        at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:951)
        at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:951)
        at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:951)
        at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:951)
        at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:951)
        at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:951)
        at com.google.javascript.jscomp.NodeTraversal.traverseChildren(NodeTraversal.java:1134)
        at com.google.javascript.jscomp.NodeTraversal.handleScript(NodeTraversal.java:845)
        at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:900)
        at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:951)
        at com.google.javascript.jscomp.NodeTraversal.traverse(NodeTraversal.java:533)
        ... 14 more

juj avatar Nov 27 '25 13:11 juj

Hmm with further testing, it looks like the issue was not "just" [].slice.call(arguments), but the fact that it was enclosed in a () => {} lambda function. I.e. happens with

console.log("enabling remote stdio logging");
const origPrint = Module['print'];
const origPrintErr = Module['printErr'];

Module['print'] = () => {
  var args = Array.prototype.slice.call(arguments);
  origPrint && origPrint(args);
  reportStdoutToServer(args.join(' '));
};

Module['printErr'] = () => {
  var args = Array.prototype.slice.call(arguments);
  origPrintErr && origPrintErr([].slice.call(args));
  reportStderrToServer(args.join(' '));
};

Changing the () => {} to function() {} avoids the internal error.

juj avatar Nov 27 '25 13:11 juj