// Copyright (c) 2019, 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.

#include "vm/thread_state.h"

#include "vm/handles_impl.h"
#include "vm/zone.h"

namespace dart {

ThreadState::ThreadState(bool is_os_thread) : BaseThread(is_os_thread) {}

ThreadState::~ThreadState() {}

bool ThreadState::IsValidZoneHandle(Dart_Handle object) const {
  Zone* zone = this->zone();
  while (zone != nullptr) {
    if (zone->handles()->IsValidZoneHandle(reinterpret_cast<uword>(object))) {
      return true;
    }
    zone = zone->previous();
  }
  return false;
}

intptr_t ThreadState::CountZoneHandles() const {
  intptr_t count = 0;
  Zone* zone = this->zone();
  while (zone != nullptr) {
    count += zone->handles()->CountZoneHandles();
    zone = zone->previous();
  }
  ASSERT(count >= 0);
  return count;
}

bool ThreadState::IsValidScopedHandle(Dart_Handle object) const {
  Zone* zone = this->zone();
  while (zone != nullptr) {
    if (zone->handles()->IsValidScopedHandle(reinterpret_cast<uword>(object))) {
      return true;
    }
    zone = zone->previous();
  }
  return false;
}

intptr_t ThreadState::CountScopedHandles() const {
  intptr_t count = 0;
  Zone* zone = this->zone();
  while (zone != nullptr) {
    count += zone->handles()->CountScopedHandles();
    zone = zone->previous();
  }
  ASSERT(count >= 0);
  return count;
}

}  // namespace dart
