ALERT: log 1
Checking pause locations when stepping with "stepInto".


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

PAUSE AT entry1:13:5
      9    
     10    function entry1() {
     11        debugger;
 ->  12        |let x = 1;
     13        let y = 2;
     14    }
     15    

PAUSE AT entry1:14:5
     10    function entry1() {
     11        debugger;
     12        let x = 1;
 ->  13        |let y = 2;
     14    }
     15    
     16    function entry2() {

PAUSE AT entry1:15:2
     11        debugger;
     12        let x = 1;
     13        let y = 2;
 ->  14    }|
     15    
     16    function entry2() {
     17        debugger;

RESUMED

-- Running test case: Debugger.stepInto.function
PAUSED (debugger-statement)
PAUSE AT entry2:18:5
     14    }
     15    
     16    function entry2() {
 ->  17        |debugger;
     18        let before = 1;
     19        testAlert("log 1");
     20        let after = 2;

PAUSE AT entry2:19:5
     15    
     16    function entry2() {
     17        debugger;
 ->  18        |let before = 1;
     19        testAlert("log 1");
     20        let after = 2;
     21    }

PAUSE AT entry2:20:5
     16    function entry2() {
     17        debugger;
     18        let before = 1;
 ->  19        |testAlert("log 1");
     20        let after = 2;
     21    }
     22    

PAUSE AT testAlert:8:5
      4    <script src="../resources/log-pause-location.js"></script>
      5    <script>
      6    function testAlert(str) {
 ->   7        |alert(str);
      8    }
      9    
     10    function entry1() {

PAUSE AT testAlert:9:2
      5    <script>
      6    function testAlert(str) {
      7        alert(str);
 ->   8    }|
      9    
     10    function entry1() {
     11        debugger;

PAUSE AT entry2:21:5
     17        debugger;
     18        let before = 1;
     19        testAlert("log 1");
 ->  20        |let after = 2;
     21    }
     22    
     23    function entry3() {

PAUSE AT entry2:22:2
     18        let before = 1;
     19        testAlert("log 1");
     20        let after = 2;
 ->  21    }|
     22    
     23    function entry3() {
     24        debugger;

RESUMED

-- Running test case: Debugger.stepInto.eval
PAUSED (debugger-statement)
PAUSE AT entry3:25:5
     21    }
     22    
     23    function entry3() {
 ->  24        |debugger;
     25        let before = 1;
     26        eval("1 + 1");
     27        let after = 2;

PAUSE AT entry3:26:5
     22    
     23    function entry3() {
     24        debugger;
 ->  25        |let before = 1;
     26        eval("1 + 1");
     27        let after = 2;
     28    }

PAUSE AT entry3:27:5
     23    function entry3() {
     24        debugger;
     25        let before = 1;
 ->  26        |eval("1 + 1");
     27        let after = 2;
     28    }
     29    

PAUSE AT Eval Code:1:1
--- Source Unavailable ---

PAUSE AT Eval Code:1:6
--- Source Unavailable ---

PAUSE AT entry3:28:5
     24        debugger;
     25        let before = 1;
     26        eval("1 + 1");
 ->  27        |let after = 2;
     28    }
     29    
     30    function entry4() {

PAUSE AT entry3:29:2
     25        let before = 1;
     26        eval("1 + 1");
     27        let after = 2;
 ->  28    }|
     29    
     30    function entry4() {
     31        (function() {

RESUMED

-- Running test case: Debugger.stepInto.innerFunction
PAUSED (debugger-statement)
PAUSE AT <anonymous>:33:9
     29    
     30    function entry4() {
     31        (function() {
 ->  32            |debugger;
     33            let inner = 1;
     34        })();
     35        let outer = 2;

PAUSE AT <anonymous>:34:9
     30    function entry4() {
     31        (function() {
     32            debugger;
 ->  33            |let inner = 1;
     34        })();
     35        let outer = 2;
     36    }

PAUSE AT <anonymous>:35:6
     31        (function() {
     32            debugger;
     33            let inner = 1;
 ->  34        }|)();
     35        let outer = 2;
     36    }
     37    

PAUSE AT entry4:36:5
     32            debugger;
     33            let inner = 1;
     34        })();
 ->  35        |let outer = 2;
     36    }
     37    
     38    // ---------

PAUSE AT entry4:37:2
     33            let inner = 1;
     34        })();
     35        let outer = 2;
 ->  36    }|
     37    
     38    // ---------
     39    

RESUMED

