17028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org// Copyright 2011 the V8 project authors. All rights reserved.
27028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org// Redistribution and use in source and binary forms, with or without
37028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org// modification, are permitted provided that the following conditions are
47028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org// met:
57028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org//
67028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org//     * Redistributions of source code must retain the above copyright
77028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org//       notice, this list of conditions and the following disclaimer.
87028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org//     * Redistributions in binary form must reproduce the above
97028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org//       copyright notice, this list of conditions and the following
107028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org//       disclaimer in the documentation and/or other materials provided
117028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org//       with the distribution.
127028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org//     * Neither the name of Google Inc. nor the names of its
137028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org//       contributors may be used to endorse or promote products derived
147028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org//       from this software without specific prior written permission.
157028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org//
167028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
177028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
187028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
197028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
207028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
217028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
227028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
237028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
247028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
257028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
267028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
277028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
2812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Flags: --allow-natives-syntax --harmony-proxies
297028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
307028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org// Different ways to create an object.
317028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
327028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgfunction CreateFromLiteral() {
337028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  return {};
347028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org}
357028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
367028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgfunction CreateFromObject() {
377028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  return new Object;
387028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org}
397028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
407028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgfunction CreateDefault() {
417028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  return Object.create(Object.prototype);
427028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org}
437028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
447028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgfunction CreateFromConstructor(proto) {
457028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  function C() {}
467028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  (new C).b = 9;  // Make sure that we can have an in-object property.
477028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  C.prototype = proto;
487028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  return function() { return new C; }
497028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org}
507028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
517028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgfunction CreateFromApi(proto) {
527028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  return function() { return Object.create(proto); }
537028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org}
547028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
557028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgfunction CreateWithProperty(proto) {
567028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  function C() { this.a = -100; }
577028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  C.prototype = proto;
587028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  return function() { return new C; }
597028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org}
607028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
617028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgvar bases = [CreateFromLiteral, CreateFromObject, CreateDefault];
627028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgvar inherits = [CreateFromConstructor, CreateFromApi, CreateWithProperty];
637028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgvar constructs = [CreateFromConstructor, CreateFromApi];
647028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
657028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgfunction TestAllCreates(f) {
667028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  // The depth of the prototype chain up the.
677028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  for (var depth = 0; depth < 3; ++depth) {
687028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    // Introduce readonly-ness this far up the chain.
697028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    for (var up = 0; up <= depth; ++up) {
707028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      // Try different construction methods.
717028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      for (var k = 0; k < constructs.length; ++k) {
727028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org        // Construct a fresh prototype chain from above functions.
737028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org        for (var i = 0; i < bases.length; ++i) {
747028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org          var p = bases[i]();
757028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org          // There may be a preexisting property under the insertion point...
767028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org          for (var j = 0; j < depth - up; ++j) {
777028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org            p = inherits[Math.floor(inherits.length * Math.random())](p)();
787028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org          }
797028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org          // ...but not above it.
807028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org          for (var j = 0; j < up; ++j) {
817028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org            p = constructs[Math.floor(constructs.length * Math.random())](p)();
827028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org          }
837028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org          // Create a fresh constructor.
847028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org          var c = constructs[k](p);
857028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org          f(function() {
867028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org            var o = c();
877028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org            o.up = o;
887028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org            for (var j = 0; j < up; ++j) o.up = Object.getPrototypeOf(o.up);
897028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org            return o;
907028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org          })
917028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org        }
927028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      }
937028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    }
947028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  }
957028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org}
967028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
977028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
987028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org// Different ways to make a property read-only.
997028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
1007028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgfunction ReadonlyByNonwritableDataProperty(o, name) {
1017028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  Object.defineProperty(o, name, {value: -41, writable: false});
1027028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org}
1037028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
1047028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgfunction ReadonlyByAccessorPropertyWithoutSetter(o, name) {
1057028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  Object.defineProperty(o, name, {get: function() { return -42; }});
1067028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org}
1077028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
1087028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgfunction ReadonlyByGetter(o, name) {
1097028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  o.__defineGetter__("a", function() { return -43; });
1107028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org}
1117028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
1127028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgfunction ReadonlyByFreeze(o, name) {
1137028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  o[name] = -44;
1147028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  Object.freeze(o);
1157028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org}
1167028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
1177028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgfunction ReadonlyByProto(o, name) {
1187028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  var p = Object.create(o.__proto__);
1197028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  Object.defineProperty(p, name, {value: -45, writable: false});
1207028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  o.__proto__ = p;
1217028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org}
1227028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
123f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// Allow Proxy to be undefined, so test can run in non-Harmony mode as well.
124f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvar global = this;
125f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1267028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgfunction ReadonlyByProxy(o, name) {
127f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (!global.Proxy) return ReadonlyByFreeze(o, name);  // Dummy.
128f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  var p = global.Proxy.create({
1297028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    getPropertyDescriptor: function() {
1307028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      return {value: -46, writable: false, configurable: true};
1317028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    }
1327028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  });
1337028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  o.__proto__ = p;
1347028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org}
1357028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
1367028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgvar readonlys = [
1377028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  ReadonlyByNonwritableDataProperty, ReadonlyByAccessorPropertyWithoutSetter,
1387028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  ReadonlyByGetter, ReadonlyByFreeze, ReadonlyByProto, ReadonlyByProxy
1397028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org]
1407028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
1417028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgfunction TestAllReadonlys(f) {
1427028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  // Provide various methods to making a property read-only.
1437028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  for (var i = 0; i < readonlys.length; ++i) {
1447028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    print("  readonly =", i)
1457028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    f(readonlys[i]);
1467028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  }
1477028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org}
1487028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
1497028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
1507028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org// Different use scenarios.
1517028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
1527028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgfunction Assign(o, x) {
1537028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  o.a = x;
1547028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org}
1557028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
1567028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgfunction AssignStrict(o, x) {
1577028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  "use strict";
1587028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  o.a = x;
1597028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org}
1607028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
1617028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgfunction TestAllModes(f) {
1627028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  for (var strict = 0; strict < 2; ++strict) {
1637028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    print(" strict =", strict);
1647028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    f(strict);
1657028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  }
1667028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org}
1677028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
1687028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgfunction TestAllScenarios(f) {
1697028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  for (var t = 0; t < 100; t = 2*t + 1) {
1707028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    print("t =", t)
1717028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    f(function(strict, create, readonly) {
1727028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      // Make sure that the assignments are monomorphic.
1737028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      %DeoptimizeFunction(Assign);
1747028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      %DeoptimizeFunction(AssignStrict);
1757028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      %ClearFunctionTypeFeedback(Assign);
1767028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      %ClearFunctionTypeFeedback(AssignStrict);
1777028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      for (var i = 0; i < t; ++i) {
1787028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org        var o = create();
1797028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org        assertFalse("a" in o && !("a" in o.__proto__));
1807028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org        if (strict === 0)
1817028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org          Assign(o, i);
1827028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org        else
1837028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org          AssignStrict(o, i);
1847028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org        assertEquals(i, o.a);
1857028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      }
1867028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      %OptimizeFunctionOnNextCall(Assign);
1877028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      %OptimizeFunctionOnNextCall(AssignStrict);
1887028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      var o = create();
1897028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      assertFalse("a" in o && !("a" in o.__proto__));
1907028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      readonly(o.up, "a");
1917028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      assertTrue("a" in o);
1927028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      if (strict === 0)
1937028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org        Assign(o, t + 1);
1947028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      else
1957028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org        assertThrows(function() { AssignStrict(o, t + 1) }, TypeError);
1967028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      assertTrue(o.a < 0);
1977028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    });
1987028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  }
1997028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org}
2007028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
2017028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
2027028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org// Runner.
2037028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
2047028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgTestAllScenarios(function(scenario) {
2057028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  TestAllModes(function(strict) {
2067028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    TestAllReadonlys(function(readonly) {
2077028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      TestAllCreates(function(create) {
2087028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org        scenario(strict, create, readonly);
2097028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      });
2107028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    });
2117028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  });
2127028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org});
2137028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
2147028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
2157028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org// Extra test forcing bailout.
2167028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
2177028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgfunction Assign2(o, x) { o.a = x }
2187028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
2197028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org(function() {
2207028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  var p = CreateFromConstructor(Object.prototype)();
2217028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  var c = CreateFromConstructor(p);
2227028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  for (var i = 0; i < 3; ++i) {
2237028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    var o = c();
2247028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    Assign2(o, i);
2257028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    assertEquals(i, o.a);
2267028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  }
2277028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  %OptimizeFunctionOnNextCall(Assign2);
2287028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  ReadonlyByNonwritableDataProperty(p, "a");
2297028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  var o = c();
2307028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  Assign2(o, 0);
2317028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  assertTrue(o.a < 0);
2327028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org})();
233