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