tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

getter-setter-guards1.js (2252B)


      1 // Objects with same shape but different getter/setter.
      2 function testOwnProp() {
      3  var count = 0;
      4  var objects = [{get x() { count += 1; }, set x(v) { count += 2; }},
      5                 {get x() { count += 3; }, set x(v) { count += 4; }},
      6                 {get x() { count += 5; }, set x(v) { count += 6; }}];
      7  assertEq(shapeOf(objects[0]), shapeOf(objects[1]));
      8  assertEq(shapeOf(objects[0]), shapeOf(objects[2]));
      9  for (var i = 0; i < 150; i++) {
     10    var o = objects[i % objects.length];
     11    o.x++;
     12  }
     13  assertEq(count, 1050);
     14 }
     15 testOwnProp();
     16 
     17 // Ensure optimized TypedArray length properly deoptimizes when the getter is
     18 // redefined.
     19 function testTypedArrayLength() {
     20  var ta = new Int32Array(10);
     21  var lengthHolder = Object.getPrototypeOf(Int32Array.prototype);
     22  for (var i = 0; i < 150; i++) {
     23    assertEq(ta.length, i <= 100 ? 10 : (i <= 130 ? "foo" : "bar"));
     24    assertEq(ta.byteLength, 40);
     25    assertEq(ta.byteOffset, 0);
     26    if (i === 100) {
     27      var desc = Object.getOwnPropertyDescriptor(lengthHolder, "length");
     28      desc.get = () => "foo";
     29      Object.defineProperty(lengthHolder, "length", desc);
     30    }
     31    if (i === 130) {
     32      var desc = Object.getOwnPropertyDescriptor(lengthHolder, "length");
     33      desc.get = () => "bar";
     34      Object.defineProperty(lengthHolder, "length", desc);
     35    }
     36  }
     37 }
     38 testTypedArrayLength();
     39 
     40 // Native accessors on the global object. Redefine a few times and ensure the
     41 // right function is called. Use |useWindowProxy: false| to allow optimizing all
     42 // native getters.
     43 function testGlobalProp() {
     44  var g = newGlobal({useWindowProxy: false});
     45  g.evaluate("" + function test() {
     46    var arr = [Math, Object];
     47    var expected = 0;
     48    for (var i = 0; i < 150; i++) {
     49      assertEq(timesAccessed, i <= 100 ? i + 1 : (i > 130 ? Infinity : NaN));
     50      if (i === 100) {
     51        var desc = Object.getOwnPropertyDescriptor(this, "timesAccessed");
     52        desc.get = Math.abs;
     53        Object.defineProperty(this, "timesAccessed", desc);
     54      }
     55      if (i === 130) {
     56        var desc = Object.getOwnPropertyDescriptor(this, "timesAccessed");
     57        desc.get = Math.min;
     58        Object.defineProperty(this, "timesAccessed", desc);
     59      }
     60    }
     61  });
     62  g.evaluate("test()");
     63 }
     64 testGlobalProp();