OLD | NEW |
---|---|
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library debugger_page_element; | 5 library debugger_page_element; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 import 'dart:svg'; | 8 import 'dart:svg'; |
9 import 'dart:html'; | 9 import 'dart:html'; |
10 import 'dart:math'; | 10 import 'dart:math'; |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
202 return new Future.value(null); | 202 return new Future.value(null); |
203 } | 203 } |
204 if (debugger.currentFrame == null) { | 204 if (debugger.currentFrame == null) { |
205 debugger.console.print('No stack'); | 205 debugger.console.print('No stack'); |
206 return new Future.value(null); | 206 return new Future.value(null); |
207 } | 207 } |
208 try { | 208 try { |
209 debugger.downFrame(count); | 209 debugger.downFrame(count); |
210 debugger.console.print('frame = ${debugger.currentFrame}'); | 210 debugger.console.print('frame = ${debugger.currentFrame}'); |
211 } catch (e) { | 211 } catch (e) { |
212 debugger.console.print('frame must be in range [${e.start},${e.end-1}]'); | 212 debugger.console.print( |
213 'frame must be in range [${e.start}..${e.end-1}]'); | |
213 } | 214 } |
214 return new Future.value(null); | 215 return new Future.value(null); |
215 } | 216 } |
216 | 217 |
217 String helpShort = 'Move down one or more frames (hotkey: [Page Down])'; | 218 String helpShort = 'Move down one or more frames (hotkey: [Page Down])'; |
218 | 219 |
219 String helpLong = 'Move down one or more frames.\n' | 220 String helpLong = 'Move down one or more frames.\n' |
220 '\n' | 221 '\n' |
221 'Hotkey: [Page Down]\n' | 222 'Hotkey: [Page Down]\n' |
222 '\n' | 223 '\n' |
(...skipping 13 matching lines...) Expand all Loading... | |
236 return new Future.value(null); | 237 return new Future.value(null); |
237 } | 238 } |
238 if (debugger.currentFrame == null) { | 239 if (debugger.currentFrame == null) { |
239 debugger.console.print('No stack'); | 240 debugger.console.print('No stack'); |
240 return new Future.value(null); | 241 return new Future.value(null); |
241 } | 242 } |
242 try { | 243 try { |
243 debugger.upFrame(count); | 244 debugger.upFrame(count); |
244 debugger.console.print('frame = ${debugger.currentFrame}'); | 245 debugger.console.print('frame = ${debugger.currentFrame}'); |
245 } on RangeError catch (e) { | 246 } on RangeError catch (e) { |
246 debugger.console.print('frame must be in range [${e.start},${e.end-1}]'); | 247 debugger.console.print( |
248 'frame must be in range [${e.start}..${e.end-1}]'); | |
247 } | 249 } |
248 return new Future.value(null); | 250 return new Future.value(null); |
249 } | 251 } |
250 | 252 |
251 String helpShort = 'Move up one or more frames (hotkey: [Page Up])'; | 253 String helpShort = 'Move up one or more frames (hotkey: [Page Up])'; |
252 | 254 |
253 String helpLong = 'Move up one or more frames.\n' | 255 String helpLong = 'Move up one or more frames.\n' |
254 '\n' | 256 '\n' |
255 'Hotkey: [Page Up]\n' | 257 'Hotkey: [Page Up]\n' |
256 '\n' | 258 '\n' |
(...skipping 15 matching lines...) Expand all Loading... | |
272 return new Future.value(null); | 274 return new Future.value(null); |
273 } | 275 } |
274 if (debugger.currentFrame == null) { | 276 if (debugger.currentFrame == null) { |
275 debugger.console.print('No stack'); | 277 debugger.console.print('No stack'); |
276 return new Future.value(null); | 278 return new Future.value(null); |
277 } | 279 } |
278 try { | 280 try { |
279 debugger.currentFrame = frame; | 281 debugger.currentFrame = frame; |
280 debugger.console.print('frame = ${debugger.currentFrame}'); | 282 debugger.console.print('frame = ${debugger.currentFrame}'); |
281 } on RangeError catch (e) { | 283 } on RangeError catch (e) { |
282 debugger.console.print('frame must be in range [${e.start},${e.end-1}]'); | 284 debugger.console.print( |
285 'frame must be in range [${e.start}..${e.end-1}]'); | |
283 } | 286 } |
284 return new Future.value(null); | 287 return new Future.value(null); |
285 } | 288 } |
286 | 289 |
287 String helpShort = 'Set the current frame'; | 290 String helpShort = 'Set the current frame'; |
288 | 291 |
289 String helpLong = 'Set the current frame.\n' | 292 String helpLong = 'Set the current frame.\n' |
290 '\n' | 293 '\n' |
291 'Syntax: frame <number>\n' | 294 'Syntax: frame <number>\n' |
292 ' f <count>\n'; | 295 ' f <count>\n'; |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
396 | 399 |
397 String helpLong = | 400 String helpLong = |
398 'Continue running the isolate until it reaches the next source ' | 401 'Continue running the isolate until it reaches the next source ' |
399 'location.\n' | 402 'location.\n' |
400 '\n' | 403 '\n' |
401 'Hotkey: [F10]\n' | 404 'Hotkey: [F10]\n' |
402 '\n' | 405 '\n' |
403 'Syntax: step\n'; | 406 'Syntax: step\n'; |
404 } | 407 } |
405 | 408 |
409 class RewindCommand extends DebuggerCommand { | |
410 RewindCommand(Debugger debugger) : super(debugger, 'rewind', []); | |
411 | |
412 Future run(List<String> args) async { | |
413 try { | |
414 int count = 1; | |
415 if (args.length == 1) { | |
416 count = int.parse(args[0]); | |
417 } else if (args.length > 1) { | |
418 debugger.console.print('rewind expects 0 or 1 argument'); | |
419 return; | |
420 } else if (count < 1 || count > debugger.stackDepth) { | |
421 debugger.console.print( | |
422 'frame must be in range [1..${debugger.stackDepth - 1}]'); | |
423 return; | |
424 } | |
425 await debugger.rewind(count); | |
426 } on S.ServerRpcException catch(e) { | |
427 if (e.code == S.ServerRpcException.kCannotResume) { | |
428 debugger.console.printRed(e.data['details']); | |
429 } else { | |
430 rethrow; | |
431 } | |
432 } | |
433 } | |
434 | |
435 String helpShort = 'Rewind the stack to a previous frame'; | |
436 | |
437 String helpLong = | |
438 'Rewind the stack to a previous frame.\n' | |
439 '\n' | |
440 'Syntax: rewind\n' | |
441 ' rewind <count>\n'; | |
442 } | |
443 | |
444 class ReloadCommand extends DebuggerCommand { | |
445 ReloadCommand(Debugger debugger) : super(debugger, 'reload', []); | |
446 | |
447 Future run(List<String> args) async { | |
448 try { | |
449 int count = 1; | |
450 if (args.length > 0) { | |
451 debugger.console.print('reload expects no arguments'); | |
452 return; | |
453 } | |
454 await debugger.isolate.reloadSources(); | |
455 // debugger.clearStack(); | |
456 debugger.console.print('reload complete'); | |
457 await debugger.refreshStack(); | |
458 } on S.ServerRpcException catch(e) { | |
459 if (e.code == S.ServerRpcException.kIsolateReloadBarred || | |
460 e.code == S.ServerRpcException.kIsolateReloadFailed || | |
461 e.code == S.ServerRpcException.kIsolateIsReloading) { | |
462 debugger.console.printRed(e.data['details']); | |
463 } else { | |
464 rethrow; | |
465 } | |
466 } | |
467 } | |
468 | |
469 String helpShort = 'Reload the sources for the current isolate'; | |
470 | |
471 String helpLong = | |
472 'Reload the sources for the current isolate.\n' | |
473 '\n' | |
474 'Syntax: reload\n'; | |
475 } | |
476 | |
406 class ClsCommand extends DebuggerCommand { | 477 class ClsCommand extends DebuggerCommand { |
407 ClsCommand(Debugger debugger) : super(debugger, 'cls', []) {} | 478 ClsCommand(Debugger debugger) : super(debugger, 'cls', []) {} |
408 | 479 |
409 Future run(List<String> args) { | 480 Future run(List<String> args) { |
410 debugger.console.clear(); | 481 debugger.console.clear(); |
411 debugger.console.newline(); | 482 debugger.console.newline(); |
412 return new Future.value(null); | 483 return new Future.value(null); |
413 } | 484 } |
414 | 485 |
415 String helpShort = 'Clear the console'; | 486 String helpShort = 'Clear the console'; |
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
656 debugger.console.print('Unable to set breakpoint at ${loc}'); | 727 debugger.console.print('Unable to set breakpoint at ${loc}'); |
657 } else { | 728 } else { |
658 rethrow; | 729 rethrow; |
659 } | 730 } |
660 } | 731 } |
661 } else { | 732 } else { |
662 assert(loc.script != null); | 733 assert(loc.script != null); |
663 var script = loc.script; | 734 var script = loc.script; |
664 await script.load(); | 735 await script.load(); |
665 if (loc.line < 1 || loc.line > script.lines.length) { | 736 if (loc.line < 1 || loc.line > script.lines.length) { |
666 debugger.console | 737 debugger.console.print( |
667 .print('line number must be in range [1,${script.lines.length}]'); | 738 'line number must be in range [1..${script.lines.length}]'); |
668 return; | 739 return; |
669 } | 740 } |
670 try { | 741 try { |
671 await debugger.isolate.addBreakpoint(script, loc.line, loc.col); | 742 await debugger.isolate.addBreakpoint(script, loc.line, loc.col); |
672 } on S.ServerRpcException catch (e) { | 743 } on S.ServerRpcException catch (e) { |
673 if (e.code == S.ServerRpcException.kCannotAddBreakpoint) { | 744 if (e.code == S.ServerRpcException.kCannotAddBreakpoint) { |
674 debugger.console.print('Unable to set breakpoint at ${loc}'); | 745 debugger.console.print('Unable to set breakpoint at ${loc}'); |
675 } else { | 746 } else { |
676 rethrow; | 747 rethrow; |
677 } | 748 } |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
737 } | 808 } |
738 if (loc.function != null) { | 809 if (loc.function != null) { |
739 debugger.console.print('Ignoring breakpoint at $loc: ' | 810 debugger.console.print('Ignoring breakpoint at $loc: ' |
740 'Clearing function breakpoints not yet implemented'); | 811 'Clearing function breakpoints not yet implemented'); |
741 return; | 812 return; |
742 } | 813 } |
743 | 814 |
744 var script = loc.script; | 815 var script = loc.script; |
745 if (loc.line < 1 || loc.line > script.lines.length) { | 816 if (loc.line < 1 || loc.line > script.lines.length) { |
746 debugger.console | 817 debugger.console |
747 .print('line number must be in range [1,${script.lines.length}]'); | 818 .print('line number must be in range [1..${script.lines.length}]'); |
748 return; | 819 return; |
749 } | 820 } |
750 var lineInfo = script.getLine(loc.line); | 821 var lineInfo = script.getLine(loc.line); |
751 var bpts = lineInfo.breakpoints; | 822 var bpts = lineInfo.breakpoints; |
752 var foundBreakpoint = false; | 823 var foundBreakpoint = false; |
753 if (bpts != null) { | 824 if (bpts != null) { |
754 var bptList = bpts.toList(); | 825 var bptList = bpts.toList(); |
755 for (var bpt in bptList) { | 826 for (var bpt in bptList) { |
756 if (loc.col == null || | 827 if (loc.col == null || |
757 loc.col == script.tokenToCol(bpt.location.tokenPos)) { | 828 loc.col == script.tokenToCol(bpt.location.tokenPos)) { |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
892 String helpLong = 'Show current frame.\n' | 963 String helpLong = 'Show current frame.\n' |
893 '\n' | 964 '\n' |
894 'Syntax: info frame\n'; | 965 'Syntax: info frame\n'; |
895 } | 966 } |
896 | 967 |
897 class IsolateCommand extends DebuggerCommand { | 968 class IsolateCommand extends DebuggerCommand { |
898 IsolateCommand(Debugger debugger) | 969 IsolateCommand(Debugger debugger) |
899 : super(debugger, 'isolate', [ | 970 : super(debugger, 'isolate', [ |
900 new IsolateListCommand(debugger), | 971 new IsolateListCommand(debugger), |
901 new IsolateNameCommand(debugger), | 972 new IsolateNameCommand(debugger), |
902 new IsolateReloadCommand(debugger), | |
903 ]) { | 973 ]) { |
904 alias = 'i'; | 974 alias = 'i'; |
905 } | 975 } |
906 | 976 |
907 Future run(List<String> args) { | 977 Future run(List<String> args) { |
908 if (args.length != 1) { | 978 if (args.length != 1) { |
909 debugger.console.print('isolate expects one argument'); | 979 debugger.console.print('isolate expects one argument'); |
910 return new Future.value(null); | 980 return new Future.value(null); |
911 } | 981 } |
912 var arg = args[0].trim(); | 982 var arg = args[0].trim(); |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1035 return debugger.isolate.setName(args[0]); | 1105 return debugger.isolate.setName(args[0]); |
1036 } | 1106 } |
1037 | 1107 |
1038 String helpShort = 'Rename the current isolate'; | 1108 String helpShort = 'Rename the current isolate'; |
1039 | 1109 |
1040 String helpLong = 'Rename the current isolate.\n' | 1110 String helpLong = 'Rename the current isolate.\n' |
1041 '\n' | 1111 '\n' |
1042 'Syntax: isolate name <name>\n'; | 1112 'Syntax: isolate name <name>\n'; |
1043 } | 1113 } |
1044 | 1114 |
1045 class IsolateReloadCommand extends DebuggerCommand { | |
1046 IsolateReloadCommand(Debugger debugger) : super(debugger, 'reload', []); | |
1047 | |
1048 Future run(List<String> args) async { | |
1049 if (debugger.isolate == null) { | |
1050 debugger.console.print('There is no current vm'); | |
1051 return; | |
1052 } | |
1053 | |
1054 await debugger.isolate.reloadSources(); | |
1055 | |
1056 debugger.console.print('Isolate reloading....'); | |
1057 } | |
1058 | |
1059 String helpShort = 'Reload the sources for the current isolate.'; | |
1060 | |
1061 String helpLong = 'Reload the sources for the current isolate.\n' | |
1062 '\n' | |
1063 'Syntax: reload\n'; | |
1064 } | |
1065 | |
1066 class InfoCommand extends DebuggerCommand { | 1115 class InfoCommand extends DebuggerCommand { |
1067 InfoCommand(Debugger debugger) | 1116 InfoCommand(Debugger debugger) |
1068 : super(debugger, 'info', [ | 1117 : super(debugger, 'info', [ |
1069 new InfoBreakpointsCommand(debugger), | 1118 new InfoBreakpointsCommand(debugger), |
1070 new InfoFrameCommand(debugger) | 1119 new InfoFrameCommand(debugger) |
1071 ]); | 1120 ]); |
1072 | 1121 |
1073 Future run(List<String> args) { | 1122 Future run(List<String> args) { |
1074 debugger.console.print("'info' expects a subcommand (see 'help info')"); | 1123 debugger.console.print("'info' expects a subcommand (see 'help info')"); |
1075 return new Future.value(null); | 1124 return new Future.value(null); |
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1364 new DeleteCommand(this), | 1413 new DeleteCommand(this), |
1365 new DownCommand(this), | 1414 new DownCommand(this), |
1366 new FinishCommand(this), | 1415 new FinishCommand(this), |
1367 new FrameCommand(this), | 1416 new FrameCommand(this), |
1368 new HelpCommand(this), | 1417 new HelpCommand(this), |
1369 new InfoCommand(this), | 1418 new InfoCommand(this), |
1370 new IsolateCommand(this), | 1419 new IsolateCommand(this), |
1371 new LogCommand(this), | 1420 new LogCommand(this), |
1372 new PauseCommand(this), | 1421 new PauseCommand(this), |
1373 new PrintCommand(this), | 1422 new PrintCommand(this), |
1423 new ReloadCommand(this), | |
1374 new RefreshCommand(this), | 1424 new RefreshCommand(this), |
1425 new RewindCommand(this), | |
1375 new SetCommand(this), | 1426 new SetCommand(this), |
1376 new SmartNextCommand(this), | 1427 new SmartNextCommand(this), |
1377 new StepCommand(this), | 1428 new StepCommand(this), |
1378 new SyncNextCommand(this), | 1429 new SyncNextCommand(this), |
1379 new UpCommand(this), | 1430 new UpCommand(this), |
1380 new VmCommand(this), | 1431 new VmCommand(this), |
1381 ], _history); | 1432 ], _history); |
1382 _consolePrinter = new _ConsoleStreamPrinter(this); | 1433 _consolePrinter = new _ConsoleStreamPrinter(this); |
1383 } | 1434 } |
1384 | 1435 |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1449 | 1500 |
1450 void warnOutOfDate() { | 1501 void warnOutOfDate() { |
1451 // Wait a bit, then tell the user that the stack may be out of date. | 1502 // Wait a bit, then tell the user that the stack may be out of date. |
1452 new Timer(const Duration(seconds: 2), () { | 1503 new Timer(const Duration(seconds: 2), () { |
1453 if (!isolatePaused()) { | 1504 if (!isolatePaused()) { |
1454 stackElement.isSampled = true; | 1505 stackElement.isSampled = true; |
1455 } | 1506 } |
1456 }); | 1507 }); |
1457 } | 1508 } |
1458 | 1509 |
1510 void clearStack() { | |
1511 stackElement.clearStack(); | |
1512 } | |
1513 | |
1459 Future<S.ServiceMap> _refreshStack(M.DebugEvent pauseEvent) { | 1514 Future<S.ServiceMap> _refreshStack(M.DebugEvent pauseEvent) { |
1460 return isolate.getStack().then((result) { | 1515 return isolate.getStack().then((result) { |
1461 if (result.isSentinel) { | 1516 if (result.isSentinel) { |
1462 // The isolate has gone away. The IsolateExit event will | 1517 // The isolate has gone away. The IsolateExit event will |
1463 // clear the isolate for the debugger page. | 1518 // clear the isolate for the debugger page. |
1464 return; | 1519 return; |
1465 } | 1520 } |
1466 stack = result; | 1521 stack = result; |
1467 stackElement.updateStack(stack, pauseEvent); | 1522 stackElement.updateStack(stack, pauseEvent); |
1468 if (stack['frames'].length > 0) { | 1523 if (stack['frames'].length > 0) { |
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1872 if (event is M.PauseExitEvent) { | 1927 if (event is M.PauseExitEvent) { |
1873 console.print("Type 'continue' [F7] to exit the isolate"); | 1928 console.print("Type 'continue' [F7] to exit the isolate"); |
1874 return new Future.value(null); | 1929 return new Future.value(null); |
1875 } | 1930 } |
1876 return isolate.stepInto(); | 1931 return isolate.stepInto(); |
1877 } else { | 1932 } else { |
1878 console.print('The program is already running'); | 1933 console.print('The program is already running'); |
1879 return new Future.value(null); | 1934 return new Future.value(null); |
1880 } | 1935 } |
1881 } | 1936 } |
1937 | |
1938 Future rewind(int count) { | |
1939 if (isolatePaused()) { | |
1940 var event = isolate.pauseEvent; | |
1941 if (event is M.PauseExitEvent) { | |
1942 console.print("Type 'continue' [F7] to exit the isolate"); | |
1943 return new Future.value(null); | |
1944 } | |
1945 return isolate.rewind(count); | |
1946 } else { | |
1947 console.print('The program must be paused'); | |
1948 return new Future.value(null); | |
1949 } | |
1950 } | |
1882 } | 1951 } |
1883 | 1952 |
1884 class DebuggerPageElement extends HtmlElement implements Renderable { | 1953 class DebuggerPageElement extends HtmlElement implements Renderable { |
1885 static const tag = | 1954 static const tag = |
1886 const Tag<DebuggerPageElement>('debugger-page', dependencies: const [ | 1955 const Tag<DebuggerPageElement>('debugger-page', dependencies: const [ |
1887 NavTopMenuElement.tag, | 1956 NavTopMenuElement.tag, |
1888 NavVMMenuElement.tag, | 1957 NavVMMenuElement.tag, |
1889 NavIsolateMenuElement.tag, | 1958 NavIsolateMenuElement.tag, |
1890 NavNotifyElement.tag, | 1959 NavNotifyElement.tag, |
1891 ]); | 1960 ]); |
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2266 | 2335 |
2267 hasMessages = messageElements.isNotEmpty; | 2336 hasMessages = messageElements.isNotEmpty; |
2268 } | 2337 } |
2269 | 2338 |
2270 void updateStack(S.ServiceMap newStack, M.DebugEvent pauseEvent) { | 2339 void updateStack(S.ServiceMap newStack, M.DebugEvent pauseEvent) { |
2271 updateStackFrames(newStack); | 2340 updateStackFrames(newStack); |
2272 updateStackMessages(newStack); | 2341 updateStackMessages(newStack); |
2273 isSampled = pauseEvent == null; | 2342 isSampled = pauseEvent == null; |
2274 } | 2343 } |
2275 | 2344 |
2345 void clearStack() { | |
2346 List frameElements = _frameList.children; | |
Cutch
2016/11/22 22:27:50
can we not just call clear on the lists?
turnidge
2016/11/22 22:54:06
Turns out this code was dead. Removed.
| |
2347 for (int i = 0; i < frameElements.length; i++) { | |
2348 frameElements.removeAt(0); | |
2349 } | |
2350 List messageElements = _messageList.children; | |
2351 for (int i = 0; i < messageElements.length; i++) { | |
2352 messageElements.removeAt(0); | |
2353 } | |
2354 } | |
2355 | |
2276 void setCurrentFrame(int value) { | 2356 void setCurrentFrame(int value) { |
2277 currentFrame = value; | 2357 currentFrame = value; |
2278 List frameElements = _frameList.children; | 2358 List frameElements = _frameList.children; |
2279 for (var frameElement in frameElements) { | 2359 for (var frameElement in frameElements) { |
2280 DebuggerFrameElement dbgFrameElement = frameElement.children[0]; | 2360 DebuggerFrameElement dbgFrameElement = frameElement.children[0]; |
2281 if (dbgFrameElement.frame.index == currentFrame) { | 2361 if (dbgFrameElement.frame.index == currentFrame) { |
2282 dbgFrameElement.setCurrent(true); | 2362 dbgFrameElement.setCurrent(true); |
2283 } else { | 2363 } else { |
2284 dbgFrameElement.setCurrent(false); | 2364 dbgFrameElement.setCurrent(false); |
2285 } | 2365 } |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2506 ..classes = ['frameSummary'] | 2586 ..classes = ['frameSummary'] |
2507 ..children = content | 2587 ..children = content |
2508 ]; | 2588 ]; |
2509 } | 2589 } |
2510 | 2590 |
2511 String makeExpandKey(String key) { | 2591 String makeExpandKey(String key) { |
2512 return '${_frame.function.qualifiedName}/${key}'; | 2592 return '${_frame.function.qualifiedName}/${key}'; |
2513 } | 2593 } |
2514 | 2594 |
2515 bool matchFrame(S.Frame newFrame) { | 2595 bool matchFrame(S.Frame newFrame) { |
2516 return newFrame.function.id == _frame.function.id; | 2596 return (newFrame.function.id == _frame.function.id && |
2597 newFrame.location.script.id == | |
2598 frame.location.script.id); | |
2517 } | 2599 } |
2518 | 2600 |
2519 void updateFrame(S.Frame newFrame) { | 2601 void updateFrame(S.Frame newFrame) { |
2520 assert(matchFrame(newFrame)); | 2602 assert(matchFrame(newFrame)); |
2521 _frame = newFrame; | 2603 _frame = newFrame; |
2522 } | 2604 } |
2523 | 2605 |
2524 S.Script get script => _frame.location.script; | 2606 S.Script get script => _frame.location.script; |
2525 | 2607 |
2526 int _varsTop(varsDiv) { | 2608 int _varsTop(varsDiv) { |
(...skipping 663 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3190 ..setAttribute('height', '24') | 3272 ..setAttribute('height', '24') |
3191 ..children = [ | 3273 ..children = [ |
3192 new PathElement() | 3274 new PathElement() |
3193 ..setAttribute( | 3275 ..setAttribute( |
3194 'd', | 3276 'd', |
3195 'M11 17h2v-6h-2v6zm1-15C6.48 2 2 6.48 2 12s4.48 10 ' | 3277 'M11 17h2v-6h-2v6zm1-15C6.48 2 2 6.48 2 12s4.48 10 ' |
3196 '10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 ' | 3278 '10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 ' |
3197 '0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zM11 ' | 3279 '0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zM11 ' |
3198 '9h2V7h-2v2z') | 3280 '9h2V7h-2v2z') |
3199 ]; | 3281 ]; |
OLD | NEW |