Checking pause locations when stepping with "stepOut".


== Running test suite: Debugger.stepOut
-- Running test case: Debugger.stepOut.function
PAUSED (debugger-statement)
PAUSE AT testFunction:12:5
      8    function c() { return "c"; }
      9
     10    function testFunction() {
 ->  11        |debugger;
     12        let x = 1;
     13        let y = 2;
     14    }

RESUMED

-- Running test case: Debugger.stepOut.eval
PAUSED (debugger-statement)
PAUSE AT Eval Code:1:1
--- Source Unavailable ---

RESUMED

-- Running test case: Debugger.stepOut.innerFunction
PAUSED (debugger-statement)
PAUSE AT beta:28:9
     24            beta();
     25        }
     26        function beta() {
 ->  27            |debugger;
     28        }
     29        alpha();
     30    }

PAUSE AT alpha:26:6
     22    function testInnerFunction() {
     23        function alpha() {
     24            beta();
 ->  25        }|
     26        function beta() {
     27            debugger;
     28        }

PAUSE AT testInnerFunction:31:2
     27            debugger;
     28        }
     29        alpha();
 ->  30    }|
     31
     32    function testAnonymousFunction() {
     33        (function() {

RESUMED

-- Running test case: Debugger.stepOut.anonymousFunction
PAUSED (debugger-statement)
PAUSE AT <anonymous>:35:9
     31
     32    function testAnonymousFunction() {
     33        (function() {
 ->  34            |debugger;
     35            let inner = 1;
     36        })();
     37        let outer = 2;

PAUSE AT testAnonymousFunction:38:5
     34            debugger;
     35            let inner = 1;
     36        })();
 ->  37        |let outer = 2;
     38    }
     39
     40    function testCommas() {

RESUMED

-- Running test case: Debugger.stepOut.commas
PAUSED (debugger-statement)
PAUSE AT testCommas:42:5
     38    }
     39
     40    function testCommas() {
 ->  41        |debugger;
     42        let x = 1,
     43            y = 2,
     44            z = 3;

RESUMED

-- Running test case: Debugger.stepOut.chainedExpressions
PAUSED (debugger-statement)
PAUSE AT testChainedExpressions:51:5
     47    }
     48
     49    function testChainedExpressions() {
 ->  50        |debugger;
     51        a() && b() && c();
     52    }
     53

RESUMED

-- Running test case: Debugger.stepOut.declarations
PAUSED (debugger-statement)
PAUSE AT testDeclarations:56:5
     52    }
     53
     54    function testDeclarations() {
 ->  55        |debugger;
     56        let x = a(),
     57            y = b(),
     58            z = c();

RESUMED

