12ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org// Copyright 2010 the V8 project authors. All rights reserved.
22ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org// Redistribution and use in source and binary forms, with or without
32ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org// modification, are permitted provided that the following conditions are
42ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org// met:
52ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org//
62ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org//     * Redistributions of source code must retain the above copyright
72ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org//       notice, this list of conditions and the following disclaimer.
82ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org//     * Redistributions in binary form must reproduce the above
92ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org//       copyright notice, this list of conditions and the following
102ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org//       disclaimer in the documentation and/or other materials provided
112ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org//       with the distribution.
122ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org//     * Neither the name of Google Inc. nor the names of its
132ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org//       contributors may be used to endorse or promote products derived
142ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org//       from this software without specific prior written permission.
152ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org//
162ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
172ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
182ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
192ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
202ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
212ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
222ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org
28b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org// Flags: --allow-natives-syntax
29b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org
302ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org// Test String.fromCharCode.
312ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org
32b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org// Test char codes larger than 0xffff.
33b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.orgvar expected = "";
34b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.orgfor (var i = 100; i < 500; i++) {
35b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org  expected += String.fromCharCode(i);
36b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org}
37b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org
38b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.orgfunction testCharCodeTruncation() {
39b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org  var result = "";
40b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org  for (var i = 0x100000 + 100; i < 0x100000 + 500; i++) {
41b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org    result += String.fromCharCode(i);
42b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org  }
43b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org  assertEquals(String.fromCharCode(0xFFFF), String.fromCharCode(0xFFFFFFFF));
44b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org  return result;
45b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org}
46b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org
47b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.orgassertEquals(expected, testCharCodeTruncation());
48b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.orgassertEquals(expected, testCharCodeTruncation());
49b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org%OptimizeFunctionOnNextCall(testCharCodeTruncation);
50b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.orgassertEquals(expected, testCharCodeTruncation());
512ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org
522ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org// Test various receivers and arguments passed to String.fromCharCode.
532ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org
542ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.orgObject.prototype.fromCharCode = function(x) { return this; };
552ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org
562ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.orgvar fcc = String.fromCharCode;
572ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.orgvar fcc2 = fcc;
582ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org
592ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.orgfunction constFun(x) { return function(y) { return x; }; }
602ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org
612ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.orgfunction test(num) {
622ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  assertEquals(" ", String.fromCharCode(0x20));
632ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  assertEquals(" ", String.fromCharCode(0x20 + 0x10000));
642ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  assertEquals(" ", String.fromCharCode(0x20 - 0x10000));
652ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  assertEquals(" ", String.fromCharCode(0x20 + 0.5));
662ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org
672ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  assertEquals("\u1234", String.fromCharCode(0x1234));
682ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  assertEquals("\u1234", String.fromCharCode(0x1234 + 0x10000));
692ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  assertEquals("\u1234", String.fromCharCode(0x1234 - 0x10000));
702ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  assertEquals("\u1234", String.fromCharCode(0x1234 + 0.5));
712ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org
722ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  assertEquals("  ", String.fromCharCode(0x20, 0x20));
732ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  assertEquals("  ", String.fromCharCode(0x20 + 0.5, 0x20));
742ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org
752ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  assertEquals(" ", fcc(0x20));
762ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  assertEquals(" ", fcc(0x20 + 0x10000));
772ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  assertEquals(" ", fcc(0x20 - 0x10000));
782ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  assertEquals(" ", fcc(0x20 + 0.5));
792ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org
802ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  assertEquals("\u1234", fcc(0x1234));
812ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  assertEquals("\u1234", fcc(0x1234 + 0x10000));
822ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  assertEquals("\u1234", fcc(0x1234 - 0x10000));
832ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  assertEquals("\u1234", fcc(0x1234 + 0.5));
842ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org
852ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  assertEquals("  ", fcc(0x20, 0x20));
862ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  assertEquals("  ", fcc(0x20 + 0.5, 0x20));
872ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org
882ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  var receiver = (num < 5) ? String : (num < 9) ? "dummy" : 42;
89160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  fcc2 = (num < 5) ? fcc
90160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org                   : (num < 9) ? constFun(Object("dummy"))
91160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org                               : constFun(Object(42));
92160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  var expected = (num < 5) ? " " : (num < 9) ? Object("dummy") : Object(42);
932ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  assertEquals(expected, receiver.fromCharCode(0x20));
942ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  assertEquals(expected, receiver.fromCharCode(0x20 - 0x10000));
952ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  assertEquals(expected, receiver.fromCharCode(0x20 + 0.5));
962ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  assertEquals(expected, fcc2(0x20));
972ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  assertEquals(expected, fcc2(0x20 - 0x10000));
982ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  assertEquals(expected, fcc2(0x20 + 0.5));
992ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org}
1002ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org
1012ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org// Use loop to test the custom IC.
1022ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.orgfor (var i = 0; i < 10; i++) {
1032ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  test(i);
1042ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org}
1052ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org
106a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.orgassertEquals("AAAA", String.fromCharCode(65, 65, 65, 65));
107a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.orgassertEquals("AAAA", String.fromCharCode(65, 65, 65, 65));
108a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org%OptimizeFunctionOnNextCall(String.fromCharCode);
109a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.orgassertEquals("AAAA", String.fromCharCode(65, 65, 65, 65));
1102ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org
1112ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org// Test the custom IC works correctly when the map changes.
1122ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.orgfor (var i = 0; i < 10; i++) {
1132ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  var expected = (i < 5) ? " " : 42;
1142ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  if (i == 5) String.fromCharCode = function() { return 42; };
1152ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  assertEquals(expected, String.fromCharCode(0x20));
1162ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org}
117