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