• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2011 the V8 project authors. All rights reserved.
2// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions are
4// met:
5//
6//     * Redistributions of source code must retain the above copyright
7//       notice, this list of conditions and the following disclaimer.
8//     * Redistributions in binary form must reproduce the above
9//       copyright notice, this list of conditions and the following
10//       disclaimer in the documentation and/or other materials provided
11//       with the distribution.
12//     * Neither the name of Google Inc. nor the names of its
13//       contributors may be used to endorse or promote products derived
14//       from this software without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28// Getting property names of an object with a prototype chain that
29// triggers dictionary elements in GetLocalPropertyNames() shouldn't
30// crash the runtime
31
32// Flags: --allow-natives-syntax
33
34function Object1() {
35  this.foo = 1;
36}
37
38function Object2() {
39  this.fuz = 2;
40  this.objects = new Object();
41  this.fuz1 = 2;
42  this.fuz2 = 2;
43  this.fuz3 = 2;
44  this.fuz4 = 2;
45  this.fuz5 = 2;
46  this.fuz6 = 2;
47  this.fuz7 = 2;
48  this.fuz8 = 2;
49  this.fuz9 = 2;
50  this.fuz10 = 2;
51  this.fuz11 = 2;
52  this.fuz12 = 2;
53  this.fuz13 = 2;
54  this.fuz14 = 2;
55  this.fuz15 = 2;
56  this.fuz16 = 2;
57  this.fuz17 = 2;
58  // Force dictionary-based properties
59  for (x=1;x<1000;x++) {
60    this["sdf" + x] = 2;
61  }
62}
63
64function Object3() {
65  this.boo = 3;
66}
67
68function Object4() {
69  this.baz = 4;
70}
71
72obj1 = new Object1();
73obj2 = new Object2();
74obj3 = new Object3();
75obj4 = new Object4();
76
77%SetHiddenPrototype(obj4, obj3);
78%SetHiddenPrototype(obj3, obj2);
79%SetHiddenPrototype(obj2, obj1);
80
81function contains(a, obj) {
82  for(var i = 0; i < a.length; i++) {
83    if(a[i] === obj){
84      return true;
85    }
86  }
87  return false;
88}
89names = %GetLocalPropertyNames(obj4);
90assertEquals(1021, names.length);
91assertTrue(contains(names, "baz"));
92assertTrue(contains(names, "boo"));
93assertTrue(contains(names, "foo"));
94assertTrue(contains(names, "fuz"));
95assertTrue(contains(names, "fuz1"));
96assertTrue(contains(names, "fuz2"));
97assertTrue(contains(names, "fuz3"));
98assertTrue(contains(names, "fuz4"));
99assertTrue(contains(names, "fuz5"));
100assertTrue(contains(names, "fuz6"));
101assertTrue(contains(names, "fuz7"));
102assertTrue(contains(names, "fuz8"));
103assertTrue(contains(names, "fuz9"));
104assertTrue(contains(names, "fuz10"));
105assertTrue(contains(names, "fuz11"));
106assertTrue(contains(names, "fuz12"));
107assertTrue(contains(names, "fuz13"));
108assertTrue(contains(names, "fuz14"));
109assertTrue(contains(names, "fuz15"));
110assertTrue(contains(names, "fuz16"));
111assertTrue(contains(names, "fuz17"));
112assertFalse(names[1020] == undefined);
113