| Index: runtime/vm/dart_api_state.h
|
| diff --git a/runtime/vm/dart_api_state.h b/runtime/vm/dart_api_state.h
|
| index 207aab425acc18a57be1f76b807d2252c6db02ad..c208065d722a12204a59c8c07cfef687c7a378b0 100644
|
| --- a/runtime/vm/dart_api_state.h
|
| +++ b/runtime/vm/dart_api_state.h
|
| @@ -203,7 +203,6 @@ class FinalizablePersistentHandle {
|
| public:
|
| static FinalizablePersistentHandle* New(
|
| Isolate* isolate,
|
| - bool is_prologue,
|
| const Object& object,
|
| void* peer,
|
| Dart_WeakPersistentHandleFinalizer callback,
|
| @@ -251,22 +250,13 @@ class FinalizablePersistentHandle {
|
| set_external_size(0);
|
| }
|
|
|
| - bool IsPrologueWeakPersistent() {
|
| - return PrologueWeakBit::decode(external_data_);
|
| - }
|
| -
|
| - void SetPrologueWeakPersistent(bool value) {
|
| - external_data_ = PrologueWeakBit::update(value, external_data_);
|
| - }
|
| -
|
| static FinalizablePersistentHandle* Cast(Dart_WeakPersistentHandle handle);
|
|
|
| private:
|
| enum {
|
| kExternalNewSpaceBit = 0,
|
| - kPrologueWeakBit = 1,
|
| - kExternalSizeBits = 2,
|
| - kExternalSizeBitsSize = (kBitsPerWord - 2),
|
| + kExternalSizeBits = 1,
|
| + kExternalSizeBitsSize = (kBitsPerWord - 1),
|
| };
|
|
|
| // This part of external_data_ is the number of externally allocated bytes.
|
| @@ -277,8 +267,6 @@ class FinalizablePersistentHandle {
|
| // This bit of external_data_ is true if the referent was created in new
|
| // space and UpdateRelocated has not yet detected any promotion.
|
| class ExternalNewSpaceBit : public BitField<bool, kExternalNewSpaceBit, 1> {};
|
| - // This bit is used to indicate that it is a prologue weak persistent handle.
|
| - class PrologueWeakBit : public BitField<bool, kPrologueWeakBit, 1> {};
|
|
|
| friend class FinalizablePersistentHandles;
|
|
|
| @@ -673,11 +661,6 @@ class ApiGrowableArray : public BaseGrowableArray<T, ValueObject> {
|
| };
|
|
|
|
|
| -// Forward declarations.
|
| -class WeakReferenceSetBuilder;
|
| -class WeakReferenceSet;
|
| -
|
| -
|
| // Implementation of the API State used in dart api for maintaining
|
| // local scopes, persistent handles etc. These are setup on a per isolate
|
| // basis and destroyed when the isolate is shutdown.
|
| @@ -685,10 +668,8 @@ class ApiState {
|
| public:
|
| ApiState() : persistent_handles_(),
|
| weak_persistent_handles_(),
|
| - prologue_weak_persistent_handles_(),
|
| reusable_scope_(NULL),
|
| top_scope_(NULL),
|
| - delayed_weak_reference_sets_(NULL),
|
| null_(NULL),
|
| true_(NULL),
|
| false_(NULL),
|
| @@ -732,17 +713,6 @@ class ApiState {
|
| return weak_persistent_handles_;
|
| }
|
|
|
| - FinalizablePersistentHandles& prologue_weak_persistent_handles() {
|
| - return prologue_weak_persistent_handles_;
|
| - }
|
| -
|
| - WeakReferenceSet* delayed_weak_reference_sets() {
|
| - return delayed_weak_reference_sets_;
|
| - }
|
| - void set_delayed_weak_reference_sets(WeakReferenceSet* reference_set) {
|
| - delayed_weak_reference_sets_ = reference_set;
|
| - }
|
| -
|
| void UnwindScopes(uword stack_marker) {
|
| // Unwind all scopes using the same stack_marker, i.e. all scopes allocated
|
| // under the same top_exit_frame_info.
|
| @@ -755,29 +725,17 @@ class ApiState {
|
| }
|
| }
|
|
|
| - void VisitObjectPointers(ObjectPointerVisitor* visitor,
|
| - bool visit_prologue_weak_handles) {
|
| + void VisitObjectPointers(ObjectPointerVisitor* visitor) {
|
| ApiLocalScope* scope = top_scope_;
|
| while (scope != NULL) {
|
| scope->local_handles()->VisitObjectPointers(visitor);
|
| scope = scope->previous();
|
| }
|
| persistent_handles().VisitObjectPointers(visitor);
|
| - if (visit_prologue_weak_handles) {
|
| - prologue_weak_persistent_handles().VisitObjectPointers(visitor);
|
| - }
|
| }
|
|
|
| - void VisitWeakHandles(HandleVisitor* visitor,
|
| - bool visit_prologue_weak_handles) {
|
| + void VisitWeakHandles(HandleVisitor* visitor) {
|
| weak_persistent_handles().VisitHandles(visitor);
|
| - if (visit_prologue_weak_handles) {
|
| - prologue_weak_persistent_handles().VisitHandles(visitor);
|
| - }
|
| - }
|
| -
|
| - void VisitPrologueWeakHandles(HandleVisitor* visitor) {
|
| - prologue_weak_persistent_handles().VisitHandles(visitor);
|
| }
|
|
|
| bool IsValidLocalHandle(Dart_Handle object) const {
|
| @@ -799,11 +757,6 @@ class ApiState {
|
| return weak_persistent_handles_.IsValidHandle(object);
|
| }
|
|
|
| - bool IsValidPrologueWeakPersistentHandle(
|
| - Dart_WeakPersistentHandle object) const {
|
| - return prologue_weak_persistent_handles_.IsValidHandle(object);
|
| - }
|
| -
|
| bool IsProtectedHandle(PersistentHandle* object) const {
|
| if (object == NULL) return false;
|
| return object == null_ || object == true_ || object == false_;
|
| @@ -845,19 +798,13 @@ class ApiState {
|
| return acquired_error_;
|
| }
|
|
|
| - WeakReferenceSetBuilder* NewWeakReferenceSetBuilder();
|
| -
|
| - void DelayWeakReferenceSet(WeakReferenceSet* reference_set);
|
| -
|
| WeakTable* acquired_table() { return &acquired_table_; }
|
|
|
| private:
|
| PersistentHandles persistent_handles_;
|
| FinalizablePersistentHandles weak_persistent_handles_;
|
| - FinalizablePersistentHandles prologue_weak_persistent_handles_;
|
| ApiLocalScope* reusable_scope_;
|
| ApiLocalScope* top_scope_;
|
| - WeakReferenceSet* delayed_weak_reference_sets_;
|
| WeakTable acquired_table_;
|
|
|
| // Persistent handles to important objects.
|
| @@ -870,123 +817,16 @@ class ApiState {
|
| };
|
|
|
|
|
| -class WeakReferenceSet {
|
| - public:
|
| - explicit WeakReferenceSet(Zone* zone)
|
| - : next_(NULL),
|
| - keys_(1, zone),
|
| - values_(1, zone) {
|
| - }
|
| - ~WeakReferenceSet() {}
|
| -
|
| - WeakReferenceSet* next() const { return next_; }
|
| -
|
| - intptr_t num_keys() const { return keys_.length(); }
|
| - RawObject** get_key(intptr_t i) {
|
| - ASSERT(i >= 0);
|
| - ASSERT(i < num_keys());
|
| - FinalizablePersistentHandle* ref =
|
| - FinalizablePersistentHandle::Cast(keys_[i]);
|
| - return ref->raw_addr();
|
| - }
|
| -
|
| - intptr_t num_values() const { return values_.length(); }
|
| - RawObject** get_value(intptr_t i) {
|
| - ASSERT(i >= 0);
|
| - ASSERT(i < num_values());
|
| - FinalizablePersistentHandle* ref =
|
| - FinalizablePersistentHandle::Cast(values_[i]);
|
| - return ref->raw_addr();
|
| - }
|
| -
|
| - bool SingletonKeyEqualsValue() const {
|
| - ASSERT((num_keys() == 1) && (num_values() == 1));
|
| - return (keys_[0] == values_[0]);
|
| - }
|
| -
|
| - void Append(Dart_WeakPersistentHandle key, Dart_WeakPersistentHandle value) {
|
| - keys_.Add(key);
|
| - values_.Add(value);
|
| - }
|
| -
|
| - void AppendKey(Dart_WeakPersistentHandle key) {
|
| - keys_.Add(key);
|
| - }
|
| -
|
| - void AppendValue(Dart_WeakPersistentHandle value) {
|
| - values_.Add(value);
|
| - }
|
| -
|
| - static WeakReferenceSet* Pop(WeakReferenceSet** queue) {
|
| - ASSERT(queue != NULL);
|
| - WeakReferenceSet* head = *queue;
|
| - if (head != NULL) {
|
| - *queue = head->next();
|
| - head->next_ = NULL;
|
| - }
|
| - return head;
|
| - }
|
| -
|
| - static void Push(WeakReferenceSet* reference_set, WeakReferenceSet** queue) {
|
| - ASSERT(reference_set != NULL);
|
| - ASSERT(queue != NULL);
|
| - reference_set->next_ = *queue;
|
| - *queue = reference_set;
|
| - }
|
| -
|
| - void* operator new(uword size, Zone* zone) {
|
| - return reinterpret_cast<void*>(zone->AllocUnsafe(size));
|
| - }
|
| -
|
| - // Disallow explicit deallocation of WeakReferenceSet.
|
| - void operator delete(void* pointer) { UNREACHABLE(); }
|
| -
|
| - private:
|
| - WeakReferenceSet* next_;
|
| - ApiGrowableArray<Dart_WeakPersistentHandle> keys_;
|
| - ApiGrowableArray<Dart_WeakPersistentHandle> values_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(WeakReferenceSet);
|
| -};
|
| -
|
| -
|
| -class WeakReferenceSetBuilder {
|
| - public:
|
| - ApiState* api_state() const {
|
| - return api_state_;
|
| - }
|
| -
|
| - WeakReferenceSet* NewWeakReferenceSet() {
|
| - return new (zone_) WeakReferenceSet(zone_);
|
| - }
|
| -
|
| - private:
|
| - explicit WeakReferenceSetBuilder(ApiState* api_state)
|
| - : api_state_(api_state),
|
| - zone_(api_state->top_scope()->zone()) {
|
| - }
|
| -
|
| - ApiState* api_state_;
|
| - Zone* zone_;
|
| -
|
| - friend class ApiState;
|
| - DISALLOW_IMPLICIT_CONSTRUCTORS(WeakReferenceSetBuilder);
|
| -};
|
| -
|
| -
|
| inline FinalizablePersistentHandle* FinalizablePersistentHandle::New(
|
| Isolate* isolate,
|
| - bool is_prologue,
|
| const Object& object,
|
| void* peer,
|
| Dart_WeakPersistentHandleFinalizer callback,
|
| intptr_t external_size) {
|
| ApiState* state = isolate->api_state();
|
| ASSERT(state != NULL);
|
| - FinalizablePersistentHandle* ref = is_prologue ?
|
| - state->prologue_weak_persistent_handles().AllocateHandle() :
|
| + FinalizablePersistentHandle* ref =
|
| state->weak_persistent_handles().AllocateHandle();
|
| - ref->SetPrologueWeakPersistent(is_prologue);
|
| ref->set_raw(object);
|
| ref->set_peer(peer);
|
| ref->set_callback(callback);
|
|
|