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