Checking pause locations when stepping in, out, and over object and array literal construction.


== Running test suite: Debugger.stepping.literal-construction
-- Running test case: Debugger.stepping.ObjectConstructionStepOver
EXPRESSION: setTimeout(entryObjectConstruction)
STEPS: over, over, resume
PAUSED (debugger-statement)
PAUSE AT entryObjectConstruction:16:5
     12    }
     13    
     14    function entryObjectConstruction() {
 ->  15        |debugger;
     16        var o = {
     17            p1: true,
     18            p2: a(),

ACTION: step-over
PAUSE AT entryObjectConstruction:17:5
     13    
     14    function entryObjectConstruction() {
     15        debugger;
 ->  16        |var o = {
     17            p1: true,
     18            p2: a(),
     19            p3: true,

ACTION: step-over
PAUSE AT entryObjectConstruction:24:2
     20            ["p4"]: true,
     21            [b()]: true,
     22        };
 ->  23    }|
     24    
     25    function entryArrayConstruction() {
     26        debugger;

ACTION: resume
RESUMED
PASS: Should have used all steps.

-- Running test case: Debugger.stepping.ObjectConstructionStepIn
EXPRESSION: setTimeout(entryObjectConstruction)
STEPS: over, in, out, in, out, resume
PAUSED (debugger-statement)
PAUSE AT entryObjectConstruction:16:5
     12    }
     13    
     14    function entryObjectConstruction() {
 ->  15        |debugger;
     16        var o = {
     17            p1: true,
     18            p2: a(),

ACTION: step-over
PAUSE AT entryObjectConstruction:17:5
     13    
     14    function entryObjectConstruction() {
     15        debugger;
 ->  16        |var o = {
     17            p1: true,
     18            p2: a(),
     19            p3: true,

ACTION: step-in
PAUSE AT a:8:5
      4    <script src="../resources/log-pause-location.js"></script>
      5    <script>
      6    function a() {
 ->   7        |return 1;
      8    }
      9    
     10    function b() {

ACTION: step-out
PAUSE AT entryObjectConstruction:22:10
     18            p2: a(),
     19            p3: true,
     20            ["p4"]: true,
 ->  21            [|b()]: true,
     22        };
     23    }
     24    

ACTION: step-in
PAUSE AT b:12:5
      8    }
      9    
     10    function b() {
 ->  11        |return 2;
     12    }
     13    
     14    function entryObjectConstruction() {

ACTION: step-out
PAUSE AT entryObjectConstruction:24:2
     20            ["p4"]: true,
     21            [b()]: true,
     22        };
 ->  23    }|
     24    
     25    function entryArrayConstruction() {
     26        debugger;

ACTION: resume
RESUMED
PASS: Should have used all steps.

-- Running test case: Debugger.stepping.ArrayConstructionStepOver
EXPRESSION: setTimeout(entryArrayConstruction)
STEPS: over, over, resume
PAUSED (debugger-statement)
PAUSE AT entryArrayConstruction:27:5
     23    }
     24    
     25    function entryArrayConstruction() {
 ->  26        |debugger;
     27        var arr = [
     28            true,
     29            a(),

ACTION: step-over
PAUSE AT entryArrayConstruction:28:5
     24    
     25    function entryArrayConstruction() {
     26        debugger;
 ->  27        |var arr = [
     28            true,
     29            a(),
     30            true,

ACTION: step-over
PAUSE AT entryArrayConstruction:34:2
     30            true,
     31            b(),
     32        ];
 ->  33    }|
     34    
     35    // ---------
     36    

ACTION: resume
RESUMED
PASS: Should have used all steps.

-- Running test case: Debugger.stepping.ArrayConstructionStepIn
EXPRESSION: setTimeout(entryArrayConstruction)
STEPS: over, in, out, in, out, resume
PAUSED (debugger-statement)
PAUSE AT entryArrayConstruction:27:5
     23    }
     24    
     25    function entryArrayConstruction() {
 ->  26        |debugger;
     27        var arr = [
     28            true,
     29            a(),

ACTION: step-over
PAUSE AT entryArrayConstruction:28:5
     24    
     25    function entryArrayConstruction() {
     26        debugger;
 ->  27        |var arr = [
     28            true,
     29            a(),
     30            true,

ACTION: step-in
PAUSE AT a:8:5
      4    <script src="../resources/log-pause-location.js"></script>
      5    <script>
      6    function a() {
 ->   7        |return 1;
      8    }
      9    
     10    function b() {

ACTION: step-out
PAUSE AT entryArrayConstruction:32:9
     28            true,
     29            a(),
     30            true,
 ->  31            |b(),
     32        ];
     33    }
     34    

ACTION: step-in
PAUSE AT b:12:5
      8    }
      9    
     10    function b() {
 ->  11        |return 2;
     12    }
     13    
     14    function entryObjectConstruction() {

ACTION: step-out
PAUSE AT entryArrayConstruction:34:2
     30            true,
     31            b(),
     32        ];
 ->  33    }|
     34    
     35    // ---------
     36    

ACTION: resume
RESUMED
PASS: Should have used all steps.

