blob: 5dc86671e8b613f4b57fc1b04e90392714a8cf09 [file] [log] [blame]
// 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);
}
}