Tests evaluateOnCallFrame in module.

Running test: testTotal
foo1 (module1:7:2)
foo2 (module2:7:9)
(anonymous) (module3:4:0)
local:foo1
[
    [0] : c1 = 12
    [1] : g1 = 2
]
module
[
    [0] : a1 = 10
    [1] : b1 = 11
    [2] : foo1 = function foo1() {   let c1 = 12;   let g1 = 2;   debugger;   return a1 + b1 + c1 + g1; }
]
global
[
  ...
]
Check variables in frame#0
  let g1 = 2;
  #debugger;
  return a1 + b1 + c1 + g1;

Array = 
{
    className : Function
    description : function Array() { [native code] }
    objectId : <objectId>
    type : function
}
c1 = 
{
    description : 12
    type : number
    value : 12
}
Evaluating: ++c1
updated c1 = 
{
    description : 13
    type : number
    value : 13
}
Evaluating: --c1
g1 = 
{
    description : 2
    type : number
    value : 2
}
Evaluating: ++g1
updated g1 = 
{
    description : 3
    type : number
    value : 3
}
Evaluating: --g1
a1 = 
{
    description : 10
    type : number
    value : 10
}
Evaluating: ++a1
updated a1 = 
{
    description : 11
    type : number
    value : 11
}
Evaluating: --a1
b1 = 
{
    description : 11
    type : number
    value : 11
}
Evaluating: ++b1
updated b1 = 
{
    description : 12
    type : number
    value : 12
}
Evaluating: --b1
foo1 = 
{
    className : Function
    description : function foo1() {   let c1 = 12;   let g1 = 2;   debugger;   return a1 + b1 + c1 + g1; }
    objectId : <objectId>
    type : function
}
local:foo2
[
    [0] : c2 = 22
]
module
[
    [0] : a2 = 20
    [1] : foo1 = function foo1() {   let c1 = 12;   let g1 = 2;   debugger;   return a1 + b1 + c1 + g1; }
    [2] : b2 = 21
    [3] : foo2 = function foo2() {   let c2 = 22;   return foo1() + a2 + b2 + c2; }
]
global
[
  ...
]
Check variables in frame#1
  let c2 = 22;
  return #foo1() + a2 + b2 + c2;
}

Array = 
{
    className : Function
    description : function Array() { [native code] }
    objectId : <objectId>
    type : function
}
c2 = 
{
    description : 22
    type : number
    value : 22
}
Evaluating: ++c2
updated c2 = 
{
    description : 23
    type : number
    value : 23
}
Evaluating: --c2
a2 = 
{
    description : 20
    type : number
    value : 20
}
Evaluating: ++a2
updated a2 = 
{
    description : 21
    type : number
    value : 21
}
Evaluating: --a2
foo1 = 
{
    className : Function
    description : function foo1() {   let c1 = 12;   let g1 = 2;   debugger;   return a1 + b1 + c1 + g1; }
    objectId : <objectId>
    type : function
}
b2 = 
{
    description : 21
    type : number
    value : 21
}
Evaluating: ++b2
updated b2 = 
{
    description : 22
    type : number
    value : 22
}
Evaluating: --b2
foo2 = 
{
    className : Function
    description : function foo2() {   let c2 = 22;   return foo1() + a2 + b2 + c2; }
    objectId : <objectId>
    type : function
}
module
[
    [0] : foo2 = function foo2() {   let c2 = 22;   return foo1() + a2 + b2 + c2; }
    [1] : a3 = 30
    [2] : b3 = 31
]
global
[
  ...
]
Check variables in frame#2
export let b3 = 31;
#foo2();


Array = 
{
    className : Function
    description : function Array() { [native code] }
    objectId : <objectId>
    type : function
}
foo2 = 
{
    className : Function
    description : function foo2() {   let c2 = 22;   return foo1() + a2 + b2 + c2; }
    objectId : <objectId>
    type : function
}
a3 = 
{
    description : 30
    type : number
    value : 30
}
Evaluating: ++a3
updated a3 = 
{
    description : 31
    type : number
    value : 31
}
Evaluating: --a3
b3 = 
{
    description : 31
    type : number
    value : 31
}
Evaluating: ++b3
updated b3 = 
{
    description : 32
    type : number
    value : 32
}
Evaluating: --b3

Running test: testAnother
(anonymous) (module4:5:13)
bar (module4:5:24)
(anonymous) (module4:7:0)
local
[
]
closure:bar
[
    [0] : a = 0
]
global
[
  ...
]
Check variables in frame#0
  let a = 0;
  (() => {a; #debugger;})();
};

Array = 
{
    className : Function
    description : function Array() { [native code] }
    objectId : <objectId>
    type : function
}
a = 
{
    description : 0
    type : number
    value : 0
}
Evaluating: ++a
updated a = 
{
    description : 1
    type : number
    value : 1
}
Evaluating: --a
local:bar
[
    [0] : a = 0
]
global
[
  ...
]
Check variables in frame#1
  let a = 0;
  (() => {a; debugger;})#();
};

Array = 
{
    className : Function
    description : function Array() { [native code] }
    objectId : <objectId>
    type : function
}
a = 
{
    description : 0
    type : number
    value : 0
}
Evaluating: ++a
updated a = 
{
    description : 1
    type : number
    value : 1
}
Evaluating: --a
module
[
    [0] : a = 1
    [1] : b = 2
    [2] : bar = function bar() {   let a = 0;   (() => {a; debugger;})(); }
]
global
[
  ...
]
Check variables in frame#2
};
#bar();

Array = 
{
    className : Function
    description : function Array() { [native code] }
    objectId : <objectId>
    type : function
}
a = 
{
    description : 1
    type : number
    value : 1
}
Evaluating: ++a
updated a = 
{
    description : 2
    type : number
    value : 2
}
Evaluating: --a
b = 
{
    description : 2
    type : number
    value : 2
}
Evaluating: ++b
updated b = 
{
    description : 3
    type : number
    value : 3
}
Evaluating: --b
bar = 
{
    className : Function
    description : function bar() {   let a = 0;   (() => {a; debugger;})(); }
    objectId : <objectId>
    type : function
}

Running test: testDifferentModuleVariables
(anonymous) (module5:5:0)
module
[
    [0] : b2 = 21
    [1] : a = 0
    [2] : b = 0
    [3] : c = 0
]
global
[
  ...
]
Check variables in frame#0
export var c = 0;
#debugger;


Array = 
{
    className : Function
    description : function Array() { [native code] }
    objectId : <objectId>
    type : function
}
b2 = 
{
    description : 21
    type : number
    value : 21
}
Evaluating: ++b2
updated b2 = 
{
    description : 21
    type : number
    value : 21
}
Evaluating: --b2
a = 
{
    description : 0
    type : number
    value : 0
}
Evaluating: ++a
updated a = 
{
    description : 0
    type : number
    value : 0
}
Evaluating: --a
b = 
{
    description : 0
    type : number
    value : 0
}
Evaluating: ++b
updated b = 
{
    description : 1
    type : number
    value : 1
}
Evaluating: --b
c = 
{
    description : 0
    type : number
    value : 0
}
Evaluating: ++c
updated c = 
{
    description : 1
    type : number
    value : 1
}
Evaluating: --c

Running test: testCapturedLocalVariable
(anonymous) (module6:2:25)
(anonymous) (module6:2:37)
local
[
    [0] : y = 5
]
module
[
    [0] : x = 5
]
global
[
  ...
]
Check variables in frame#0
let x = 5;
(function() { let y = x; #debugger; })()


Array = 
{
    className : Function
    description : function Array() { [native code] }
    objectId : <objectId>
    type : function
}
y = 
{
    description : 5
    type : number
    value : 5
}
Evaluating: ++y
updated y = 
{
    description : 6
    type : number
    value : 6
}
Evaluating: --y
x = 
{
    description : 5
    type : number
    value : 5
}
Evaluating: ++x
updated x = 
{
    description : 6
    type : number
    value : 6
}
Evaluating: --x
module
[
    [0] : x = 5
]
global
[
  ...
]
Check variables in frame#1
let x = 5;
(function() { let y = x; debugger; })#()


Array = 
{
    className : Function
    description : function Array() { [native code] }
    objectId : <objectId>
    type : function
}
x = 
{
    description : 5
    type : number
    value : 5
}
Evaluating: ++x
updated x = 
{
    description : 6
    type : number
    value : 6
}
Evaluating: --x

Running test: testLocalVariableToplevel
(anonymous) (module7:2:0)
module
[
    [0] : x = 5
]
global
[
  ...
]
Check variables in frame#0
let x = 5;
#debugger;


Array = 
{
    className : Function
    description : function Array() { [native code] }
    objectId : <objectId>
    type : function
}
x = 
{
    description : 5
    type : number
    value : 5
}
Evaluating: ++x
updated x = 
{
    description : 6
    type : number
    value : 6
}
Evaluating: --x
