OLD | NEW |
(Empty) | |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 // Flags: --expose-debug-as debug --no-always-opt |
| 6 |
| 7 // Test that the (strict) eval scope is visible to the debugger. |
| 8 |
| 9 var Debug = debug.Debug; |
| 10 var exception = null; |
| 11 var delegate = null; |
| 12 |
| 13 function listener(event, exec_state, event_data, data) { |
| 14 if (event != Debug.DebugEvent.Break) return; |
| 15 try { |
| 16 delegate(exec_state); |
| 17 } catch (e) { |
| 18 exception = e; |
| 19 } |
| 20 } |
| 21 |
| 22 Debug.setListener(listener); |
| 23 |
| 24 // Current function is the top-level eval. |
| 25 // We can access stack- and context-allocated values in the eval-scope. |
| 26 delegate = function(exec_state) { |
| 27 assertEquals([ debug.ScopeType.Eval, |
| 28 debug.ScopeType.Script, |
| 29 debug.ScopeType.Global ], |
| 30 exec_state.frame(0).allScopes().map(s => s.scopeType())); |
| 31 var scope = exec_state.frame(0).scope(0); |
| 32 assertEquals(1, scope.scopeObject().property("a").value().value()); |
| 33 assertEquals(1, exec_state.frame(0).evaluate("a").value()); |
| 34 scope.setVariableValue("a", 2); |
| 35 assertEquals(2, exec_state.frame(0).evaluate("a++").value()); |
| 36 } |
| 37 |
| 38 eval("'use strict'; \n" + |
| 39 "var a = 1; \n" + |
| 40 "debugger; \n" + |
| 41 "assertEquals(3, a);\n"); |
| 42 |
| 43 eval("'use strict'; \n" + |
| 44 "var a = 1; \n" + |
| 45 "(x=>a); \n" + // Force context-allocation. |
| 46 "debugger; \n" + |
| 47 "assertEquals(3, a);\n"); |
| 48 |
| 49 // Current function is an inner function. |
| 50 // We cannot access stack-allocated values in the eval-scope. |
| 51 delegate = function(exec_state) { |
| 52 assertEquals([ debug.ScopeType.Local, |
| 53 debug.ScopeType.Script, |
| 54 debug.ScopeType.Global ], |
| 55 exec_state.frame(0).allScopes().map(s => s.scopeType())); |
| 56 assertEquals([ debug.ScopeType.Eval, |
| 57 debug.ScopeType.Script, |
| 58 debug.ScopeType.Global ], |
| 59 exec_state.frame(1).allScopes().map(s => s.scopeType())); |
| 60 var scope = exec_state.frame(0).scope(0); |
| 61 assertThrows(() => exec_state.frame(0).evaluate("a"), ReferenceError); |
| 62 assertTrue(scope.scopeObject().property("a").isUndefined()); |
| 63 } |
| 64 |
| 65 eval("'use strict'; \n" + |
| 66 "var a = 1; \n" + |
| 67 "(() => {debugger})()\n"); |
| 68 |
| 69 // Current function is an escaped inner function. |
| 70 delegate = function(exec_state) { |
| 71 assertEquals([ debug.ScopeType.Local, |
| 72 debug.ScopeType.Script, |
| 73 debug.ScopeType.Global ], |
| 74 exec_state.frame(0).allScopes().map(s => s.scopeType())); |
| 75 assertEquals([ debug.ScopeType.Script, |
| 76 debug.ScopeType.Global ], |
| 77 exec_state.frame(1).allScopes().map(s => s.scopeType())); |
| 78 var scope = exec_state.frame(0).scope(0); |
| 79 assertThrows(() => exec_state.frame(0).evaluate("a"), ReferenceError); |
| 80 assertTrue(scope.scopeObject().property("a").isUndefined()); |
| 81 } |
| 82 |
| 83 var f = eval("'use strict'; \n" + |
| 84 "var a = 1; \n" + |
| 85 "() => {debugger}\n"); |
| 86 f(); |
| 87 |
| 88 // Current function is an inner function. |
| 89 // We can access context-allocated values in the eval-scope. |
| 90 delegate = function(exec_state) { |
| 91 assertEquals([ debug.ScopeType.Local, |
| 92 debug.ScopeType.Closure, |
| 93 debug.ScopeType.Script, |
| 94 debug.ScopeType.Global ], |
| 95 exec_state.frame(0).allScopes().map(s => s.scopeType())); |
| 96 assertEquals([ debug.ScopeType.Eval, |
| 97 debug.ScopeType.Script, |
| 98 debug.ScopeType.Global ], |
| 99 exec_state.frame(1).allScopes().map(s => s.scopeType())); |
| 100 var scope = exec_state.frame(1).scope(0); |
| 101 assertEquals(1, scope.scopeObject().property("a").value().value()); |
| 102 assertEquals(1, exec_state.frame(1).evaluate("a").value()); |
| 103 assertEquals(1, exec_state.frame(0).evaluate("a").value()); |
| 104 scope.setVariableValue("a", 2); |
| 105 assertEquals(2, exec_state.frame(0).evaluate("a++").value()); |
| 106 assertEquals(3, exec_state.frame(1).evaluate("a++").value()); |
| 107 } |
| 108 |
| 109 eval("'use strict'; \n" + |
| 110 "var a = 1; \n" + |
| 111 "(() => { a; \n" + // Force context-allocation. |
| 112 " debugger; \n" + |
| 113 " assertEquals(4, a);\n" + |
| 114 " })(); \n" |
| 115 ); |
| 116 |
| 117 // Current function is an escaped inner function. |
| 118 // We can access context-allocated values in the eval-scope. |
| 119 delegate = function(exec_state) { |
| 120 assertEquals([ debug.ScopeType.Local, |
| 121 debug.ScopeType.Closure, |
| 122 debug.ScopeType.Script, |
| 123 debug.ScopeType.Global ], |
| 124 exec_state.frame(0).allScopes().map(s => s.scopeType())); |
| 125 assertEquals([ debug.ScopeType.Script, |
| 126 debug.ScopeType.Global ], |
| 127 exec_state.frame(1).allScopes().map(s => s.scopeType())); |
| 128 var scope = exec_state.frame(0).scope(1); |
| 129 assertEquals(1, scope.scopeObject().property("a").value().value()); |
| 130 assertEquals(1, exec_state.frame(0).evaluate("a").value()); |
| 131 scope.setVariableValue("a", 2); |
| 132 assertEquals(2, exec_state.frame(0).evaluate("a++").value()); |
| 133 } |
| 134 |
| 135 var g = eval("'use strict'; \n" + |
| 136 "var a = 1; \n" + |
| 137 "() => { a; \n" + |
| 138 " debugger; \n" + |
| 139 " assertEquals(3, a);\n" + |
| 140 " } \n"); |
| 141 g(); |
| 142 |
| 143 Debug.setListener(null); |
| 144 assertNull(exception); |
OLD | NEW |