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