777e142ca1
This introduces three new types OtherCallable, CallableProxy (and OtherProxy), and BoundFunction to make it possible to express Callable in the Type system. It also forces all undetectable receivers to be Callable, which matches the use case for undetectable, namely document.all (guarded by proper checks and tests). It also uses these new types to properly optimize instanceof (indirectly via OrdinaryHasInstance) based on the type of the constructor and the object. So we are able to constant-fold certain instanceof expressions based on types and completely avoid the builtin call. R=jarin@chromium.org BUG=v8:5267 Review-Url: https://codereview.chromium.org/2535753004 Cr-Commit-Position: refs/heads/master@{#41345}
19 lines
579 B
JavaScript
19 lines
579 B
JavaScript
// 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
|
|
|
|
var Foo = {
|
|
[Symbol.hasInstance]: Function.prototype[Symbol.hasInstance]
|
|
};
|
|
|
|
// TurboFan will optimize this to false via constant-folding the
|
|
// OrdinaryHasInstance call inside Function.prototype[@@hasInstance].
|
|
function foo() { return 1 instanceof Foo; }
|
|
|
|
assertEquals(false, foo());
|
|
assertEquals(false, foo());
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
assertEquals(false, foo());
|