159151504615d929945dc59db37bf1166937748c6Steve Block// Copyright 2010 the V8 project authors. All rights reserved.
259151504615d929945dc59db37bf1166937748c6Steve Block// Redistribution and use in source and binary forms, with or without
359151504615d929945dc59db37bf1166937748c6Steve Block// modification, are permitted provided that the following conditions are
459151504615d929945dc59db37bf1166937748c6Steve Block// met:
559151504615d929945dc59db37bf1166937748c6Steve Block//
659151504615d929945dc59db37bf1166937748c6Steve Block//     * Redistributions of source code must retain the above copyright
759151504615d929945dc59db37bf1166937748c6Steve Block//       notice, this list of conditions and the following disclaimer.
859151504615d929945dc59db37bf1166937748c6Steve Block//     * Redistributions in binary form must reproduce the above
959151504615d929945dc59db37bf1166937748c6Steve Block//       copyright notice, this list of conditions and the following
1059151504615d929945dc59db37bf1166937748c6Steve Block//       disclaimer in the documentation and/or other materials provided
1159151504615d929945dc59db37bf1166937748c6Steve Block//       with the distribution.
1259151504615d929945dc59db37bf1166937748c6Steve Block//     * Neither the name of Google Inc. nor the names of its
1359151504615d929945dc59db37bf1166937748c6Steve Block//       contributors may be used to endorse or promote products derived
1459151504615d929945dc59db37bf1166937748c6Steve Block//       from this software without specific prior written permission.
1559151504615d929945dc59db37bf1166937748c6Steve Block//
1659151504615d929945dc59db37bf1166937748c6Steve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1759151504615d929945dc59db37bf1166937748c6Steve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1859151504615d929945dc59db37bf1166937748c6Steve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1959151504615d929945dc59db37bf1166937748c6Steve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2059151504615d929945dc59db37bf1166937748c6Steve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2159151504615d929945dc59db37bf1166937748c6Steve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2259151504615d929945dc59db37bf1166937748c6Steve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2359151504615d929945dc59db37bf1166937748c6Steve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2459151504615d929945dc59db37bf1166937748c6Steve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2559151504615d929945dc59db37bf1166937748c6Steve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2659151504615d929945dc59db37bf1166937748c6Steve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2759151504615d929945dc59db37bf1166937748c6Steve Block
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Flags: --allow-natives-syntax
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3059151504615d929945dc59db37bf1166937748c6Steve Block// Test String.fromCharCode.
3159151504615d929945dc59db37bf1166937748c6Steve Block
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test char codes larger than 0xffff.
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar expected = "";
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfor (var i = 100; i < 500; i++) {
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  expected += String.fromCharCode(i);
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction testCharCodeTruncation() {
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var result = "";
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (var i = 0x100000 + 100; i < 0x100000 + 500; i++) {
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result += String.fromCharCode(i);
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(String.fromCharCode(0xFFFF), String.fromCharCode(0xFFFFFFFF));
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(expected, testCharCodeTruncation());
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(expected, testCharCodeTruncation());
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch%OptimizeFunctionOnNextCall(testCharCodeTruncation);
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(expected, testCharCodeTruncation());
5159151504615d929945dc59db37bf1166937748c6Steve Block
5259151504615d929945dc59db37bf1166937748c6Steve Block// Test various receivers and arguments passed to String.fromCharCode.
5359151504615d929945dc59db37bf1166937748c6Steve Block
5459151504615d929945dc59db37bf1166937748c6Steve BlockObject.prototype.fromCharCode = function(x) { return this; };
5559151504615d929945dc59db37bf1166937748c6Steve Block
5659151504615d929945dc59db37bf1166937748c6Steve Blockvar fcc = String.fromCharCode;
5759151504615d929945dc59db37bf1166937748c6Steve Blockvar fcc2 = fcc;
5859151504615d929945dc59db37bf1166937748c6Steve Block
5959151504615d929945dc59db37bf1166937748c6Steve Blockfunction constFun(x) { return function(y) { return x; }; }
6059151504615d929945dc59db37bf1166937748c6Steve Block
6159151504615d929945dc59db37bf1166937748c6Steve Blockfunction test(num) {
6259151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals(" ", String.fromCharCode(0x20));
6359151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals(" ", String.fromCharCode(0x20 + 0x10000));
6459151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals(" ", String.fromCharCode(0x20 - 0x10000));
6559151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals(" ", String.fromCharCode(0x20 + 0.5));
6659151504615d929945dc59db37bf1166937748c6Steve Block
6759151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals("\u1234", String.fromCharCode(0x1234));
6859151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals("\u1234", String.fromCharCode(0x1234 + 0x10000));
6959151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals("\u1234", String.fromCharCode(0x1234 - 0x10000));
7059151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals("\u1234", String.fromCharCode(0x1234 + 0.5));
7159151504615d929945dc59db37bf1166937748c6Steve Block
7259151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals("  ", String.fromCharCode(0x20, 0x20));
7359151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals("  ", String.fromCharCode(0x20 + 0.5, 0x20));
7459151504615d929945dc59db37bf1166937748c6Steve Block
7559151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals(" ", fcc(0x20));
7659151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals(" ", fcc(0x20 + 0x10000));
7759151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals(" ", fcc(0x20 - 0x10000));
7859151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals(" ", fcc(0x20 + 0.5));
7959151504615d929945dc59db37bf1166937748c6Steve Block
8059151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals("\u1234", fcc(0x1234));
8159151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals("\u1234", fcc(0x1234 + 0x10000));
8259151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals("\u1234", fcc(0x1234 - 0x10000));
8359151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals("\u1234", fcc(0x1234 + 0.5));
8459151504615d929945dc59db37bf1166937748c6Steve Block
8559151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals("  ", fcc(0x20, 0x20));
8659151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals("  ", fcc(0x20 + 0.5, 0x20));
8759151504615d929945dc59db37bf1166937748c6Steve Block
8859151504615d929945dc59db37bf1166937748c6Steve Block  var receiver = (num < 5) ? String : (num < 9) ? "dummy" : 42;
89257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  fcc2 = (num < 5) ? fcc
90257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                   : (num < 9) ? constFun(Object("dummy"))
91257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                               : constFun(Object(42));
92257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  var expected = (num < 5) ? " " : (num < 9) ? Object("dummy") : Object(42);
9359151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals(expected, receiver.fromCharCode(0x20));
9459151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals(expected, receiver.fromCharCode(0x20 - 0x10000));
9559151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals(expected, receiver.fromCharCode(0x20 + 0.5));
9659151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals(expected, fcc2(0x20));
9759151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals(expected, fcc2(0x20 - 0x10000));
9859151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals(expected, fcc2(0x20 + 0.5));
9959151504615d929945dc59db37bf1166937748c6Steve Block}
10059151504615d929945dc59db37bf1166937748c6Steve Block
10159151504615d929945dc59db37bf1166937748c6Steve Block// Use loop to test the custom IC.
10259151504615d929945dc59db37bf1166937748c6Steve Blockfor (var i = 0; i < 10; i++) {
10359151504615d929945dc59db37bf1166937748c6Steve Block  test(i);
10459151504615d929945dc59db37bf1166937748c6Steve Block}
10559151504615d929945dc59db37bf1166937748c6Steve Block
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals("AAAA", String.fromCharCode(65, 65, 65, 65));
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals("AAAA", String.fromCharCode(65, 65, 65, 65));
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch%OptimizeFunctionOnNextCall(String.fromCharCode);
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals("AAAA", String.fromCharCode(65, 65, 65, 65));
11059151504615d929945dc59db37bf1166937748c6Steve Block
11159151504615d929945dc59db37bf1166937748c6Steve Block// Test the custom IC works correctly when the map changes.
11259151504615d929945dc59db37bf1166937748c6Steve Blockfor (var i = 0; i < 10; i++) {
11359151504615d929945dc59db37bf1166937748c6Steve Block  var expected = (i < 5) ? " " : 42;
11459151504615d929945dc59db37bf1166937748c6Steve Block  if (i == 5) String.fromCharCode = function() { return 42; };
11559151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals(expected, String.fromCharCode(0x20));
11659151504615d929945dc59db37bf1166937748c6Steve Block}
117