// Copyright (c) 2012, 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. #ifndef RUNTIME_VM_OBJECT_SET_H_ #define RUNTIME_VM_OBJECT_SET_H_ #include "platform/utils.h" #include "vm/bit_vector.h" #include "vm/globals.h" #include "vm/raw_object.h" #include "vm/zone.h" namespace dart { class ObjectSetRegion : public ZoneAllocated { public: ObjectSetRegion(Zone* zone, uword start, uword end) : start_(start), end_(end), bit_vector_(zone, (end - start) >> kWordSizeLog2), next_(NULL) {} bool ContainsAddress(uword address) { return address >= start_ && address < end_; } intptr_t IndexForAddress(uword address) { ASSERT(Utils::IsAligned(address, kWordSize)); return (address - start_) >> kWordSizeLog2; } void AddObject(uword address) { bit_vector_.Add(IndexForAddress(address)); } bool ContainsObject(uword address) { return bit_vector_.Contains(IndexForAddress(address)); } ObjectSetRegion* next() { return next_; } void set_next(ObjectSetRegion* region) { next_ = region; } private: uword start_; uword end_; BitVector bit_vector_; ObjectSetRegion* next_; }; class ObjectSet : public ZoneAllocated { public: explicit ObjectSet(Zone* zone) : zone_(zone), head_(NULL) {} void AddRegion(uword start, uword end) { ObjectSetRegion* region = new (zone_) ObjectSetRegion(zone_, start, end); region->set_next(head_); head_ = region; } bool Contains(RawObject* raw_obj) const { uword raw_addr = RawObject::ToAddr(raw_obj); for (ObjectSetRegion* region = head_; region != NULL; region = region->next()) { if (region->ContainsAddress(raw_addr)) { return region->ContainsObject(raw_addr); } } return false; } void Add(RawObject* raw_obj) { uword raw_addr = RawObject::ToAddr(raw_obj); for (ObjectSetRegion* region = head_; region != NULL; region = region->next()) { if (region->ContainsAddress(raw_addr)) { return region->AddObject(raw_addr); } } FATAL("Address not in any heap region"); } private: Zone* zone_; ObjectSetRegion* head_; }; } // namespace dart #endif // RUNTIME_VM_OBJECT_SET_H_