// 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);
  }
}
