mirror of
https://github.com/dart-lang/sdk
synced 2024-09-19 14:43:32 +00:00
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:
parent
b31af3710a
commit
9a0cbfe8da
|
@ -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) \
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue