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