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.

貢獻者指南