facebookarchive/prepack

Eliminate unnecessary object allocations for residual functions

Open

#495 opened on May 2, 2017

View on GitHub
 (3 comments) (0 reactions) (1 assignee)JavaScript (520 forks)batch import
enhancementhelp wantedserializer

Repository metrics

Stars
 (14,268 stars)
PR merge metrics
 (No merged PRs in 30d)

Description

Prepacking

function() {
    function f() {
        let obj = { f: 42 };
        return function() { return obj.f; }
    }
    g = f();
})();

currently yields the following:

(function () {
    var _1 = {
        f: 42
    };

    function _0() {
        return _1.f;
    }

    g = _0;
})();

The object allocation for _1 is silly. #494 suggests delaying the allocation, but in this example, it could be completely eliminated. Prepack could generate the following code:

(function () {
    let _1_f = 42;
    function _0() {
        return _1_f;
    }

    g = _0;
})();

Or even better:

(function () {
    function _0() {
        return 42;
    }

    g = _0;
})();

If instead of 42 the field obj.f may either hold an object reference or may be mutated by the residual code, then another variable similar to _1 would be needed.

Contributor guide