blob: bd0319f13f895894932069430c12faf6a26318e2 [file] [log] [blame]
// Copyright 2019 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
const types = [
[Object, "{}"],
[String, "\"abc\""],
[RegExp, "/abc/"],
[WeakMap, "(new WeakMap())"],
[WeakSet, "(new WeakSet())"],
[Map, "(new Map())"],
[Set, "(new Set())"],
[Function, "(function f() {return 1})"],
[Array, "[1,2,3, {}]"],
[Boolean, "(new Boolean())"],
[Symbol, "(new Symbol())"],
[BigInt, "(new BigInt(42))"],
[Math, "Math"],
[Date, "(new Date())"],
[Promise, "(new Promise())"],
[Reflect, "Reflect"],
[Proxy, "(new Proxy({}, {}))"],
];
if (typeof Intl == "object") {
types.push([Intl, "Intl"]);
types.push([Intl.Collator, "Intl.Collator"]);
types.push([Intl.ListFormat, "Intl.ListFormat"]);
types.push([Intl.NumberFormat, "Intl.NumberFormat"]);
types.push([Intl.PluralRules, "Intl.PluralRules"]);
types.push([Intl.RelativeTimeFormat, "Intl.RelativeTimeFormat"]);
}
const callTemplate = () => {
function f() {
return constr_exp.propCall(args)
}
%PrepareFunctionForOptimization(f);
try { f(); } catch (e) {}
try { f(); } catch (e) {}
%OptimizeFunctionOnNextCall(f);
try { f(); } catch (e) {}
}
const mkCall = (constr_exp, propCall) => {
const arrowFunction = callTemplate.toString().replace("constr_exp", constr_exp).replace("propCall", propCall).replace("args", "");
return `(${arrowFunction})();`;
}
for ([type, constr_exp, blacklist] of types) {
const proto = type.prototype || type;
for (const f of Object.getOwnPropertyNames(proto)) {
const d = Object.getOwnPropertyDescriptor(proto, f);
if (d.get || d.set || (typeof proto[f]) != "function") continue;
const source = mkCall(constr_exp, f);
try {
eval(source);
} catch (err) {
// Exceptions are OK.
console.log(`EXN ${err} for ${type.toString()} ${f}`)
console.log(source);
continue;
}
}
}