1911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org// Copyright 2008 the V8 project authors. All rights reserved. 2911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org// Redistribution and use in source and binary forms, with or without 3911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org// modification, are permitted provided that the following conditions are 4911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org// met: 5911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org// 6911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org// * Redistributions of source code must retain the above copyright 7911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org// notice, this list of conditions and the following disclaimer. 8911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org// * Redistributions in binary form must reproduce the above 9911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org// copyright notice, this list of conditions and the following 10911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org// disclaimer in the documentation and/or other materials provided 11911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org// with the distribution. 12911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org// * Neither the name of Google Inc. nor the names of its 13911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org// contributors may be used to endorse or promote products derived 14911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org// from this software without specific prior written permission. 15911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org// 16911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 28911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgfunction props(x) { 29911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org var array = []; 30911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org for (var p in x) array.push(p); 31911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org return array.sort(); 32911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org} 33911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 34911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgfunction f1() { 35911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org this.x = 1; 36911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org} 37911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 38911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgfunction f2(x) { 39911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org this.x = x; 40911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org} 41911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 42911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgfunction f3(x) { 43911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org this.x = x; 44911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org this.y = 1; 45911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org this.z = f1; 46911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org} 47911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 48911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgfunction f4(x) { 49911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org this.x = x; 50911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org this.y = 1; 51911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org if (x == 1) return; 52911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org this.z = f1; 53911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org} 54911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 55911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgo1_1 = new f1(); 5618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgassertEquals(1, o1_1.x, "1"); 57911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgo1_2 = new f1(); 5818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgassertEquals(1, o1_1.x, "2"); 5918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgassertArrayEquals(["x"], props(o1_1), "3"); 6018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgassertArrayEquals(["x"], props(o1_2), "4"); 61911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 62911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgo2_1 = new f2(0); 63911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgo2_2 = new f2(0); 64911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgassertArrayEquals(["x"], props(o2_1)); 65911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgassertArrayEquals(["x"], props(o2_2)); 66911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 67911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgo3_1 = new f3(0); 68911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgo3_2 = new f3(0); 69911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgassertArrayEquals(["x", "y", "z"], props(o3_1)); 70911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgassertArrayEquals(["x", "y", "z"], props(o3_2)); 71911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 72911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgo4_0_1 = new f4(0); 73911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgo4_0_2 = new f4(0); 74911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgassertArrayEquals(["x", "y", "z"], props(o4_0_1)); 75911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgassertArrayEquals(["x", "y", "z"], props(o4_0_2)); 76911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 77911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgo4_1_1 = new f4(1); 78911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgo4_1_2 = new f4(1); 79911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgassertArrayEquals(["x", "y"], props(o4_1_1)); 80911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgassertArrayEquals(["x", "y"], props(o4_1_2)); 8118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 8218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgfunction f5(x, y) { 8318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org this.x = x; 8418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org this.y = y; 8518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org} 8618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 8718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgfunction f6(x, y) { 8818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org this.y = y; 8918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org this.x = x; 9018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org} 9118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 9218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgfunction f7(x, y, z) { 9318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org this.x = x; 9418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org this.y = y; 9518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org} 9618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 9718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgfunction testArgs(fun) { 9818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org obj = new fun(); 9918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org assertArrayEquals(["x", "y"], props(obj)); 10018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org assertEquals(void 0, obj.x); 10118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org assertEquals(void 0, obj.y); 10218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 10318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org obj = new fun("x"); 10418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org assertArrayEquals(["x", "y"], props(obj)); 10518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org assertEquals("x", obj.x); 10618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org assertEquals(void 0, obj.y); 10718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 10818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org obj = new fun("x", "y"); 10918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org assertArrayEquals(["x", "y"], props(obj)); 11018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org assertEquals("x", obj.x); 11118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org assertEquals("y", obj.y); 11218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 11318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org obj = new fun("x", "y", "z"); 11418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org assertArrayEquals(["x", "y"], props(obj)); 11518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org assertEquals("x", obj.x); 11618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org assertEquals("y", obj.y); 11718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org} 11818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 11918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgfor (var i = 0; i < 10; i++) { 12018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org testArgs(f5); 12118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org testArgs(f6); 12218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org testArgs(f7); 12318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org} 12418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 12518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgfunction g(){ 12618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org this.x=1 12718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org} 12818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 12918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgo = new g(); 13018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgassertEquals(1, o.x); 13118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgo = new g(); 13218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgassertEquals(1, o.x); 13318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgg.prototype = {y:2} 13418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgo = new g(); 13518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgassertEquals(1, o.x); 13618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgassertEquals(2, o.y); 13718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgo = new g(); 13818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgassertEquals(1, o.x); 13918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgassertEquals(2, o.y); 140