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