Index: test/mjsunit/debug-liveedit-double-call.js |
diff --git a/test/mjsunit/debug-liveedit-restart-frame.js b/test/mjsunit/debug-liveedit-double-call.js |
similarity index 51% |
copy from test/mjsunit/debug-liveedit-restart-frame.js |
copy to test/mjsunit/debug-liveedit-double-call.js |
index d978a9709fb0f7d394b9377d93b65c1fba1109c4..1df806ab75c8c7b13ec83695fbbe11cfe3fbfdd9 100644 |
--- a/test/mjsunit/debug-liveedit-restart-frame.js |
+++ b/test/mjsunit/debug-liveedit-double-call.js |
@@ -30,87 +30,85 @@ |
Debug = debug.Debug |
-function FindCallFrame(exec_state, frame_code) { |
- var number = Number(frame_code); |
- if (number >= 0) { |
- return exec_state.frame(number); |
- } else { |
- for (var i = 0; i < exec_state.frameCount(); i++) { |
- var frame = exec_state.frame(i); |
- var func_mirror = frame.func(); |
- if (frame_code == func_mirror.name()) { |
- return frame; |
- } |
- } |
- } |
- throw new Error("Failed to find function name " + function_name); |
-} |
function TestCase(test_scenario, expected_output) { |
// Global variable, accessed from eval'd script. |
test_output = ""; |
- function TestCode() { |
- function A() { |
- // Extra stack variable. To make function not slim. |
- // Restarter doesn't work on slim function when stopped on 'debugger' |
- // statement. (There is no padding for 'debugger' statement). |
- var o = {}; |
- test_output += 'A'; |
- test_output += '='; |
- debugger; |
- return 'Capybara'; |
- } |
- function B(p1, p2) { |
- test_output += 'B'; |
- return A(); |
- } |
- function C() { |
- test_output += 'C'; |
- // Function call with argument adaptor is intentional. |
- return B(); |
- } |
- function D() { |
- test_output += 'D'; |
- // Function call with argument adaptor is intentional. |
- return C(1, 2); |
- } |
- function E() { |
- test_output += 'E'; |
- return D(); |
- } |
- function F() { |
- test_output += 'F'; |
- return E(); |
- } |
- return F(); |
- } |
+ var script_text_generator = (function() { |
+ var variables = { a: 1, b: 1, c: 1, d: 1, e: 1, f: 1 }; |
+ |
+ return { |
+ get: function() { |
+ return "(function() {\n " + |
+ " function A() {\n " + |
+ " test_output += 'a' + " + variables.a + ";\n " + |
+ " test_output += '=';\n " + |
+ " debugger;\n " + |
+ " return 'Capybara';\n " + |
+ " }\n " + |
+ " function B(p1, p2) {\n " + |
+ " test_output += 'b' + " + variables.b + ";\n " + |
+ " return A();\n " + |
+ " }\n " + |
+ " function C() {\n " + |
+ " test_output += 'c' + " + variables.c + ";\n " + |
+ " // Function call with argument adaptor is intentional.\n " + |
+ " return B();\n " + |
+ " }\n " + |
+ " function D() {\n " + |
+ " test_output += 'd' + " + variables.d + ";\n " + |
+ " // Function call with argument adaptor is intentional.\n " + |
+ " return C(1, 2);\n " + |
+ " }\n " + |
+ " function E() {\n " + |
+ " test_output += 'e' + " + variables.e + ";\n " + |
+ " return D();\n " + |
+ " }\n " + |
+ " function F() {\n " + |
+ " test_output += 'f' + " + variables.f + ";\n " + |
+ " return E();\n " + |
+ " }\n " + |
+ " return F();\n " + |
+ "})\n"; |
+ }, |
+ change: function(var_name) { |
+ variables[var_name]++; |
+ } |
+ }; |
+ })(); |
+ |
+ var test_fun = eval(script_text_generator.get()); |
+ |
+ var script = Debug.findScript(test_fun); |
var scenario_pos = 0; |
- function DebuggerStatementHandler(exec_state) { |
+ function DebuggerStatementHandler() { |
while (true) { |
assertTrue(scenario_pos < test_scenario.length); |
- var change_code = test_scenario[scenario_pos++]; |
- if (change_code == '=') { |
+ var change_var = test_scenario[scenario_pos++]; |
+ if (change_var == '=') { |
// Continue. |
return; |
} |
- var frame = FindCallFrame(exec_state, change_code); |
- // Throws if fails. |
- Debug.LiveEdit.RestartFrame(frame); |
+ script_text_generator.change(change_var); |
+ try { |
+ Debug.LiveEdit.SetScriptSource(script, script_text_generator.get(), |
+ false, []); |
+ } catch (e) { |
+ print("LiveEdit exception: " + e); |
+ throw e; |
+ } |
} |
} |
var saved_exception = null; |
function listener(event, exec_state, event_data, data) { |
- if (saved_exception != null) { |
- return; |
- } |
if (event == Debug.DebugEvent.Break) { |
try { |
- DebuggerStatementHandler(exec_state); |
+ DebuggerStatementHandler(); |
} catch (e) { |
saved_exception = e; |
} |
@@ -120,12 +118,11 @@ function TestCase(test_scenario, expected_output) { |
} |
Debug.setListener(listener); |
- assertEquals("Capybara", TestCode()); |
+ assertEquals("Capybara", test_fun()); |
Debug.setListener(null); |
if (saved_exception) { |
print("Exception: " + saved_exception); |
- print("Stack: " + saved_exception.stack); |
assertUnreachable(); |
} |
@@ -134,20 +131,12 @@ function TestCase(test_scenario, expected_output) { |
assertEquals(expected_output, test_output); |
} |
-TestCase('0==', "FEDCBA=A="); |
-TestCase('1==', "FEDCBA=BA="); |
-TestCase('2==', "FEDCBA=CBA="); |
-TestCase('3==', "FEDCBA=DCBA="); |
-TestCase('4==', "FEDCBA=EDCBA="); |
-TestCase('5==', "FEDCBA=FEDCBA="); |
+TestCase(['='], "f1e1d1c1b1a1="); |
-TestCase('=', "FEDCBA="); |
+TestCase(['c', '=', '='], "f1e1d1c1b1a1=c2b1a1="); |
-TestCase('C==', "FEDCBA=CBA="); |
+TestCase(['b', 'c', 'd', 'e', '=', '='], "f1e1d1c1b1a1=e2d2c2b2a1="); |
-TestCase('B=C=A=D==', "FEDCBA=BA=CBA=A=DCBA="); |
+TestCase(['b', 'c', '=', 'b', 'c', 'd', 'e', '=', '='], "f1e1d1c1b1a1=c2b2a1=e2d2c3b3a1="); |
-// Successive restarts don't work now and require additional fix. |
-//TestCase('BCDE==', "FEDCBA=EDCBA="); |
-//TestCase('BC=BCDE==', "FEDCBA=CBA=EDCBA="); |
-//TestCase('EF==', "FEDCBA=FEDCBA="); |
+TestCase(['e', 'f', '=', '='], "f1e1d1c1b1a1=f2e2d1c1b1a1="); |