instanceof.js 3.39 KB
Newer Older
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
// Copyright 2016 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Flags: --allow-natives-syntax

function A() {}
var a = new A();

var B = {
  [Symbol.hasInstance](o) {
    return false;
  }
};
%ToFastProperties(B.__proto__);

var C = Object.create({
  [Symbol.hasInstance](o) {
    return true;
  }
});
%ToFastProperties(C.__proto__);

var D = Object.create({
  [Symbol.hasInstance](o) {
    return o === a;
  }
});
%ToFastProperties(D.__proto__);

var E = Object.create({
  [Symbol.hasInstance](o) {
    if (o === a) throw o;
    return true;
  }
});
%ToFastProperties(E.__proto__);

function F() {}
F.__proto__ = null;

(function() {
  function foo(o) { return o instanceof A; }

45
  %PrepareFunctionForOptimization(foo);
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
  assertTrue(foo(a));
  assertTrue(foo(a));
  assertTrue(foo(new A()));
  %OptimizeFunctionOnNextCall(foo);
  assertTrue(foo(a));
  assertTrue(foo(new A()));
})();

(function() {
  function foo(o) {
    try {
      return o instanceof A;
    } catch (e) {
      return e;
    }
  }

63
  %PrepareFunctionForOptimization(foo);
64 65 66 67 68 69 70 71 72 73 74 75 76
  assertTrue(foo(a));
  assertTrue(foo(a));
  assertTrue(foo(new A()));
  assertEquals(1, foo(new Proxy({}, {getPrototypeOf() { throw 1; }})));
  %OptimizeFunctionOnNextCall(foo);
  assertTrue(foo(a));
  assertTrue(foo(new A()));
  assertEquals(1, foo(new Proxy({}, {getPrototypeOf() { throw 1; }})));
})();

(function() {
  function foo(o) { return o instanceof B; }

77
  %PrepareFunctionForOptimization(foo);
78 79 80 81 82 83 84 85 86 87 88
  assertFalse(foo(a));
  assertFalse(foo(a));
  assertFalse(foo(new A()));
  %OptimizeFunctionOnNextCall(foo);
  assertFalse(foo(a));
  assertFalse(foo(new A()));
})();

(function() {
  function foo(o) { return o instanceof C; }

89
  %PrepareFunctionForOptimization(foo);
90 91 92 93 94 95 96 97 98 99 100
  assertTrue(foo(a));
  assertTrue(foo(a));
  assertTrue(foo(new A()));
  %OptimizeFunctionOnNextCall(foo);
  assertTrue(foo(a));
  assertTrue(foo(new A()));
})();

(function() {
  function foo(o) { return o instanceof D; }

101
  %PrepareFunctionForOptimization(foo);
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
  assertTrue(foo(a));
  assertTrue(foo(a));
  assertFalse(foo(new A()));
  %OptimizeFunctionOnNextCall(foo);
  assertTrue(foo(a));
  assertFalse(foo(new A()));
})();

(function() {
  function foo(o) {
    try {
      return o instanceof E;
    } catch (e) {
      return false;
    }
  }

119
  %PrepareFunctionForOptimization(foo);
120 121 122 123 124 125 126 127 128 129 130 131
  assertFalse(foo(a));
  assertTrue(foo(new A()));
  %OptimizeFunctionOnNextCall(foo);
  assertFalse(foo(a));
  assertTrue(foo(new A()));
})();

(function() {
  function foo(o) {
    return o instanceof F;
  }

132
  %PrepareFunctionForOptimization(foo);
133 134 135 136 137 138 139 140
  assertFalse(foo(a));
  assertFalse(foo(new A()));
  assertTrue(foo(new F()));
  %OptimizeFunctionOnNextCall(foo);
  assertFalse(foo(a));
  assertFalse(foo(new A()));
  assertTrue(foo(new F()));
})();
141 142 143 144 145 146 147

(function() {
  function foo() {
    var a = new A();
    return a instanceof A;
  }

148
  %PrepareFunctionForOptimization(foo);
149 150 151 152 153
  assertTrue(foo());
  assertTrue(foo());
  %OptimizeFunctionOnNextCall(foo);
  assertTrue(foo());
})();
154 155 156 157 158 159 160 161 162 163 164 165

(function() {
  class B extends A {};

  function makeFoo() {
    return function foo(b) {
      return b instanceof B;
    }
  }
  makeFoo();
  const foo = makeFoo();

166
  %PrepareFunctionForOptimization(foo);
167 168 169 170 171 172
  assertTrue(foo(new B));
  assertFalse(foo(new A));
  %OptimizeFunctionOnNextCall(foo);
  assertTrue(foo(new B));
  assertFalse(foo(new A));
})();