• 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// Flags: --harmony-proxies
29
30
31// Helper.
32
33function TestWithProxies(test, x, y, z) {
34  test(function(h) { return new Proxy({}, h) }, x, y, z)
35  test(function(h) {
36      return new Proxy(function() {}, h)
37  }, x, y, z)
38}
39
40
41
42// Getting.
43
44function TestWithGet(handler) {
45  TestWithProxies(TestWithGet2, handler)
46}
47
48var c = "global"
49var key = ""
50
51function TestWithGet2(create, handler) {
52  var b = "local"
53
54  var p = create(handler);
55  assertEquals("onproxy", p.a);
56  assertEquals(undefined, p.b);
57  assertEquals(undefined, p.c);
58
59  with (p) {
60    assertEquals("onproxy", a);
61    assertEquals("local", b);
62    assertEquals("global", c);
63  }
64
65  var o = Object.create(p, {d: {value: "own"}})
66  with (o) {
67    assertEquals("onproxy", a)
68    assertEquals("local", b);
69    assertEquals("global", c)
70    assertEquals("own", d)
71  }
72}
73
74TestWithGet({
75  get(target, k) {
76    key = k;
77    return k === "a" ? "onproxy" : undefined
78  },
79  has(target, k) { return k === 'a' }
80})
81
82TestWithGet({
83  get: function(r, k) { return this.get2(r, k) },
84  get2: function(r, k) { key = k; return k === "a" ? "onproxy" : undefined },
85  has(target, k) { return k === 'a' }
86})
87
88
89
90
91// Invoking.
92
93function TestWithGetCall(handler) {
94  TestWithProxies(TestWithGetCall2, handler)
95}
96
97var receiver = null
98var c = function() { return "global" }
99
100function TestWithGetCall2(create, handler) {
101  var b = function() { return "local" }
102
103  var p = create(handler)
104  with (p) {
105    receiver = null
106    assertEquals("onproxy", a())
107    assertSame(p, receiver)
108    assertEquals("local", b())
109    assertEquals("global", c())
110  }
111
112  var o = Object.create(p, {d: {value: function() { return "own" }}})
113  with (o) {
114    receiver = null
115    assertEquals("onproxy", a())
116    assertSame(o, receiver)
117    assertEquals("local", b())
118    assertEquals("global", c())
119    assertEquals("own", d())
120  }
121}
122
123function onproxy() { receiver = this; return "onproxy" }
124
125TestWithGetCall({
126  get: function(r, k) { key = k; return k === "a" ? onproxy : undefined },
127  has: function(t, k) {
128    key = k;
129    return k === "a";
130  }
131})
132
133TestWithGetCall({
134  get: function(r, k) { return this.get2(r, k) },
135  get2: function(r, k) { key = k; return k === "a" ? onproxy : undefined },
136  has: function(t, k) {
137    key = k;
138    return k === "a";
139  }
140})
141
142TestWithGetCall({
143  get: function(r, k) { key = k; return k === "a" ? onproxy : undefined },
144  has: function(t, k) {
145    return this.has2(k)
146  },
147  has2: function(k) {
148    key = k;
149    return k === "a";
150  }
151})
152
153TestWithGetCall({
154  get: function(r, k) { key = k; return k === "a" ? onproxy : undefined },
155  has: function(t, k) {
156    key = k;
157    return k === "a";
158  }
159})
160
161
162function TestWithGetCallThrow(handler) {
163  TestWithProxies(TestWithGetCallThrow2, handler)
164}
165
166function TestWithGetCallThrow2(create, handler) {
167  var b = function() { return "local" }
168
169  var p = create(handler)
170  with (p) {
171    assertThrowsEquals(function(){ a() }, "myexn")
172    assertEquals("local", b())
173    assertEquals("global", c())
174  }
175
176  var o = Object.create(p, {d: {value: function() { return "own" }}})
177  with (o) {
178    assertThrowsEquals(function(){ a() }, "myexn")
179    assertEquals("local", b())
180    assertEquals("global", c())
181    assertEquals("own", d())
182  }
183}
184
185function onproxythrow() { throw "myexn" }
186
187TestWithGetCallThrow({
188  has: function(r, k) { return k === "a"; },
189  get: function(r, k) { key = k; return k === "a" ? onproxythrow : undefined },
190})
191
192TestWithGetCallThrow({
193  has: function(r, k) { return k === "a"; },
194  get: function(r, k) { return this.get2(r, k) },
195  get2: function(r, k) { key = k; return k === "a" ? onproxythrow : undefined },
196})
197
198
199
200// Setting.
201
202var key
203var val
204
205function TestWithSet(handler, hasSetter) {
206  TestWithProxies(TestWithSet2, handler, hasSetter)
207}
208
209var c = "global"
210
211function TestWithSet2(create, handler, hasSetter) {
212  var b = "local"
213
214  var p = create(handler)
215  key = val = undefined
216  with (p) {
217    a = "set"
218    assertEquals("a", key)
219    assertEquals("set", val)
220    assertEquals("local", b)
221    assertEquals("global", c)
222    b = "local"
223    c = "global"
224    assertEquals("a", key)
225    assertEquals("set", val)
226  }
227
228  if (!hasSetter) return
229
230  var o = Object.create(p, {d: {value: "own"}})
231  key = val = undefined
232  with (o) {
233    a = "set"
234    assertEquals("a", key)
235    assertEquals("set", val)
236    assertEquals("local", b)
237    assertEquals("global", c)
238    assertEquals("own", d)
239    b = "local"
240    c = "global"
241    d = "own"
242    assertEquals("a", key)
243    assertEquals("set", val)
244  }
245}
246
247TestWithSet({
248  set: function(r, k, v) { key = k; val = v; return true },
249  has: function(t, k) {
250    return k === "a"
251  }
252})
253
254TestWithSet({
255  set: function(r, k, v) { return this.set2(r, k, v) },
256  set2: function(r, k, v) { key = k; val = v; return true },
257  has: function(t, k) {
258    return k === "a"
259  }
260})
261
262TestWithSet({
263  has: function(t, k) {
264    return k === "a"
265  },
266  defineProperty: function(t, k, desc) { key = k; val = desc.value }
267})
268
269TestWithSet({
270  has: function(t, k) {
271    return this.has2(k)
272  },
273  has2: function(k) {
274    return k === "a"
275  },
276  defineProperty: function(t, k, desc) { this.defineProperty2(k, desc) },
277  defineProperty2: function(k, desc) { key = k; val = desc.value }
278})
279
280TestWithSet({
281  has: function(t, k) {
282    return k === "a"
283  },
284  defineProperty: function(t, k, desc) { key = k; val = desc.value }
285})
286
287TestWithSet({
288  has: function(t, k) {
289    return this.has2(k) },
290  has2: function(k) {
291    return k === "a"
292  },
293  set: function(t, k, v) { key = k; val = v; return true }
294}, true)
295
296TestWithSet({
297  has: function(t, k) {
298    return k === "a"
299  },
300  defineProperty: function(t, k, desc) { key = k; val = desc.value }
301})
302
303
304function TestWithSetThrow(handler, hasSetter) {
305  TestWithProxies(TestWithSetThrow2, handler, hasSetter)
306}
307
308function TestWithSetThrow2(create, handler, hasSetter) {
309  var p = create(handler)
310  assertThrowsEquals(function(){
311    with (p) {
312      a = 1
313    }
314  }, "myexn")
315
316  if (!hasSetter) return
317
318  var o = Object.create(p, {})
319  assertThrowsEquals(function(){
320    with (o) {
321      a = 1
322    }
323  }, "myexn")
324}
325
326TestWithSetThrow({
327  set: function() { throw "myexn" },
328  has: function(t, k) {
329    return k === "a"
330  }
331})
332
333TestWithSetThrow({
334  has: function() { throw "myexn" },
335})
336
337TestWithSetThrow({
338  has: function() { throw "myexn" },
339})
340
341TestWithSetThrow({
342  has: function(t, k) {
343    return k === "a"
344  },
345  defineProperty: function() { throw "myexn" }
346})
347
348TestWithSetThrow({
349  has: function(t, k) {
350    return k === "a"
351  },
352  set: function() { throw "myexn" }
353}, true)
354