summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/ion/testObjectHasPrototype.js
blob: 0fce075c5ba8227c39e90809f08ca98b3acaa0f0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
setJitCompilerOption("ion.warmup.trigger", 4);

var ObjectHasPrototype = getSelfHostedValue("ObjectHasPrototype");

var StringProto = String.prototype;
var ObjectProto = Object.prototype;

function testBasic() {
  var f = function() {
    assertEq(ObjectHasPrototype(StringProto, ObjectProto), true);
  };
  for (var i = 0; i < 40; i++) {
    f();
  }
}
testBasic();

function testProtoChange(proto) {
  var f = function(expected) {
    assertEq(ObjectHasPrototype(StringProto, ObjectProto), expected);
  };
  var expected = true;
  for (var i = 0; i < 120; i++) {
    f(expected);
    if (i == 40) {
      Object.setPrototypeOf(StringProto, proto);
      expected = false;
    }
    if (i == 80) {
      Object.setPrototypeOf(StringProto, ObjectProto);
      expected = true;
    }
  }
}
testProtoChange(null);
// Different singleton
testProtoChange(Function.prototype);
// native non-singleton
testProtoChange(/a/);
// non-native non-singleton
testProtoChange({});

var Int32ArrayProto = Int32Array.prototype;
var TypedArrayProto = Object.getPrototypeOf(Int32ArrayProto);
function testProtoProtoChange(proto) {
  var f = function() {
    assertEq(ObjectHasPrototype(Int32ArrayProto, TypedArrayProto), true);
  };
  for (var i = 0; i < 120; i++) {
    f();
    if (i == 40)
      Object.setPrototypeOf(TypedArrayProto, proto);
    if (i == 80)
      Object.setPrototypeOf(TypedArrayProto, Object);
  }
}
testProtoProtoChange(null);
// Different singleton
testProtoProtoChange(Function.prototype);
// native non-singleton
testProtoProtoChange(/a/);
// non-native non-singleton
testProtoProtoChange({});