| // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file |
| |
| part of repositories; |
| |
| class AllocationProfileRepository implements M.AllocationProfileRepository { |
| static const _api = '_getAllocationProfile'; |
| static const _defaultsApi = '_getDefaultClassesAliases'; |
| |
| Future<M.AllocationProfile> get(M.IsolateRef i, |
| {bool gc: false, bool reset: false, bool combine: false}) async { |
| assert(gc != null); |
| assert(reset != null); |
| S.Isolate isolate = i as S.Isolate; |
| assert(isolate != null); |
| var params = {}; |
| if (gc) { |
| params['gc'] = 'true'; |
| } |
| if (reset) { |
| params['reset'] = true; |
| } |
| final dynamic response = await isolate.invokeRpc(_api, params); |
| Map defaults; |
| if (combine) { |
| defaults = await isolate.vm.invokeRpcNoUpgrade(_defaultsApi, {}); |
| defaults = defaults['map']; |
| } |
| isolate.updateHeapsFromMap(response['_heaps']); |
| for (S.ServiceMap clsAllocations in response['members']) { |
| S.Class cls = clsAllocations['class']; |
| if (cls == null) { |
| continue; |
| } |
| cls.newSpace.update(clsAllocations['_new']); |
| cls.oldSpace.update(clsAllocations['_old']); |
| } |
| return new AllocationProfile(response, defaults: defaults); |
| } |
| } |