v8/test/mjsunit/regress/regress-5902.js
bmeurer 2de2840f2e [bootstrapper] Ensure RegExp constructor has fast properties.
Currently x instanceof RegExp checks cannot take the fast path, since
the RegExp constructor has dictionary properties. To avoid that, just
forcibly migrate the RegExp constructor to fast properties again once
it's fully setup in the bootstrapper. This yields a 10x improvement for
x instanceof RegExp checks.

R=yangguo@chromium.org
BUG=v8:5902

Review-Url: https://codereview.chromium.org/2786143004
Cr-Commit-Position: refs/heads/master@{#44316}
2017-03-31 18:27:30 +00:00

64 lines
1.7 KiB
JavaScript

// Copyright 2017 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 log = [];
function check(predicate, item) {
if (!predicate) log.push(item);
}
var global = this;
Object.getOwnPropertyNames(global).forEach(function(name) {
// Only check for global properties with uppercase names.
if (name[0] != name[0].toUpperCase()) return;
var obj = global[name];
// Skip non-receivers.
if (! % IsJSReceiver(obj)) return;
// Skip non-natives.
if (!obj.toString().includes('native')) return;
// Construct an instance.
try {
new obj();
} catch (e) {
}
// Check the object.
check(%HasFastProperties(obj), `${name}`);
// Check the constructor.
var constructor = obj.constructor;
if (!%IsJSReceiver(constructor)) return;
check(%HasFastProperties(constructor), `${name}.constructor`);
// Check the prototype.
var prototype = obj.prototype;
if (!%IsJSReceiver(prototype)) return;
check(%HasFastProperties(prototype), `${name}.prototype`);
// Check the prototype.constructor.
var prototype_constructor = prototype.constructor;
if (!%IsJSReceiver(prototype_constructor)) return;
check(
%HasFastProperties(prototype_constructor),
`${name}.prototype.constructor`);
});
// This is the current set of dictionary mode objects.
// Remove items as we fix them. See issue 5902.
assertEquals(
[
'Error.prototype',
'EvalError.prototype', 'RangeError.prototype', 'ReferenceError.prototype',
'SyntaxError.prototype', 'TypeError.prototype', 'URIError.prototype',
'Map', 'Map.prototype.constructor', 'Set', 'Set.prototype.constructor'
],
log);