Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(62)

Side by Side Diff: runtime/bin/vmservice/client/lib/src/observatory/model.dart

Issue 182703003: Cleanup native, collected, and stub code handling in profiler (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 part of observatory; 5 part of observatory;
6 6
7 class CodeInstruction extends Observable { 7 class CodeInstruction extends Observable {
8 @observable final int address; 8 @observable final int address;
9 @observable final String machine; 9 @observable final String machine;
10 @observable final String human; 10 @observable final String human;
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 @observable String name; 81 @observable String name;
82 @observable String userName; 82 @observable String userName;
83 83
84 Code(this.kind, this.name, this.startAddress, this.endAddress); 84 Code(this.kind, this.name, this.startAddress, this.endAddress);
85 85
86 Code.fromMap(Map map) : 86 Code.fromMap(Map map) :
87 kind = CodeKind.Dart, 87 kind = CodeKind.Dart,
88 startAddress = int.parse(map['start'], radix: 16), 88 startAddress = int.parse(map['start'], radix: 16),
89 endAddress = int.parse(map['end'], radix: 16) { 89 endAddress = int.parse(map['end'], radix: 16) {
90 functionRef = toObservable(map['function']); 90 functionRef = toObservable(map['function']);
91 codeRef = toObservable({ 91 codeRef = toObservable(map);
92 'type': '@Code',
93 'id': map['id'],
94 'name': map['name'],
95 'user_name': map['user_name']
96 });
97 name = map['name']; 92 name = map['name'];
98 userName = map['user_name']; 93 userName = map['user_name'];
99 if (map['disassembly'] != null) { 94 if (map['disassembly'] != null) {
100 _loadInstructions(map['disassembly']); 95 _loadInstructions(map['disassembly']);
101 } 96 }
102 } 97 }
103 98
104 factory Code.fromProfileMap(Map map) { 99 factory Code.fromProfileMap(Map map) {
105 var kind = CodeKind.fromString(map['kind']); 100 var kind = CodeKind.fromString(map['kind']);
106 var startAddress; 101 var startAddress;
107 var endAddress; 102 var endAddress;
108 var name; 103 var name;
109 var userName; 104 var userName;
110 var codeRef; 105 var codeRef = map['code'];
111 var functionRef; 106 assert(codeRef != null);
112 // Initial extraction of startAddress, endAddress, and name depends on what 107 startAddress = int.parse(codeRef['start'], radix:16);
113 // kind of code this is and whether or not the code has been collected. 108 endAddress = int.parse(codeRef['end'], radix:16);
114 if (kind == CodeKind.Dart) { 109 name = codeRef['name'];
115 var code = map['code']; 110 userName = codeRef['user_name'];
116 if (code != null) {
117 // Extract from Dart code.
118 startAddress = int.parse(code['start'], radix:16);
119 endAddress = int.parse(code['end'], radix:16);
120 name = code['name'];
121 userName = code['user_name'];
122 codeRef = toObservable({
123 'type': '@Code',
124 'id': code['id'],
125 'name': name,
126 'user_name': userName
127 });
128 functionRef = toObservable(code['function']);
129 }
130 }
131 if (startAddress == null) {
132 // Extract from Profile code.
133 // This is either a native or collected piece of code.
134 startAddress = int.parse(map['start'], radix:16);
135 endAddress = int.parse(map['end'], radix: 16);
136 name = map['name'];
137 userName = name;
138 }
139 var code = new Code(kind, name, startAddress, endAddress); 111 var code = new Code(kind, name, startAddress, endAddress);
140 code.codeRef = codeRef; 112 code.codeRef = codeRef;
141 code.functionRef = functionRef; 113 code.functionRef = toObservable(codeRef['function']);;
142 code.userName = userName; 114 code.userName = userName;
143 if (map['disassembly'] != null) { 115 if (codeRef['disassembly'] != null) {
144 code._loadInstructions(map['disassembly']); 116 code._loadInstructions(codeRef['disassembly']);
117 // Throw the JSON version away after loading the disassembly.
118 codeRef['disassembly'] = null;
145 } 119 }
146 return code; 120 return code;
147 } 121 }
148 122
149 // Refresh tick counts, etc for a code object. 123 // Refresh tick counts, etc for a code object.
150 void _refresh(Map map) { 124 void _refresh(Map map) {
151 inclusiveTicks = int.parse(map['inclusive_ticks']); 125 inclusiveTicks = int.parse(map['inclusive_ticks']);
152 exclusiveTicks = int.parse(map['exclusive_ticks']); 126 exclusiveTicks = int.parse(map['exclusive_ticks']);
153 // Load address ticks. 127 // Load address ticks.
154 var ticksList = map['ticks']; 128 var ticksList = map['ticks'];
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
277 // and resolve callers and callees. 251 // and resolve callers and callees.
278 assert(_codeObjectsInImportOrder.length == codes.length); 252 assert(_codeObjectsInImportOrder.length == codes.length);
279 for (var i = 0; i < codes.length; i++) { 253 for (var i = 0; i < codes.length; i++) {
280 Code code = _codeObjectsInImportOrder[i]; 254 Code code = _codeObjectsInImportOrder[i];
281 code.resolveCalls(codes[i], _codeObjectsInImportOrder); 255 code.resolveCalls(codes[i], _codeObjectsInImportOrder);
282 } 256 }
283 _codeObjectsInImportOrder.clear(); 257 _codeObjectsInImportOrder.clear();
284 } 258 }
285 259
286 int _extractCodeStartAddress(Map code) { 260 int _extractCodeStartAddress(Map code) {
287 var kind = CodeKind.fromString(code['kind']); 261 return int.parse(code['code']['start'], radix:16);
288 if ((kind == CodeKind.Dart) && (code['code'] != null)) {
289 // Start address is inside the dart code map.
290 return int.parse(code['code']['start'], radix:16);
291 }
292 // Start address is inside the profile code map.
293 return int.parse(code['start'], radix:16);
294 } 262 }
295 263
296 void _processCode(Map profileCode) { 264 void _processCode(Map profileCode) {
297 if (profileCode['type'] != 'ProfileCode') { 265 if (profileCode['type'] != 'ProfileCode') {
298 return; 266 return;
299 } 267 }
300 int address = _extractCodeStartAddress(profileCode); 268 int address = _extractCodeStartAddress(profileCode);
301 var code = isolate.findCodeByAddress(address); 269 var code = isolate.findCodeByAddress(address);
302 if (code == null) { 270 if (code == null) {
303 // Never seen a code object at this address before, create a new one. 271 // Never seen a code object at this address before, create a new one.
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
413 if (executableLines == 0) { 381 if (executableLines == 0) {
414 return 0.0; 382 return 0.0;
415 } 383 }
416 return (coveredLines / executableLines) * 100.0; 384 return (coveredLines / executableLines) * 100.0;
417 } 385 }
418 386
419 @observable String coveredPercentageFormatted() { 387 @observable String coveredPercentageFormatted() {
420 return '(' + coveredPercentage().toStringAsFixed(1) + '% covered)'; 388 return '(' + coveredPercentage().toStringAsFixed(1) + '% covered)';
421 } 389 }
422 } 390 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698