facebookarchive/prepack

Bug in leaking logic in regards to bindings

trueadm opened this issue · 1 comments

Take the following case, it fails with the current logic.

function fn(items, abstractFunc) {
  var a = 10;
  var arr = Array.from(items);
  
  function fn2() {
    abstractFunc(function() {
      return a;
    });
  }

  var mapped = arr.map(function() {
    return fn2();
  });

  a = 11;

  return [a, mapped];
}

inspect = function() {
  var value;
  function mutateBinding(caller) {
    value = caller();
  }
  fn([1,2,3], mutateBinding);
  return value;
};

global.__optimize && __optimize(fn);

The output is incorrectly:

var fn;
(function () {
  var _$3 = this;

  var _$4 = _$3.Array;
  var _$5 = _$4.from;

  var _2 = function (items, abstractFunc) {
    var _9 = function () {
      var _E = function () {
        return 11;
      };

      var _$2 = abstractFunc(_E);

      return void 0;
    };

    var _$0 = _$5(items);

    var _$1 = _$0.map(_9);

    return [11, _$1];
  };

  var _6 = function () {
    var value;

    function mutateBinding(caller) {
      value = caller();
    }

    fn([1, 2, 3], mutateBinding);
    return value;
  };

  _$3.fn = _2;
  _$3.inspect = _6;
}).call(this);

Another failing case:

function fn(items, abstractFunc) {
  var a = 10;
  var b = function() {
    return a;
  };
  var arr = Array.from(items);
  
  function fn2() {
    abstractFunc(function() {
      return b;
    });
  }

  var mapped = arr.map(function() {
    return fn2();
  });

  b = function() {
    return 20;
  };

  return [b, mapped];
}

inspect = function() {
  var value;
  function mutateBinding(caller) {
    value = caller()();
  }
  fn([1,2,3], mutateBinding);
  return value;
};

global.__optimize && __optimize(fn);