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