157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved. 257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// Redistribution and use in source and binary forms, with or without 357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// modification, are permitted provided that the following conditions are 457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// met: 557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// 657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// * Redistributions of source code must retain the above copyright 757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// notice, this list of conditions and the following disclaimer. 857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// * Redistributions in binary form must reproduce the above 957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// copyright notice, this list of conditions and the following 1057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// disclaimer in the documentation and/or other materials provided 1157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// with the distribution. 1257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// * Neither the name of Google Inc. nor the names of its 1357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// contributors may be used to endorse or promote products derived 1457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// from this software without specific prior written permission. 1557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// 1657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org 2857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// When calling user-defined accessors on strings, booleans or 29486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org// numbers, we should create a wrapper object in sloppy mode. 3057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org 3157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// Flags: --allow-natives-syntax 3257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org 3357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.orgfunction test(object, prototype) { 3457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org var result; 3557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org Object.defineProperty(prototype, "nonstrict", { 3657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org get: function() { result = this; }, 3757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org set: function(v) { result = this; } 3857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org }); 3957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org Object.defineProperty(prototype, "strict", { 4057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org get: function() { "use strict"; result = this; }, 4157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org set: function(v) { "use strict"; result = this; } 4257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org }); 4357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org 4457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org (function() { 4557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org function nonstrict(s) { 4657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org return s.nonstrict; 4757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org } 4857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org function strict(s) { 4957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org return s.strict; 5057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org } 5157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org 5257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org nonstrict(object); 5357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org nonstrict(object); 5457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org %OptimizeFunctionOnNextCall(nonstrict); 5557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org result = undefined; 5657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org nonstrict(object); 5757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org assertEquals("object", typeof result); 5857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org 5957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org strict(object); 6057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org strict(object); 6157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org %OptimizeFunctionOnNextCall(strict); 6257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org result = undefined; 6357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org strict(object); 6457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org assertEquals(typeof object, typeof result); 6557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org })(); 6657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org 6757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org (function() { 6857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org function nonstrict(s) { 6957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org return s.nonstrict = 10; 7057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org } 7157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org function strict(s) { 7257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org return s.strict = 10; 7357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org } 7457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org 7557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org nonstrict(object); 7657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org nonstrict(object); 7757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org %OptimizeFunctionOnNextCall(nonstrict); 7857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org result = undefined; 7957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org nonstrict(object); 8051e852008f9f67dbdbae7a40b8aa07fe5c76b45fmachenbach@chromium.org assertEquals("object", typeof result); 8157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org 8257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org strict(object); 8357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org strict(object); 8457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org %OptimizeFunctionOnNextCall(strict); 8557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org result = undefined; 8657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org strict(object); 8751e852008f9f67dbdbae7a40b8aa07fe5c76b45fmachenbach@chromium.org assertEquals(object, result); 8857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org })(); 8957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org} 9057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org 9157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.orgtest(1, Number.prototype); 9257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.orgtest("string", String.prototype); 9357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.orgtest(true, Boolean.prototype); 94