11845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved.
21845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be
31845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org// found in the LICENSE file.
41845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org
51845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org// Flags: --allow-natives-syntax
61845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org
71845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org// Test loading existent and nonexistent properties from dictionary
81845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org// mode objects.
91845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org
101845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.orgfunction SlowObject() {
111845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org  this.foo = 1;
121845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org  this.bar = 2;
131845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org  this.qux = 3;
141845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org  delete this.qux;
151845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org  assertFalse(%HasFastProperties(this));
161845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org}
171845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.orgfunction SlowObjectWithBaz() {
181845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org  var o = new SlowObject();
191845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org  o.baz = 4;
201845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org  return o;
211845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org}
221845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org
231845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.orgfunction Load(o) {
241845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org  return o.baz;
251845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org}
261845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org
271845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.orgfor (var i = 0; i < 10; i++) {
281845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org  var o1 = new SlowObject();
291845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org  var o2 = SlowObjectWithBaz();
301845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org  assertEquals(undefined, Load(o1));
311845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org  assertEquals(4, Load(o2));
321845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org}
331845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org
341845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org// Test objects getting optimized as fast prototypes.
351845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org
361845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.orgfunction SlowPrototype() {
371845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org  this.foo = 1;
381845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org}
391845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.orgSlowPrototype.prototype.bar = 2;
401845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.orgSlowPrototype.prototype.baz = 3;
411845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.orgdelete SlowPrototype.prototype.baz;
428640107360766c74218cf16d51b714b1f2138839machenbach@chromium.orgnew SlowPrototype;
431845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org
44e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org// Prototypes stay fast even after deleting properties.
45e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.orgassertTrue(%HasFastProperties(SlowPrototype.prototype));
461845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.orgvar fast_proto = new SlowPrototype();
471845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.orgassertTrue(%HasFastProperties(SlowPrototype.prototype));
481845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.orgassertTrue(%HasFastProperties(fast_proto.__proto__));
49