| Index: test/mjsunit/debug-stepin-positions.js
|
| diff --git a/test/mjsunit/debug-stepin-positions.js b/test/mjsunit/debug-stepin-positions.js
|
| index 482e21be4d740de24cf0c7086cb4dc9b72360515..e6d820461102654ad770f8d190206fac9b90c395 100644
|
| --- a/test/mjsunit/debug-stepin-positions.js
|
| +++ b/test/mjsunit/debug-stepin-positions.js
|
| @@ -30,26 +30,35 @@
|
| Debug = debug.Debug
|
|
|
| function DebuggerStatement() {
|
| - debugger;
|
| + debugger; /*pause*/
|
| }
|
|
|
| -function TestCase(fun) {
|
| +function TestCase(fun, frame_number) {
|
| var exception = false;
|
| var codeSnippet = undefined;
|
| var resultPositions = undefined;
|
|
|
| function listener(event, exec_state, event_data, data) {
|
| try {
|
| - if (event == Debug.DebugEvent.Break) {
|
| + if (event == Debug.DebugEvent.Break ||
|
| + event == Debug.DebugEvent.Exception) {
|
| Debug.setListener(null);
|
| -
|
| - var secondFrame = exec_state.frame(1);
|
| - codeSnippet = secondFrame.sourceLineText();
|
| - resultPositions = secondFrame.stepInPositions();
|
| + assertHasLineMark(/pause/, exec_state.frame(0));
|
| + assertHasLineMark(/positions/, exec_state.frame(frame_number));
|
| + var frame = exec_state.frame(frame_number);
|
| + codeSnippet = frame.sourceLineText();
|
| + resultPositions = frame.stepInPositions();
|
| }
|
| } catch (e) {
|
| exception = e
|
| }
|
| +
|
| + function assertHasLineMark(mark, frame) {
|
| + var line = frame.sourceLineText();
|
| + if (!mark.exec(frame.sourceLineText())) {
|
| + throw new Error("Line " + line + " should contain mark " + mark);
|
| + }
|
| + }
|
| }
|
|
|
| Debug.setListener(listener);
|
| @@ -101,26 +110,98 @@ function TestCase(fun) {
|
| decoratedResult);
|
| }
|
|
|
| +function TestCaseWithDebugger(fun) {
|
| + TestCase(fun, 1);
|
| +}
|
| +
|
| +function TestCaseWithBreakpoint(fun, line_number, frame_number) {
|
| + var breakpointId = Debug.setBreakPoint(fun, line_number);
|
| + TestCase(fun, frame_number);
|
| + Debug.clearBreakPoint(breakpointId);
|
| +}
|
| +
|
| +function TestCaseWithException(fun, frame_number) {
|
| + Debug.setBreakOnException();
|
| + TestCase(fun, frame_number);
|
| + Debug.clearBreakOnException();
|
| +}
|
| +
|
|
|
| // Test cases.
|
|
|
| +// Step in position, when the function call that we are standing at is already
|
| +// being executed.
|
| +var fun = function() {
|
| + function g(p) {
|
| + throw String(p); /*pause*/
|
| + }
|
| + try {
|
| + var res = [ g(1), /*#*/g(2) ]; /*positions*/
|
| + } catch (e) {
|
| + }
|
| +};
|
| +TestCaseWithBreakpoint(fun, 2, 1);
|
| +TestCaseWithException(fun, 1);
|
| +
|
| +
|
| +// Step in position, when the function call that we are standing at is raising
|
| +// an exception.
|
| +var fun = function() {
|
| + var o = {
|
| + g: function(p) {
|
| + throw p;
|
| + }
|
| + };
|
| + try {
|
| + var res = [ /*#*/f(1), /*#*/g(2) ]; /*pause, positions*/
|
| + } catch (e) {
|
| + }
|
| +};
|
| +TestCaseWithException(fun, 0);
|
| +
|
| +
|
| +// Step-in position, when already paused almost on the first call site.
|
| +var fun = function() {
|
| + function g(p) {
|
| + throw p;
|
| + }
|
| + try {
|
| + var res = [ /*#*/g(Math.rand), /*#*/g(2) ]; /*pause, positions*/
|
| + } catch (e) {
|
| + }
|
| +};
|
| +TestCaseWithBreakpoint(fun, 5, 0);
|
| +
|
| +// Step-in position, when already paused on the first call site.
|
| +var fun = function() {
|
| + function g() {
|
| + throw "Debug";
|
| + }
|
| + try {
|
| + var res = [ /*#*/g(), /*#*/g() ]; /*pause, positions*/
|
| + } catch (e) {
|
| + }
|
| +};
|
| +TestCaseWithBreakpoint(fun, 5, 0);
|
| +
|
| +
|
| // Method calls.
|
| var fun = function() {
|
| var data = {
|
| a: function() {}
|
| };
|
| - var res = [ DebuggerStatement(), data./*#*/a(), data[/*#*/String("a")]/*#*/(), data["a"]/*#*/(), data.a, data["a"] ];
|
| + var res = [ DebuggerStatement(), data./*#*/a(), data[/*#*/String("a")]/*#*/(), data["a"]/*#*/(), data.a, data["a"] ]; /*positions*/
|
| };
|
| -TestCase(fun);
|
| +TestCaseWithDebugger(fun);
|
|
|
| // Function call on a value.
|
| var fun = function() {
|
| function g(p) {
|
| return g;
|
| }
|
| - var res = [ DebuggerStatement(), /*#*/g(2), /*#*/g(2)/*#*/(3), /*#*/g(0)/*#*/(0)/*#*/(g) ];
|
| + var res = [ DebuggerStatement(), /*#*/g(2), /*#*/g(2)/*#*/(3), /*#*/g(0)/*#*/(0)/*#*/(g) ]; /*positions*/
|
| };
|
| -TestCase(fun);
|
| +TestCaseWithDebugger(fun);
|
|
|
| // Local function call, closure function call,
|
| // local function construction call.
|
| @@ -128,15 +209,17 @@ var fun = (function(p) {
|
| return function() {
|
| function f(a, b) {
|
| }
|
| - var res = /*#*/f(DebuggerStatement(), /*#*/p(/*#*/new f()));
|
| + var res = /*#*/f(DebuggerStatement(), /*#*/p(/*#*/new f())); /*positions*/
|
| };
|
| })(Object);
|
| -TestCase(fun);
|
| +TestCaseWithDebugger(fun);
|
|
|
| // Global function, global object construction, calls before pause point.
|
| var fun = (function(p) {
|
| return function() {
|
| - var res = [ Math.abs(new Object()), DebuggerStatement(), Math./*#*/abs(4), /*#*/new Object()./*#*/toString() ];
|
| + var res = [ Math.abs(new Object()), DebuggerStatement(), Math./*#*/abs(4), /*#*/new Object()./*#*/toString() ]; /*positions*/
|
| };
|
| })(Object);
|
| -TestCase(fun);
|
| +TestCaseWithDebugger(fun);
|
| +
|
| +
|
|
|