b014d0ba9c
This CL splits the TF type for JSFunction into CallableFunction and ClassConstructor. This differentiation allows us to lower calls to the CallFunction Builtin only for functions that we can actually call. Class Constructors are special, as they are callable but should raise an exception if called. By not lowering class constructors to calls to CallFunction (but the more generall Call) builtin, we can remove the checks for class constructors from CallFunction (in a follow-up CL). Bug: chromium:1262750 Change-Id: I399967eb03b2f20d2dcb67aef2243b32c9d3174e Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3350457 Reviewed-by: Nico Hartmann <nicohartmann@chromium.org> Commit-Queue: Patrick Thier <pthier@chromium.org> Cr-Commit-Position: refs/heads/main@{#78445}
37 lines
834 B
JavaScript
37 lines
834 B
JavaScript
// Copyright 2021 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
|
|
|
|
// Test calling a class constructor on a polymorphic object throws a TypeError.
|
|
function f(o) {
|
|
o.get();
|
|
}
|
|
|
|
let obj = new Map();
|
|
%PrepareFunctionForOptimization(f);
|
|
f(obj);
|
|
f(obj);
|
|
|
|
obj.get = class C {};
|
|
assertThrows(() => f(obj), TypeError);
|
|
%OptimizeFunctionOnNextCall(f);
|
|
assertThrows(() => f(obj), TypeError);
|
|
|
|
// Test calling a closure of a class constructor throws a TypeError.
|
|
function g(a) {
|
|
var f;
|
|
f = class {};
|
|
if (a == 1) {
|
|
f = function() {};
|
|
}
|
|
f();
|
|
}
|
|
|
|
%PrepareFunctionForOptimization(g);
|
|
assertThrows(g, TypeError);
|
|
assertThrows(g, TypeError);
|
|
%OptimizeFunctionOnNextCall(g);
|
|
assertThrows(g, TypeError);
|