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.

