blob: 085ad61387aa8ffdef476a49225d0bff26ea87cd [file] [log] [blame]
// Copyright 2018 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
// Without instance creation:
(function() {
function* Goo() {};
const goo = {};
function IsGoo(x) {
return x instanceof Goo;
}
%PrepareFunctionForOptimization(IsGoo);
assertFalse(IsGoo(goo));
assertFalse(IsGoo(goo));
%OptimizeFunctionOnNextCall(IsGoo);
assertFalse(IsGoo(goo));
})();
(function() {
function* Goo() {};
const goo = {};
Goo.prototype = Object.prototype;
function IsGoo(x) {
return x instanceof Goo;
}
%PrepareFunctionForOptimization(IsGoo);
assertTrue(IsGoo(goo));
assertTrue(IsGoo(goo));
%OptimizeFunctionOnNextCall(IsGoo);
assertTrue(IsGoo(goo));
})();
(function() {
function* Goo() {};
const goo = {};
Goo.prototype = 42
function IsGoo(x) {
return x instanceof Goo;
}
%PrepareFunctionForOptimization(IsGoo);
assertThrows(_ => IsGoo(goo), TypeError);
assertThrows(_ => IsGoo(goo), TypeError);
%OptimizeFunctionOnNextCall(IsGoo);
assertThrows(_ => IsGoo(goo), TypeError);
})();
(function() {
function* Goo() {};
const goo = {};
function IsGoo(x) {
return x instanceof Goo;
}
%PrepareFunctionForOptimization(IsGoo);
assertFalse(IsGoo(goo));
assertFalse(IsGoo(goo));
%OptimizeFunctionOnNextCall(IsGoo);
assertFalse(IsGoo(goo));
Goo.prototype = Object.prototype;
assertTrue(IsGoo(goo));
})();
(function() {
function* Goo() {};
const goo = {};
function IsGoo(x) {
return x instanceof Goo;
}
%PrepareFunctionForOptimization(IsGoo);
assertFalse(IsGoo(goo));
assertFalse(IsGoo(goo));
%OptimizeFunctionOnNextCall(IsGoo);
assertFalse(IsGoo(goo));
Goo.prototype = 42;
assertThrows(_ => IsGoo(goo), TypeError);
})();
// With instance creation:
(function() {
function* Goo() {};
const goo = Goo();
function IsGoo(x) {
return x instanceof Goo;
}
%PrepareFunctionForOptimization(IsGoo);
assertTrue(IsGoo(goo));
assertTrue(IsGoo(goo));
%OptimizeFunctionOnNextCall(IsGoo);
assertTrue(IsGoo(goo));
})();
(function() {
function* Goo() {};
const goo = Goo();
Goo.prototype = {};
function IsGoo(x) {
return x instanceof Goo;
}
%PrepareFunctionForOptimization(IsGoo);
assertFalse(IsGoo(goo));
assertFalse(IsGoo(goo));
%OptimizeFunctionOnNextCall(IsGoo);
assertFalse(IsGoo(goo));
})();
(function() {
function* Goo() {};
const goo = Goo();
Goo.prototype = 42;
function IsGoo(x) {
return x instanceof Goo;
}
%PrepareFunctionForOptimization(IsGoo);
assertThrows(_ => IsGoo(goo), TypeError);
assertThrows(_ => IsGoo(goo), TypeError);
%OptimizeFunctionOnNextCall(IsGoo);
assertThrows(_ => IsGoo(goo), TypeError);
})();
(function() {
function* Goo() {};
const goo = Goo();
function IsGoo(x) {
return x instanceof Goo;
}
%PrepareFunctionForOptimization(IsGoo);
assertTrue(IsGoo(goo));
assertTrue(IsGoo(goo));
%OptimizeFunctionOnNextCall(IsGoo);
assertTrue(IsGoo(goo));
Goo.prototype = {};
assertFalse(IsGoo(goo));
})();
(function() {
function* Goo() {};
const goo = Goo();
function IsGoo(x) {
return x instanceof Goo;
}
%PrepareFunctionForOptimization(IsGoo);
assertTrue(IsGoo(goo));
assertTrue(IsGoo(goo));
%OptimizeFunctionOnNextCall(IsGoo);
assertTrue(IsGoo(goo));
Goo.prototype = 42
assertThrows(_ => IsGoo(goo), TypeError);
})();
(function() {
function* Goo() {};
Goo.prototype = 42;
const goo = Goo();
function IsGoo(x) {
return x instanceof Goo;
}
%PrepareFunctionForOptimization(IsGoo);
assertThrows(_ => IsGoo(goo), TypeError);
assertThrows(_ => IsGoo(goo), TypeError);
%OptimizeFunctionOnNextCall(IsGoo);
assertThrows(_ => IsGoo(goo), TypeError);
Goo.prototype = {};
assertFalse(IsGoo(goo));
})();
(function() {
function* Goo() {};
Goo.prototype = 42;
const goo = Goo();
Goo.prototype = {};
function IsGoo(x) {
return x instanceof Goo;
}
%PrepareFunctionForOptimization(IsGoo);
assertFalse(IsGoo(goo));
assertFalse(IsGoo(goo));
%OptimizeFunctionOnNextCall(IsGoo);
assertFalse(IsGoo(goo));
Goo.prototype = Object.prototype;
assertTrue(IsGoo(goo));
})();
(function() {
function* Goo() {};
Goo.prototype = {};
const goo = Goo();
Goo.prototype = 42;
function IsGoo(x) {
return x instanceof Goo;
}
%PrepareFunctionForOptimization(IsGoo);
assertThrows(_ => IsGoo(goo), TypeError);
assertThrows(_ => IsGoo(goo), TypeError);
%OptimizeFunctionOnNextCall(IsGoo);
assertThrows(_ => IsGoo(goo), TypeError);
Goo.prototype = Object.prototype;
assertTrue(IsGoo(goo));
})();
(function() {
function* Goo() {};
Goo.prototype = {};
const goo = Goo();
Goo.prototype = {};
function IsGoo(x) {
return x instanceof Goo;
}
%PrepareFunctionForOptimization(IsGoo);
assertFalse(IsGoo(goo));
assertFalse(IsGoo(goo));
%OptimizeFunctionOnNextCall(IsGoo);
Goo.prototype = Object.prototype;
assertTrue(IsGoo(goo));
})();