facebookarchive/prepack

Eliminate branches in residual functions when the comparison value never leaks

Open

#1,146 创建于 2017年11月10日

在 GitHub 查看
 (1 评论) (0 反应) (0 负责人)JavaScript (520 fork)batch import
bootcampedenhancementhelp wantedlevel 3 (medium)react compilerserializer

仓库指标

Star
 (14,268 star)
PR 合并指标
 (30 天内没有已合并 PR)

描述

I'll just put this on the wish list.

(function() {
  const Foo = Symbol();
  const Bar = Symbol();
  reducer = function(action) {
    switch (action) {
      case Foo:
        console.log('foo');
        break;
      case Bar:
        console.log('bar');
        break;
    }
  };
  leak = Bar;
})();

should turn into:

(function () {
  var Bar = Symbol();
  reducer = function (action) {
    switch (action) {
      case Bar:
        console.log('bar');
        break;
    }
  };
  leak = Bar;
})();

Foo doesn't leak anywhere. Therefore it currently gets inlined to be created in the case statement producing a new Symbol every time. However, it should just dead code eliminate the whole conditional branch since it can never happen when the only remaining callsite is a condition.

贡献者指南