1// Copyright 2015 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Flags: --expose-debug-as debug --harmony-proxies
6
7Debug = debug.Debug
8
9var exception = null;
10var log = [];
11
12function listener(event, exec_state, event_data, data) {
13  if (event != Debug.DebugEvent.Break) return;
14  try {
15    print(event_data.sourceLineText());
16    var entry = "";
17    for (var i = 0; i < exec_state.frameCount(); i++) {
18      entry += exec_state.frame(i).sourceLineText().substr(-1);
19      entry += exec_state.frame(i).sourceColumn();
20    }
21    log.push(entry);
22    exec_state.prepareStep(Debug.StepAction.StepIn);
23  } catch (e) {
24    exception = e;
25  }
26};
27
28var target = {};
29var handler = {
30  has: function(target, name) {
31    return true;                     // h
32  },                                 // i
33  get: function(target, name) {
34    return 42;                       // j
35  },                                 // k
36  set: function(target, name, value) {
37    return false;                    // l
38  },                                 // m
39  enumerate: function(target) {
40    function* keys() {               // n
41      yield "foo";                   // o
42      yield "bar";                   // p
43    }                                // q
44    return keys();                   // r
45  },                                 // s
46}
47
48var proxy = new Proxy(target, handler);
49
50Debug.setListener(listener);
51debugger;                            // a
52var has = "step" in proxy;           // b
53var get = proxy.step;                // c
54proxy.step = 43;                     // d
55for (var i in proxy) {               // e
56  log.push(i);                       // f
57}
58
59Debug.setListener(null);             // g
60
61assertNull(exception);
62assertTrue(has);
63assertEquals(42, get);
64
65assertEquals([
66  "a0",
67  "b0", "h4b20", "i2b20",                           // [[Has]]
68  "c0", "j4c15", "k2c15",                           // [[Get]]
69  "d0", "l4d11", "m2d11",                           // [[Set]]
70  "e14", "r4e14", "q4r11e14", "s2e14",              // for-in [[Enumerate]]
71      "o6e14", "q4e14", "p6e14", "q4e14", "q4e14",  // exhaust iterator
72  "e9",                                             // for-in-body
73      "h4e9","i2e9",                                // [[Has]] property
74  "f2","foo", "e9",                                 // for-in-body
75    "h4e9","i2e9",                                  // [[Has]]property
76  "f2","bar", "e9",                                 // for-in-body
77  "g0"
78], log);
79