1// Copyright 2012 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// Flags: --expose-debug-as debug
29
30// Get the Debug object exposed from the debug context global object.
31Debug = debug.Debug
32
33var exception = null;
34var state = 1;
35var expected_source_line_text = null;
36var expected_function_name = null;
37
38// Simple debug event handler which first time will cause 'step in' action
39// to get into g.call and than check that execution is stopped inside
40// function 'g'.
41function listener(event, exec_state, event_data, data) {
42  try {
43    if (event == Debug.DebugEvent.Break) {
44      if (state == 1) {
45        exec_state.prepareStep(Debug.StepAction.StepIn, 2);
46        state = 2;
47      } else if (state == 2) {
48        assertEquals(expected_source_line_text,
49                     event_data.sourceLineText());
50        assertEquals(expected_function_name, event_data.func().name());
51        state = 3;
52      }
53    }
54  } catch(e) {
55    exception = e;
56  }
57};
58
59// Add the debug event listener.
60Debug.setListener(listener);
61
62
63var c = {
64  name: 'name ',
65  get getter1() {
66    return this.name;  // getter 1
67  },
68  get getter2() {
69    return {  // getter 2
70     'a': c.name
71    };
72  },
73  set setter1(n) {
74    this.name = n;  // setter 1
75  }
76};
77
78c.__defineGetter__('y', function getterY() {
79  return this.name;  // getter y
80});
81
82c.__defineGetter__(3, function getter3() {
83  return this.name;  // getter 3
84});
85
86c.__defineSetter__('y', function setterY(n) {
87  this.name = n;  // setter y
88});
89
90c.__defineSetter__(3, function setter3(n) {
91  this.name = n;  // setter 3
92});
93
94var d = {
95  'c': c,
96};
97
98function testGetter1_1() {
99  expected_function_name = 'getter1';
100  expected_source_line_text = '    return this.name;  // getter 1';
101  debugger;
102  var x = c.getter1;
103}
104
105function testGetter1_2() {
106  expected_function_name = 'getter1';
107  expected_source_line_text = '    return this.name;  // getter 1';
108  debugger;
109  var x = c['getter1'];
110}
111
112function testGetter1_3() {
113  expected_function_name = 'getter1';
114  expected_source_line_text = '    return this.name;  // getter 1';
115  for (var i = 1; i < 2; i++) {
116    debugger;
117    var x = c['getter' + i];
118  }
119}
120
121function testGetter1_4() {
122  expected_function_name = 'getter1';
123  expected_source_line_text = '    return this.name;  // getter 1';
124  debugger;
125  var x = d.c.getter1;
126}
127
128function testGetter1_5() {
129  expected_function_name = 'getter1';
130  expected_source_line_text = '    return this.name;  // getter 1';
131  for (var i = 2; i != 1; i--);
132  debugger;
133  var x = d.c['getter' + i];
134}
135
136function testGetter2_1() {
137  expected_function_name = 'getter2';
138  expected_source_line_text = '    return {  // getter 2';
139  for (var i = 2; i != 1; i--);
140  debugger;
141  var t = d.c.getter2.name;
142}
143
144
145function testGetterY_1() {
146  expected_function_name = 'getterY';
147  expected_source_line_text = '  return this.name;  // getter y';
148  debugger;
149  var t = d.c.y;
150}
151
152function testIndexedGetter3_1() {
153  expected_function_name = 'getter3';
154  expected_source_line_text = '  return this.name;  // getter 3';
155  debugger;
156  var r = d.c[3];
157}
158
159function testSetterY_1() {
160  expected_function_name = 'setterY';
161  expected_source_line_text = '  this.name = n;  // setter y';
162  debugger;
163  d.c.y = 'www';
164}
165
166function testIndexedSetter3_1() {
167  expected_function_name = 'setter3';
168  expected_source_line_text = '  this.name = n;  // setter 3';
169  var i = 3
170  debugger;
171  d.c[3] = 'www';
172}
173
174function testSetter1_1() {
175  expected_function_name = 'setter1';
176  expected_source_line_text = '    this.name = n;  // setter 1';
177  debugger;
178  d.c.setter1 = 'aa';
179}
180
181function testSetter1_2() {
182  expected_function_name = 'setter1';
183  expected_source_line_text = '    this.name = n;  // setter 1';
184  debugger;
185  d.c['setter1'] = 'bb';
186}
187
188function testSetter1_3() {
189  expected_function_name = 'setter1';
190  expected_source_line_text = '    this.name = n;  // setter 1';
191  for (var i = 2; i != 1; i--);
192  debugger;
193  d.c['setter' + i] = i;
194}
195
196var e = {
197  name: 'e'
198};
199e.__proto__ = c;
200
201function testProtoGetter1_1() {
202  expected_function_name = 'getter1';
203  expected_source_line_text = '    return this.name;  // getter 1';
204  debugger;
205  var x = e.getter1;
206}
207
208function testProtoSetter1_1() {
209  expected_function_name = 'setter1';
210  expected_source_line_text = '    this.name = n;  // setter 1';
211  debugger;
212  e.setter1 = 'aa';
213}
214
215function testProtoIndexedGetter3_1() {
216  expected_function_name = 'getter3';
217  expected_source_line_text = '  return this.name;  // getter 3';
218  debugger;
219  var x = e[3];
220}
221
222function testProtoIndexedSetter3_1() {
223  expected_function_name = 'setter3';
224  expected_source_line_text = '  this.name = n;  // setter 3';
225  debugger;
226  e[3] = 'new val';
227}
228
229function testProtoSetter1_2() {
230  expected_function_name = 'setter1';
231  expected_source_line_text = '    this.name = n;  // setter 1';
232  for (var i = 2; i != 1; i--);
233  debugger;
234  e['setter' + i] = 'aa';
235}
236
237for (var n in this) {
238  if (n.substr(0, 4) != 'test') {
239    continue;
240  }
241  state = 1;
242  this[n]();
243  assertNull(exception);
244  assertEquals(3, state);
245}
246
247// Get rid of the debug event listener.
248Debug.setListener(null);
249