mirror of
https://github.com/dart-lang/sdk
synced 2024-11-02 12:24:24 +00:00
88 lines
2.3 KiB
C++
88 lines
2.3 KiB
C++
// 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_
|