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
6
7Debug = debug.Debug
8
9function BestEditor() {
10  return 'Emacs';
11}
12
13var exception = null;
14var results = [];
15var log = []
16
17function listener(event, exec_state, event_data, data) {
18  if (event != Debug.DebugEvent.Break) return;
19  try {
20    var source_line = event_data.sourceLineText();
21    log.push(source_line);
22    if (source_line.indexOf("return") >= 0) {
23      switch (results.length) {
24        case 0:
25          break;
26        case 1:
27          Replace(BestEditor, "Emacs", "Eclipse");
28          break;
29        case 2:
30          Replace(BestEditor, "Eclipse", "Vim");
31          break;
32        default:
33          assertUnreachable();
34      }
35    }
36    exec_state.prepareStep(Debug.StepAction.StepIn);
37  } catch (e) {
38    exception = e;
39  }
40};
41
42function Replace(fun, original, patch) {
43  var script = Debug.findScript(fun);
44  if (fun.toString().indexOf(original) < 0) return;
45  var patch_pos = script.source.indexOf(original);
46  var change_log = [];
47  Debug.LiveEdit.TestApi.ApplySingleChunkPatch(script, patch_pos, original.length, patch, change_log);
48}
49
50Debug.setListener(listener);
51
52debugger;
53results.push(BestEditor());
54results.push(BestEditor());
55results.push(BestEditor());
56Debug.setListener(null);
57
58assertNull(exception);
59assertEquals(["Emacs", "Eclipse", "Vim"], results);
60print(JSON.stringify(log, 1));
61assertEquals([
62  "debugger;",
63  "results.push(BestEditor());",
64  "  return 'Emacs';","}",
65  "results.push(BestEditor());",
66  "results.push(BestEditor());",
67  "  return 'Emacs';",
68  "  return 'Eclipse';","}",
69  "results.push(BestEditor());",
70  "results.push(BestEditor());",
71  "  return 'Eclipse';",
72  "  return 'Vim';",
73  "}","results.push(BestEditor());",
74  "Debug.setListener(null);"
75], log);
76