be0494ba5b
Adding properties to prototypes is faster when we don't force their maps into fast mode yet. Once a prototype shows up in the IC system, its setup phase is likely over, and it makes sense to transition it to fast properties. This patch speeds up the microbenchmark in the bug by 20x. Octane-Typescript sees a 3% improvement. BUG=chromium:607010 Review-Url: https://codereview.chromium.org/2036493006 Cr-Commit-Position: refs/heads/master@{#36828}
55 lines
1.4 KiB
JavaScript
55 lines
1.4 KiB
JavaScript
// Copyright 2014 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 loading existent and nonexistent properties from dictionary
|
|
// mode objects.
|
|
|
|
function SlowObject() {
|
|
this.foo = 1;
|
|
this.bar = 2;
|
|
this.qux = 3;
|
|
delete this.qux;
|
|
assertFalse(%HasFastProperties(this));
|
|
}
|
|
function SlowObjectWithBaz() {
|
|
var o = new SlowObject();
|
|
o.baz = 4;
|
|
return o;
|
|
}
|
|
|
|
function Load(o) {
|
|
return o.baz;
|
|
}
|
|
|
|
for (var i = 0; i < 10; i++) {
|
|
var o1 = new SlowObject();
|
|
var o2 = SlowObjectWithBaz();
|
|
assertEquals(undefined, Load(o1));
|
|
assertEquals(4, Load(o2));
|
|
}
|
|
|
|
// Test objects getting optimized as fast prototypes.
|
|
|
|
function SlowPrototype() {
|
|
this.foo = 1;
|
|
}
|
|
SlowPrototype.prototype.bar = 2;
|
|
SlowPrototype.prototype.baz = 3;
|
|
delete SlowPrototype.prototype.baz;
|
|
assertFalse(%HasFastProperties(SlowPrototype.prototype));
|
|
var slow_proto = new SlowPrototype;
|
|
// ICs make prototypes fast.
|
|
function ic() { return slow_proto.bar; }
|
|
ic();
|
|
ic();
|
|
assertTrue(%HasFastProperties(slow_proto.__proto__));
|
|
|
|
// Prototypes stay fast even after deleting properties.
|
|
assertTrue(%HasFastProperties(SlowPrototype.prototype));
|
|
var fast_proto = new SlowPrototype();
|
|
assertTrue(%HasFastProperties(SlowPrototype.prototype));
|
|
assertTrue(%HasFastProperties(fast_proto.__proto__));
|