v8/test/mjsunit/dictionary-properties.js
jkummerow be0494ba5b Keep prototype maps in dictionary mode until ICs see them
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}
2016-06-08 14:43:47 +00:00

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__));