| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | |
| 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. | |
| 4 | |
| 5 part of dart.vmstats; | |
| 6 | |
| 7 class IsolateList { | |
| 8 TableElement _isolateTable; | |
| 9 | |
| 10 static const String DETAILS = 'isolate_details'; | |
| 11 static const String VISIBLE = 'visible'; | |
| 12 static const String HIDDEN = 'hidden'; | |
| 13 static const String ISOLATE_LIST_ITEM = 'isolate_list_item'; | |
| 14 static const String ISOLATE_DETAILS_COLUMN = 'isolate_details_column'; | |
| 15 static const String ISOLATE_ROW = 'isolate_row'; | |
| 16 static const String ISOLATE_STACKTRACE_COLUMN = 'isolate_stacktrace_column'; | |
| 17 static const String NEW_SPACE = 'new_space'; | |
| 18 static const String OLD_SPACE = 'old_space'; | |
| 19 static const String STACK_FRAME = 'stack_frame'; | |
| 20 static const String EMPTY_STACK_FRAME = 'empty_stack_frame'; | |
| 21 static const String STACK_LIMIT = 'stack_limit'; | |
| 22 static const String STACK_TRACE = 'stack_trace'; | |
| 23 static const String STACK_TRACE_TITLE = 'stack_trace_title'; | |
| 24 | |
| 25 IsolateList(this._isolateTable) {} | |
| 26 | |
| 27 void updateList(IsolateListModel model) { | |
| 28 var iterator = model.iterator; | |
| 29 while (iterator.moveNext()) { | |
| 30 var isolate = iterator.current; | |
| 31 var isolateId = 'isolate-${isolate.port}'; | |
| 32 var isolateRow = _isolateTable.query('#$isolateId'); | |
| 33 if (isolateRow != null) { | |
| 34 updateIsolateDetails(isolate, isolateRow); | |
| 35 } else { | |
| 36 isolateRow = new TableRowElement(); | |
| 37 isolateRow.$dom_className = ISOLATE_ROW; | |
| 38 isolateRow.id = isolateId; | |
| 39 _isolateTable.children.add(isolateRow); | |
| 40 var detailsCell = new TableCellElement(); | |
| 41 detailsCell.$dom_className = ISOLATE_DETAILS_COLUMN; | |
| 42 isolateRow.children.add(detailsCell); | |
| 43 var basicData = new DivElement(); | |
| 44 basicData.text = isolate.name | |
| 45 .replaceAll('\$', ': ') // Split script from isolate, and ... | |
| 46 .replaceAll('-', ' '); // ... split name from port number. | |
| 47 detailsCell.children.add(basicData); | |
| 48 | |
| 49 // Add isolate details as hidden children. | |
| 50 var details = new DivElement(); | |
| 51 details.classes.addAll([DETAILS, HIDDEN]); | |
| 52 detailsCell.children.add(details); | |
| 53 | |
| 54 // Add stacktrace column. | |
| 55 var stacktraceCell = new TableCellElement(); | |
| 56 stacktraceCell.classes.addAll([ISOLATE_STACKTRACE_COLUMN, HIDDEN]); | |
| 57 isolateRow.children.add(stacktraceCell); | |
| 58 var stacktrace = new DivElement(); | |
| 59 stacktrace.classes.addAll([STACK_TRACE, HIDDEN]); | |
| 60 stacktraceCell.children.add(stacktrace); | |
| 61 | |
| 62 isolateRow.onClick.listen((e) => toggleRow(isolateRow)); | |
| 63 updateIsolateDetails(isolate, isolateRow); | |
| 64 } | |
| 65 } | |
| 66 } | |
| 67 | |
| 68 void setStacktrace(DivElement element, String json) { | |
| 69 element.children.clear(); | |
| 70 var response = JSON.parse(json); | |
| 71 element.id = response['handle']; | |
| 72 var title = new DivElement(); | |
| 73 title.$dom_className = STACK_TRACE_TITLE; | |
| 74 title.text = "Stack Trace"; | |
| 75 element.children.add(title); | |
| 76 | |
| 77 var stackTrace = response['stacktrace']; | |
| 78 if (stackTrace.length > 0) { | |
| 79 var stackIterator = response['stacktrace'].iterator; | |
| 80 var i = 0; | |
| 81 while (stackIterator.moveNext()) { | |
| 82 i++; | |
| 83 var frame = stackIterator.current; | |
| 84 var frameElement = new DivElement(); | |
| 85 var text = '$i: ${frame["url"]}:${frame["line"]}: ${frame["function"]}'; | |
| 86 var code = frame["code"]; | |
| 87 if (code['optimized']) { | |
| 88 text = '$text (optimized)'; | |
| 89 } | |
| 90 frameElement.text = text; | |
| 91 frameElement.$dom_className = STACK_FRAME; | |
| 92 element.children.add(frameElement); | |
| 93 } | |
| 94 } else { | |
| 95 DivElement noStack = new DivElement(); | |
| 96 noStack.$dom_className = EMPTY_STACK_FRAME; | |
| 97 noStack.text = "<no stack>"; | |
| 98 element.children.add(noStack); | |
| 99 } | |
| 100 } | |
| 101 | |
| 102 Element findOrAddChild(DivElement parent, String className) { | |
| 103 var child = parent.query('.$className'); | |
| 104 if (child == null) { | |
| 105 child = new DivElement(); | |
| 106 child.$dom_className = className; | |
| 107 parent.children.add(child); | |
| 108 } | |
| 109 return child; | |
| 110 } | |
| 111 | |
| 112 void updateIsolateDetails(Isolate isolate, TableRowElement row) { | |
| 113 var details = row.query('.$DETAILS'); | |
| 114 var newSpace = findOrAddChild(details, NEW_SPACE); | |
| 115 newSpace.text = 'New space: ${isolate.newSpace.used}K'; | |
| 116 var oldSpace = findOrAddChild(details, OLD_SPACE); | |
| 117 oldSpace.text = 'Old space: ${isolate.oldSpace.used}K'; | |
| 118 var stackLimit = findOrAddChild(details, STACK_LIMIT); | |
| 119 stackLimit.text = | |
| 120 'Stack limit: ${(isolate.stackLimit.abs() / 1000000).round()}M'; | |
| 121 var stackTrace = findOrAddChild(row, ISOLATE_STACKTRACE_COLUMN); | |
| 122 HttpRequest.getString('/isolate/${isolate.handle}/stacktrace').then( | |
| 123 (String response) => setStacktrace(stackTrace, response)); | |
| 124 } | |
| 125 | |
| 126 void toggleRow(TableRowElement row) { | |
| 127 toggleElement(row.query('.$DETAILS')); | |
| 128 toggleElement(row.query('.$ISOLATE_STACKTRACE_COLUMN')); | |
| 129 } | |
| 130 | |
| 131 void toggleElement(Element e) { | |
| 132 e.classes.toggle(VISIBLE); | |
| 133 e.classes.toggle(HIDDEN); | |
| 134 } | |
| 135 } | |
| OLD | NEW |