15f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// Copyright 2010 the V8 project authors. All rights reserved. 25f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// Redistribution and use in source and binary forms, with or without 35f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// modification, are permitted provided that the following conditions are 45f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// met: 55f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// 65f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// * Redistributions of source code must retain the above copyright 75f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// notice, this list of conditions and the following disclaimer. 85f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// * Redistributions in binary form must reproduce the above 95f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// copyright notice, this list of conditions and the following 105f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// disclaimer in the documentation and/or other materials provided 115f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// with the distribution. 125f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// * Neither the name of Google Inc. nor the names of its 135f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// contributors may be used to endorse or promote products derived 145f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// from this software without specific prior written permission. 155f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// 165f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 175f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 185f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 195f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 205f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 215f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 225f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 235f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 245f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 265f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 285f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// Test the ToPrimitive internal function used by ToNumber/ToString. 295f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// Does it [[Get]] and [[Call]] the object's toString and valueOf properties 305f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// correctly. Specifically, does it call [[Get]] only once per property. 315f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 325f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvar o1 = { toString: function() { return 42; }, 335f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org valueOf: function() { return "37"; } }; 345f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvar n1 = Number(o1); 355f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvar s1 = String(o1); 365f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgassertTrue(typeof n1 == "number"); 375f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgassertTrue(typeof s1 == "string"); 385f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 395f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvar trace = []; 405f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvar valueOfValue = 42; 415f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvar toStringValue = "foo"; 425f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgfunction traceValueOf () { 435f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org trace.push("vo"); 445f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org return valueOfValue; 455f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org}; 465f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgfunction traceToString() { 475f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org trace.push("ts"); 485f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org return toStringValue; 495f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org}; 505f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvar valueOfFunc = traceValueOf; 515f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvar toStringFunc = traceToString; 525f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 535f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvar ot = { get toString() { trace.push("gts"); 545f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org return toStringFunc; }, 555f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org get valueOf() { trace.push("gvo"); 565f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org return valueOfFunc; } 575f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org}; 585f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 595f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvar nt = Number(ot); 605f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgassertEquals(42, nt); 615f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgassertEquals(["gvo","vo"], trace); 625f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 635f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgtrace = []; 645f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvar st = String(ot); 655f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgassertEquals("foo", st); 665f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgassertEquals(["gts","ts"], trace); 675f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 685f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgtrace = []; 695f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvalueOfValue = ["not primitive"]; 705f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvar nt = Number(ot); 715f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgassertEquals(Number("foo"), nt); 725f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgassertEquals(["gvo", "vo", "gts", "ts"], trace); 735f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 745f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgtrace = []; 755f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvalueOfValue = 42; 765f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgtoStringValue = ["not primitive"]; 775f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvar st = String(ot); 785f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgassertEquals(String(42), st); 795f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgassertEquals(["gts", "ts", "gvo", "vo"], trace); 805f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 815f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgtrace = []; 825f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvalueOfValue = ["not primitive"]; 835f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgassertThrows("Number(ot)", TypeError); 845f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgassertEquals(["gvo", "vo", "gts", "ts"], trace); 855f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 865f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 875f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgtoStringFunc = "not callable"; 885f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgtrace = []; 895f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvalueOfValue = 42; 905f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvar st = String(ot); 915f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgassertEquals(String(42), st); 925f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgassertEquals(["gts", "gvo", "vo"], trace); 935f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 945f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvalueOfFunc = "not callable"; 955f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgtrace = []; 965f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgassertThrows("String(ot)", TypeError); 975f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgassertEquals(["gts", "gvo"], trace); 985f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 995f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgtoStringFunc = traceToString; 1005f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgtoStringValue = "87"; 1015f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgtrace = []; 1025f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvar nt = Number(ot); 1035f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgassertEquals(87, nt); 1045f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgassertEquals(["gvo", "gts", "ts"], trace); 10531c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org 10631c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.orgassertThrows('Number(Symbol())', TypeError); 107