| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef VM_DART_API_STATE_H_ | 5 #ifndef VM_DART_API_STATE_H_ |
| 6 #define VM_DART_API_STATE_H_ | 6 #define VM_DART_API_STATE_H_ |
| 7 | 7 |
| 8 #include "include/dart_api.h" | 8 #include "include/dart_api.h" |
| 9 | 9 |
| 10 #include "platform/thread.h" | 10 #include "platform/thread.h" |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 183 RawObject* raw_; | 183 RawObject* raw_; |
| 184 DISALLOW_ALLOCATION(); // Allocated through AllocateHandle methods. | 184 DISALLOW_ALLOCATION(); // Allocated through AllocateHandle methods. |
| 185 DISALLOW_COPY_AND_ASSIGN(PersistentHandle); | 185 DISALLOW_COPY_AND_ASSIGN(PersistentHandle); |
| 186 }; | 186 }; |
| 187 | 187 |
| 188 | 188 |
| 189 // Implementation of persistent handles which are handed out through the | 189 // Implementation of persistent handles which are handed out through the |
| 190 // dart API. | 190 // dart API. |
| 191 class FinalizablePersistentHandle { | 191 class FinalizablePersistentHandle { |
| 192 public: | 192 public: |
| 193 static FinalizablePersistentHandle* New( |
| 194 Isolate* isolate, |
| 195 bool is_prologue, |
| 196 const Object& object, |
| 197 void* peer, |
| 198 Dart_WeakPersistentHandleFinalizer callback, |
| 199 intptr_t external_size); |
| 200 |
| 193 // Accessors. | 201 // Accessors. |
| 194 RawObject* raw() const { return raw_; } | 202 RawObject* raw() const { return raw_; } |
| 195 void set_raw(RawObject* raw) { raw_ = raw; } | |
| 196 void set_raw(const LocalHandle& ref) { raw_ = ref.raw(); } | |
| 197 void set_raw(const Object& object) { raw_ = object.raw(); } | |
| 198 RawObject** raw_addr() { return &raw_; } | 203 RawObject** raw_addr() { return &raw_; } |
| 199 static intptr_t raw_offset() { | 204 static intptr_t raw_offset() { |
| 200 return OFFSET_OF(FinalizablePersistentHandle, raw_); | 205 return OFFSET_OF(FinalizablePersistentHandle, raw_); |
| 201 } | 206 } |
| 202 void* peer() const { return peer_; } | 207 void* peer() const { return peer_; } |
| 203 void set_peer(void* peer) { peer_ = peer; } | |
| 204 Dart_WeakPersistentHandleFinalizer callback() const { return callback_; } | 208 Dart_WeakPersistentHandleFinalizer callback() const { return callback_; } |
| 205 void set_callback(Dart_WeakPersistentHandleFinalizer callback) { | |
| 206 callback_ = callback; | |
| 207 } | |
| 208 Dart_WeakPersistentHandle apiHandle() { | 209 Dart_WeakPersistentHandle apiHandle() { |
| 209 return reinterpret_cast<Dart_WeakPersistentHandle>(this); | 210 return reinterpret_cast<Dart_WeakPersistentHandle>(this); |
| 210 } | 211 } |
| 211 | 212 |
| 212 void SetExternalSize(intptr_t size, Isolate* isolate) { | 213 void SetExternalSize(intptr_t size, Isolate* isolate) { |
| 213 ASSERT(size >= 0); | 214 ASSERT(size >= 0); |
| 214 set_external_size(Utils::RoundUp(size, kObjectAlignment)); | 215 set_external_size(Utils::RoundUp(size, kObjectAlignment)); |
| 215 if (SpaceForExternal() == Heap::kNew) { | 216 if (SpaceForExternal() == Heap::kNew) { |
| 216 SetExternalNewSpaceBit(); | 217 SetExternalNewSpaceBit(); |
| 217 } | 218 } |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 293 SetNext(free_list); | 294 SetNext(free_list); |
| 294 } | 295 } |
| 295 | 296 |
| 296 void Clear() { | 297 void Clear() { |
| 297 raw_ = Object::null(); | 298 raw_ = Object::null(); |
| 298 peer_ = NULL; | 299 peer_ = NULL; |
| 299 external_data_ = 0; | 300 external_data_ = 0; |
| 300 callback_ = NULL; | 301 callback_ = NULL; |
| 301 } | 302 } |
| 302 | 303 |
| 304 void set_raw(RawObject* raw) { raw_ = raw; } |
| 305 void set_raw(const LocalHandle& ref) { raw_ = ref.raw(); } |
| 306 void set_raw(const Object& object) { raw_ = object.raw(); } |
| 307 |
| 308 void set_peer(void* peer) { peer_ = peer; } |
| 309 |
| 310 void set_callback(Dart_WeakPersistentHandleFinalizer callback) { |
| 311 callback_ = callback; |
| 312 } |
| 313 |
| 303 intptr_t external_size() const { | 314 intptr_t external_size() const { |
| 304 return ExternalSizeBits::decode(external_data_); | 315 return ExternalSizeBits::decode(external_data_); |
| 305 } | 316 } |
| 306 | 317 |
| 307 void set_external_size(intptr_t size) { | 318 void set_external_size(intptr_t size) { |
| 308 ASSERT(ExternalSizeBits::is_valid(size)); | 319 ASSERT(ExternalSizeBits::is_valid(size)); |
| 309 external_data_ = ExternalSizeBits::update(size, external_data_); | 320 external_data_ = ExternalSizeBits::update(size, external_data_); |
| 310 } | 321 } |
| 311 | 322 |
| 312 bool IsSetNewSpaceBit() const { | 323 bool IsSetNewSpaceBit() const { |
| (...skipping 622 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 935 } | 946 } |
| 936 | 947 |
| 937 ApiState* api_state_; | 948 ApiState* api_state_; |
| 938 Zone* zone_; | 949 Zone* zone_; |
| 939 | 950 |
| 940 friend class ApiState; | 951 friend class ApiState; |
| 941 DISALLOW_IMPLICIT_CONSTRUCTORS(WeakReferenceSetBuilder); | 952 DISALLOW_IMPLICIT_CONSTRUCTORS(WeakReferenceSetBuilder); |
| 942 }; | 953 }; |
| 943 | 954 |
| 944 | 955 |
| 956 inline FinalizablePersistentHandle* FinalizablePersistentHandle::New( |
| 957 Isolate* isolate, |
| 958 bool is_prologue, |
| 959 const Object& object, |
| 960 void* peer, |
| 961 Dart_WeakPersistentHandleFinalizer callback, |
| 962 intptr_t external_size) { |
| 963 ApiState* state = isolate->api_state(); |
| 964 ASSERT(state != NULL); |
| 965 FinalizablePersistentHandle* ref = is_prologue ? |
| 966 state->prologue_weak_persistent_handles().AllocateHandle() : |
| 967 state->weak_persistent_handles().AllocateHandle(); |
| 968 ref->SetPrologueWeakPersistent(is_prologue); |
| 969 ref->set_raw(object); |
| 970 ref->set_peer(peer); |
| 971 ref->set_callback(callback); |
| 972 ref->SetExternalSize(external_size, isolate); |
| 973 return ref; |
| 974 } |
| 975 |
| 945 } // namespace dart | 976 } // namespace dart |
| 946 | 977 |
| 947 #endif // VM_DART_API_STATE_H_ | 978 #endif // VM_DART_API_STATE_H_ |
| OLD | NEW |