Make fewer assumptions about the layout of api handles.

Found these problems by changing the layout and seeing what broke.
Review URL: https://chromiumcodereview.appspot.com//10915015

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@11647 260f80e4-7a28-3924-810f-c04153c831b5
This commit is contained in:
turnidge@google.com 2012-08-30 19:40:27 +00:00
parent b31af3710a
commit 9a0cbfe8da
4 changed files with 9 additions and 4 deletions

View file

@ -130,7 +130,7 @@ RawObject* Api::UnwrapHandle(Dart_Handle object) {
PersistentHandle::raw_offset() == 0 &&
LocalHandle::raw_offset() == 0);
#endif
return *(reinterpret_cast<RawObject**>(object));
return (reinterpret_cast<LocalHandle*>(object))->raw();
}
#define DEFINE_UNWRAP(type) \

View file

@ -113,17 +113,20 @@ class Api : AllStatic {
// Returns true if the handle holds a Smi.
static bool IsSmi(Dart_Handle handle) {
// TODO(turnidge): Assumes RawObject* is at offset zero. Fix.
RawObject* raw = *(reinterpret_cast<RawObject**>(handle));
return !raw->IsHeapObject();
}
// Returns the value of a Smi.
static intptr_t SmiValue(Dart_Handle handle) {
// TODO(turnidge): Assumes RawObject* is at offset zero. Fix.
uword value = *(reinterpret_cast<uword*>(handle));
return Smi::ValueFromRaw(value);
}
static intptr_t ClassId(Dart_Handle handle) {
// TODO(turnidge): Assumes RawObject* is at offset zero. Fix.
RawObject* raw = *(reinterpret_cast<RawObject**>(handle));
if (!raw->IsHeapObject()) {
return kSmiCid;

View file

@ -105,6 +105,7 @@ class PersistentHandle {
void set_raw(RawObject* ref) { raw_ = ref; }
void set_raw(const LocalHandle& ref) { raw_ = ref.raw(); }
void set_raw(const Object& object) { raw_ = object.raw(); }
RawObject** raw_addr() { return &raw_; }
static intptr_t raw_offset() { return OFFSET_OF(PersistentHandle, raw_); }
private:
@ -141,6 +142,7 @@ class FinalizablePersistentHandle {
void set_raw(RawObject* raw) { raw_ = raw; }
void set_raw(const LocalHandle& ref) { raw_ = ref.raw(); }
void set_raw(const Object& object) { raw_ = object.raw(); }
RawObject** raw_addr() { return &raw_; }
static intptr_t raw_offset() {
return OFFSET_OF(FinalizablePersistentHandle, raw_);
}
@ -391,14 +393,14 @@ class WeakReferenceSet {
RawObject** get_key(intptr_t i) {
ASSERT(i >= 0);
ASSERT(i < num_keys_);
return reinterpret_cast<RawObject**>(keys_[i]);
return (reinterpret_cast<PersistentHandle*>(keys_[i]))->raw_addr();
}
intptr_t num_values() const { return num_values_; }
RawObject** get_value(intptr_t i) {
ASSERT(i >= 0);
ASSERT(i < num_values_);
return reinterpret_cast<RawObject**>(values_[i]);
return (reinterpret_cast<PersistentHandle*>(values_[i]))->raw_addr();
}
static WeakReferenceSet* Pop(WeakReferenceSet** queue) {

View file

@ -195,7 +195,7 @@ class ScavengerWeakVisitor : public HandleVisitor {
void VisitHandle(uword addr) {
FinalizablePersistentHandle* handle =
reinterpret_cast<FinalizablePersistentHandle*>(addr);
RawObject** p = reinterpret_cast<RawObject**>(handle);
RawObject** p = handle->raw_addr();
if (scavenger_->IsUnreachable(p)) {
FinalizablePersistentHandle::Finalize(handle);
}