OLD | NEW |
1 // Copyright 2008 the V8 project authors. All rights reserved. | 1 // Copyright 2008 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 25 matching lines...) Expand all Loading... |
36 new f(1); | 36 new f(1); |
37 }; | 37 }; |
38 | 38 |
39 | 39 |
40 // Get the Debug object exposed from the debug context global object. | 40 // Get the Debug object exposed from the debug context global object. |
41 Debug = debug.Debug | 41 Debug = debug.Debug |
42 | 42 |
43 listenerCalled = false; | 43 listenerCalled = false; |
44 exception = false; | 44 exception = false; |
45 | 45 |
46 function safeEval(code) { | 46 |
47 try { | 47 function ParsedResponse(json) { |
48 return eval('(' + code + ')'); | 48 this.response_ = eval('(' + json + ')'); |
49 } catch (e) { | 49 this.refs_ = []; |
50 return undefined; | 50 if (this.response_.refs) { |
| 51 for (var i = 0; i < this.response_.refs.length; i++) { |
| 52 this.refs_[this.response_.refs[i].handle] = this.response_.refs[i]; |
| 53 } |
51 } | 54 } |
52 } | 55 } |
53 | 56 |
| 57 |
| 58 ParsedResponse.prototype.response = function() { |
| 59 return this.response_; |
| 60 } |
| 61 |
| 62 |
| 63 ParsedResponse.prototype.body = function() { |
| 64 return this.response_.body; |
| 65 } |
| 66 |
| 67 |
| 68 ParsedResponse.prototype.lookup = function(handle) { |
| 69 return this.refs_[handle]; |
| 70 } |
| 71 |
| 72 |
54 function listener(event, exec_state, event_data, data) { | 73 function listener(event, exec_state, event_data, data) { |
55 try { | 74 try { |
56 if (event == Debug.DebugEvent.Break) | 75 if (event == Debug.DebugEvent.Break) |
57 { | 76 { |
58 // The expected backtrace is | 77 // The expected backtrace is |
59 // 0: f | 78 // 0: f |
60 // 1: g | 79 // 1: g |
61 // 2: [anonymous] | 80 // 2: [anonymous] |
62 | 81 |
| 82 var response; |
| 83 var backtrace; |
| 84 var frame; |
| 85 var source; |
| 86 |
63 // Get the debug command processor. | 87 // Get the debug command processor. |
64 var dcp = exec_state.debugCommandProcessor(); | 88 var dcp = exec_state.debugCommandProcessor(); |
65 | 89 |
66 // Get the backtrace. | 90 // Get the backtrace. |
67 var json; | 91 var json; |
68 json = '{"seq":0,"type":"request","command":"backtrace"}' | 92 json = '{"seq":0,"type":"request","command":"backtrace"}' |
69 var backtrace = safeEval(dcp.processDebugJSONRequest(json)).body; | 93 response = new ParsedResponse(dcp.processDebugJSONRequest(json)); |
| 94 backtrace = response.body(); |
70 assertEquals(0, backtrace.fromFrame); | 95 assertEquals(0, backtrace.fromFrame); |
71 assertEquals(3, backtrace.toFrame); | 96 assertEquals(3, backtrace.toFrame); |
72 assertEquals(3, backtrace.totalFrames); | 97 assertEquals(3, backtrace.totalFrames); |
73 var frames = backtrace.frames; | 98 var frames = backtrace.frames; |
74 assertEquals(3, frames.length); | 99 assertEquals(3, frames.length); |
75 for (var i = 0; i < frames.length; i++) { | 100 for (var i = 0; i < frames.length; i++) { |
76 assertEquals('frame', frames[i].type); | 101 assertEquals('frame', frames[i].type); |
77 } | 102 } |
78 assertEquals(0, frames[0].index); | 103 assertEquals(0, frames[0].index); |
79 assertEquals("f", frames[0].func.name); | 104 assertEquals("f", response.lookup(frames[0].func.ref).name); |
80 assertEquals(1, frames[1].index); | 105 assertEquals(1, frames[1].index); |
81 assertEquals("g", frames[1].func.name); | 106 assertEquals("g", response.lookup(frames[1].func.ref).name); |
82 assertEquals(2, frames[2].index); | 107 assertEquals(2, frames[2].index); |
83 assertEquals("", frames[2].func.name); | 108 assertEquals("", response.lookup(frames[2].func.ref).name); |
84 | 109 |
85 // Get backtrace with two frames. | 110 // Get backtrace with two frames. |
86 json = '{"seq":0,"type":"request","command":"backtrace","arguments":{"fromFr
ame":1,"toFrame":3}}' | 111 json = '{"seq":0,"type":"request","command":"backtrace","arguments":{"fromFr
ame":1,"toFrame":3}}' |
87 var backtrace = safeEval(dcp.processDebugJSONRequest(json)).body; | 112 response = new ParsedResponse(dcp.processDebugJSONRequest(json)); |
| 113 backtrace = response.body(); |
88 assertEquals(1, backtrace.fromFrame); | 114 assertEquals(1, backtrace.fromFrame); |
89 assertEquals(3, backtrace.toFrame); | 115 assertEquals(3, backtrace.toFrame); |
90 assertEquals(3, backtrace.totalFrames); | 116 assertEquals(3, backtrace.totalFrames); |
91 var frames = backtrace.frames; | 117 var frames = backtrace.frames; |
92 assertEquals(2, frames.length); | 118 assertEquals(2, frames.length); |
93 for (var i = 0; i < frames.length; i++) { | 119 for (var i = 0; i < frames.length; i++) { |
94 assertEquals('frame', frames[i].type); | 120 assertEquals('frame', frames[i].type); |
95 } | 121 } |
96 assertEquals(1, frames[0].index); | 122 assertEquals(1, frames[0].index); |
97 assertEquals("g", frames[0].func.name); | 123 assertEquals("g", response.lookup(frames[0].func.ref).name); |
98 assertEquals(2, frames[1].index); | 124 assertEquals(2, frames[1].index); |
99 assertEquals("", frames[1].func.name); | 125 assertEquals("", response.lookup(frames[1].func.ref).name); |
100 | 126 |
101 // Get the individual frames. | 127 // Get the individual frames. |
102 var frame; | |
103 json = '{"seq":0,"type":"request","command":"frame"}' | 128 json = '{"seq":0,"type":"request","command":"frame"}' |
104 frame = safeEval(dcp.processDebugJSONRequest(json)).body; | 129 response = new ParsedResponse(dcp.processDebugJSONRequest(json)); |
| 130 frame = response.body(); |
105 assertEquals(0, frame.index); | 131 assertEquals(0, frame.index); |
106 assertEquals("f", frame.func.name); | 132 assertEquals("f", response.lookup(frame.func.ref).name); |
107 assertTrue(frame.constructCall); | 133 assertTrue(frame.constructCall); |
108 assertEquals(31, frame.line); | 134 assertEquals(31, frame.line); |
109 assertEquals(3, frame.column); | 135 assertEquals(3, frame.column); |
110 assertEquals(2, frame.arguments.length); | 136 assertEquals(2, frame.arguments.length); |
111 assertEquals('x', frame.arguments[0].name); | 137 assertEquals('x', frame.arguments[0].name); |
112 assertEquals('number', frame.arguments[0].value.type); | 138 assertEquals('number', response.lookup(frame.arguments[0].value.ref).type); |
113 assertEquals(1, frame.arguments[0].value.value); | 139 assertEquals(1, response.lookup(frame.arguments[0].value.ref).value); |
114 assertEquals('y', frame.arguments[1].name); | 140 assertEquals('y', frame.arguments[1].name); |
115 assertEquals('undefined', frame.arguments[1].value.type); | 141 assertEquals('undefined', response.lookup(frame.arguments[1].value.ref).type
); |
116 | 142 |
117 json = '{"seq":0,"type":"request","command":"frame","arguments":{"number":0}
}' | 143 json = '{"seq":0,"type":"request","command":"frame","arguments":{"number":0}
}' |
118 frame = safeEval(dcp.processDebugJSONRequest(json)).body; | 144 response = new ParsedResponse(dcp.processDebugJSONRequest(json)); |
| 145 frame = response.body(); |
119 assertEquals(0, frame.index); | 146 assertEquals(0, frame.index); |
120 assertEquals("f", frame.func.name); | 147 assertEquals("f", response.lookup(frame.func.ref).name); |
121 assertEquals(31, frame.line); | 148 assertEquals(31, frame.line); |
122 assertEquals(3, frame.column); | 149 assertEquals(3, frame.column); |
123 assertEquals(2, frame.arguments.length); | 150 assertEquals(2, frame.arguments.length); |
124 assertEquals('x', frame.arguments[0].name); | 151 assertEquals('x', frame.arguments[0].name); |
125 assertEquals('number', frame.arguments[0].value.type); | 152 assertEquals('number', response.lookup(frame.arguments[0].value.ref).type); |
126 assertEquals(1, frame.arguments[0].value.value); | 153 assertEquals(1, response.lookup(frame.arguments[0].value.ref).value); |
127 assertEquals('y', frame.arguments[1].name); | 154 assertEquals('y', frame.arguments[1].name); |
128 assertEquals('undefined', frame.arguments[1].value.type); | 155 assertEquals('undefined', response.lookup(frame.arguments[1].value.ref).type
); |
129 | 156 |
130 json = '{"seq":0,"type":"request","command":"frame","arguments":{"number":1}
}' | 157 json = '{"seq":0,"type":"request","command":"frame","arguments":{"number":1}
}' |
131 frame = safeEval(dcp.processDebugJSONRequest(json)).body; | 158 response = new ParsedResponse(dcp.processDebugJSONRequest(json)); |
| 159 frame = response.body(); |
132 assertEquals(1, frame.index); | 160 assertEquals(1, frame.index); |
133 assertEquals("g", frame.func.name); | 161 assertEquals("g", response.lookup(frame.func.ref).name); |
134 assertFalse(frame.constructCall); | 162 assertFalse(frame.constructCall); |
135 assertEquals(35, frame.line); | 163 assertEquals(35, frame.line); |
136 assertEquals(2, frame.column); | 164 assertEquals(2, frame.column); |
137 assertEquals(0, frame.arguments.length); | 165 assertEquals(0, frame.arguments.length); |
138 | 166 |
139 json = '{"seq":0,"type":"request","command":"frame","arguments":{"number":2}
}' | 167 json = '{"seq":0,"type":"request","command":"frame","arguments":{"number":2}
}' |
140 frame = safeEval(dcp.processDebugJSONRequest(json)).body; | 168 response = new ParsedResponse(dcp.processDebugJSONRequest(json)); |
| 169 frame = response.body(); |
141 assertEquals(2, frame.index); | 170 assertEquals(2, frame.index); |
142 assertEquals("", frame.func.name); | 171 assertEquals("", response.lookup(frame.func.ref).name); |
143 | 172 |
144 // Source slices for the individual frames (they all refer to this script). | 173 // Source slices for the individual frames (they all refer to this script). |
145 json = '{"seq":0,"type":"request","command":"source",' + | 174 json = '{"seq":0,"type":"request","command":"source",' + |
146 '"arguments":{"frame":0,"fromLine":30,"toLine":32}}' | 175 '"arguments":{"frame":0,"fromLine":30,"toLine":32}}' |
147 source = safeEval(dcp.processDebugJSONRequest(json)).body; | 176 response = new ParsedResponse(dcp.processDebugJSONRequest(json)); |
| 177 source = response.body(); |
148 assertEquals("function f(x, y) {", source.source.substring(0, 18)); | 178 assertEquals("function f(x, y) {", source.source.substring(0, 18)); |
149 assertEquals(30, source.fromLine); | 179 assertEquals(30, source.fromLine); |
150 assertEquals(32, source.toLine); | 180 assertEquals(32, source.toLine); |
151 | 181 |
152 json = '{"seq":0,"type":"request","command":"source",' + | 182 json = '{"seq":0,"type":"request","command":"source",' + |
153 '"arguments":{"frame":1,"fromLine":31,"toLine":32}}' | 183 '"arguments":{"frame":1,"fromLine":31,"toLine":32}}' |
154 source = safeEval(dcp.processDebugJSONRequest(json)).body; | 184 response = new ParsedResponse(dcp.processDebugJSONRequest(json)); |
| 185 source = response.body(); |
155 assertEquals(" a=1;", source.source.substring(0, 6)); | 186 assertEquals(" a=1;", source.source.substring(0, 6)); |
156 assertEquals(31, source.fromLine); | 187 assertEquals(31, source.fromLine); |
157 assertEquals(32, source.toLine); | 188 assertEquals(32, source.toLine); |
158 | 189 |
159 json = '{"seq":0,"type":"request","command":"source",' + | 190 json = '{"seq":0,"type":"request","command":"source",' + |
160 '"arguments":{"frame":2,"fromLine":35,"toLine":36}}' | 191 '"arguments":{"frame":2,"fromLine":35,"toLine":36}}' |
161 source = safeEval(dcp.processDebugJSONRequest(json)).body; | 192 response = new ParsedResponse(dcp.processDebugJSONRequest(json)); |
| 193 source = response.body(); |
162 assertEquals(" new f(1);", source.source.substring(0, 11)); | 194 assertEquals(" new f(1);", source.source.substring(0, 11)); |
163 assertEquals(35, source.fromLine); | 195 assertEquals(35, source.fromLine); |
164 assertEquals(36, source.toLine); | 196 assertEquals(36, source.toLine); |
165 | 197 |
166 // Test line interval way beyond this script will result in an error. | 198 // Test line interval way beyond this script will result in an error. |
167 json = '{"seq":0,"type":"request","command":"source",' + | 199 json = '{"seq":0,"type":"request","command":"source",' + |
168 '"arguments":{"frame":0,"fromLine":10000,"toLine":20000}}' | 200 '"arguments":{"frame":0,"fromLine":10000,"toLine":20000}}' |
169 response = safeEval(dcp.processDebugJSONRequest(json)); | 201 response = new ParsedResponse(dcp.processDebugJSONRequest(json)); |
170 assertFalse(response.success); | 202 assertFalse(response.response().success); |
171 | 203 |
172 // Test without arguments. | 204 // Test without arguments. |
173 json = '{"seq":0,"type":"request","command":"source"}' | 205 json = '{"seq":0,"type":"request","command":"source"}' |
174 source = safeEval(dcp.processDebugJSONRequest(json)).body; | 206 response = new ParsedResponse(dcp.processDebugJSONRequest(json)); |
| 207 source = response.body(); |
175 assertEquals(Debug.findScript(f).source, source.source); | 208 assertEquals(Debug.findScript(f).source, source.source); |
176 | 209 |
177 listenerCalled = true; | 210 listenerCalled = true; |
178 } | 211 } |
179 } catch (e) { | 212 } catch (e) { |
180 exception = e | 213 exception = e |
181 }; | 214 }; |
182 }; | 215 }; |
183 | 216 |
184 // Add the debug event listener. | 217 // Add the debug event listener. |
185 Debug.addListener(listener); | 218 Debug.addListener(listener); |
186 | 219 |
187 // Set a break point and call to invoke the debug event listener. | 220 // Set a break point and call to invoke the debug event listener. |
188 Debug.setBreakPoint(f, 0, 0); | 221 Debug.setBreakPoint(f, 0, 0); |
189 g(); | 222 g(); |
190 | 223 |
191 // Make sure that the debug event listener vas invoked. | 224 // Make sure that the debug event listener vas invoked. |
192 assertFalse(exception, "exception in listener"); | 225 assertFalse(exception, "exception in listener"); |
193 assertTrue(listenerCalled); | 226 assertTrue(listenerCalled); |
194 | 227 |
OLD | NEW |