Chromium Code Reviews| Index: runtime/vm/dart_api_impl.cc |
| =================================================================== |
| --- runtime/vm/dart_api_impl.cc (revision 23191) |
| +++ runtime/vm/dart_api_impl.cc (working copy) |
| @@ -36,6 +36,9 @@ |
| DECLARE_FLAG(bool, print_class_table); |
| ThreadLocalKey Api::api_native_key_ = Thread::kUnsetThreadLocalKey; |
| +Dart_Handle Api::true_handle_ = NULL; |
| +Dart_Handle Api::false_handle_ = NULL; |
| +Dart_Handle Api::null_handle_ = NULL; |
| const char* CanonicalFunction(const char* func) { |
| @@ -95,9 +98,7 @@ |
| ApiState* state = isolate->api_state(); |
| ASSERT(state != NULL); |
| ASSERT(state->IsValidLocalHandle(object) || |
| - state->IsValidPersistentHandle(object) || |
| - state->IsValidWeakPersistentHandle(object) || |
| - state->IsValidPrologueWeakPersistentHandle(object)); |
| + Dart::vm_isolate()->api_state()->IsValidLocalHandle(object)); |
| ASSERT(FinalizablePersistentHandle::raw_offset() == 0 && |
| PersistentHandle::raw_offset() == 0 && |
| LocalHandle::raw_offset() == 0); |
| @@ -118,32 +119,22 @@ |
| #undef DEFINE_UNWRAP |
| -LocalHandle* Api::UnwrapAsLocalHandle(const ApiState& state, |
| - Dart_Handle object) { |
| - ASSERT(state.IsValidLocalHandle(object)); |
| - return reinterpret_cast<LocalHandle*>(object); |
| -} |
| - |
| - |
| -PersistentHandle* Api::UnwrapAsPersistentHandle(const ApiState& state, |
| - Dart_Handle object) { |
| - ASSERT(state.IsValidPersistentHandle(object)); |
| +PersistentHandle* Api::UnwrapAsPersistentHandle(Dart_PersistentHandle object) { |
| + ASSERT(Isolate::Current()->api_state()->IsValidPersistentHandle(object)); |
| return reinterpret_cast<PersistentHandle*>(object); |
| } |
| FinalizablePersistentHandle* Api::UnwrapAsWeakPersistentHandle( |
| - const ApiState& state, |
| - Dart_Handle object) { |
| - ASSERT(state.IsValidWeakPersistentHandle(object)); |
| + Dart_WeakPersistentHandle object) { |
| + ASSERT(Isolate::Current()->api_state()->IsValidWeakPersistentHandle(object)); |
| return reinterpret_cast<FinalizablePersistentHandle*>(object); |
| } |
| FinalizablePersistentHandle* Api::UnwrapAsPrologueWeakPersistentHandle( |
| - const ApiState& state, |
| - Dart_Handle object) { |
| - ASSERT(state.IsValidPrologueWeakPersistentHandle(object)); |
| + Dart_WeakPersistentHandle object) { |
| + ASSERT(Isolate::Current()->api_state()->IsValidPrologueWeakPersistentHandle(object)); |
| return reinterpret_cast<FinalizablePersistentHandle*>(object); |
| } |
| @@ -167,8 +158,7 @@ |
| ASSERT(isolate != NULL); |
| ApiState* state = isolate->api_state(); |
| ASSERT(state != NULL); |
| - PersistentHandle* true_handle = state->True(); |
| - return reinterpret_cast<Dart_Handle>(true_handle); |
| + return Api::True(isolate); |
| } |
| @@ -211,29 +201,17 @@ |
| Dart_Handle Api::Null(Isolate* isolate) { |
|
siva
2013/05/28 17:37:18
Is the isolate parameter still needed for these ha
Ivan Posva
2013/05/28 21:12:20
Removed the isolate parameter as well as the unuse
|
| - ASSERT(isolate != NULL); |
| - ApiState* state = isolate->api_state(); |
| - ASSERT(state != NULL); |
| - PersistentHandle* null_handle = state->Null(); |
| - return reinterpret_cast<Dart_Handle>(null_handle); |
| + return null_handle_; |
| } |
| Dart_Handle Api::True(Isolate* isolate) { |
| - ASSERT(isolate != NULL); |
| - ApiState* state = isolate->api_state(); |
| - ASSERT(state != NULL); |
| - PersistentHandle* true_handle = state->True(); |
| - return reinterpret_cast<Dart_Handle>(true_handle); |
| + return true_handle_; |
| } |
| Dart_Handle Api::False(Isolate* isolate) { |
| - ASSERT(isolate != NULL); |
| - ApiState* state = isolate->api_state(); |
| - ASSERT(state != NULL); |
| - PersistentHandle* false_handle = state->False(); |
| - return reinterpret_cast<Dart_Handle>(false_handle); |
| + return false_handle_; |
| } |
| @@ -254,6 +232,23 @@ |
| } |
| +void Api::InitHandles() { |
| + Isolate* isolate = Isolate::Current(); |
| + ASSERT(isolate != NULL); |
| + ASSERT(isolate == Dart::vm_isolate()); |
| + ApiState* state = isolate->api_state(); |
| + ASSERT(state != NULL); |
| + ASSERT(true_handle_ == NULL); |
| + true_handle_ = Api::NewHandle(isolate, Bool::True().raw()); |
| + |
| + ASSERT(false_handle_ == NULL); |
| + false_handle_ = Api::NewHandle(isolate, Bool::False().raw()); |
| + |
| + ASSERT(null_handle_ == NULL); |
| + null_handle_ = Api::NewHandle(isolate, Object::null()); |
| +} |
| + |
| + |
| bool Api::ExternalStringGetPeerHelper(Dart_Handle object, void** peer) { |
| NoGCScope no_gc_scope; |
| RawObject* raw_obj = Api::UnwrapHandle(object); |
| @@ -524,18 +519,39 @@ |
| } |
| -DART_EXPORT Dart_Handle Dart_NewPersistentHandle(Dart_Handle object) { |
| +DART_EXPORT Dart_Handle Dart_HandleFromPersistent(Dart_PersistentHandle object) { |
| Isolate* isolate = Isolate::Current(); |
| DARTSCOPE(isolate); |
| ApiState* state = isolate->api_state(); |
| ASSERT(state != NULL); |
| + ASSERT(state->IsValidPersistentHandle(object)); |
| + return Api::NewHandle(isolate, reinterpret_cast<PersistentHandle*>(object)->raw()); |
| +} |
| + |
| + |
| +DART_EXPORT Dart_Handle Dart_HandleFromWeakPersistent(Dart_WeakPersistentHandle object) { |
| + Isolate* isolate = Isolate::Current(); |
| + DARTSCOPE(isolate); |
| + ApiState* state = isolate->api_state(); |
| + ASSERT(state != NULL); |
| + ASSERT(state->IsValidWeakPersistentHandle(object) || |
| + state->IsValidPrologueWeakPersistentHandle(object)); |
| + return Api::NewHandle(isolate, reinterpret_cast<FinalizablePersistentHandle*>(object)->raw()); |
| +} |
| + |
| + |
| +DART_EXPORT Dart_PersistentHandle Dart_NewPersistentHandle(Dart_Handle object) { |
| + Isolate* isolate = Isolate::Current(); |
| + DARTSCOPE(isolate); |
| + ApiState* state = isolate->api_state(); |
| + ASSERT(state != NULL); |
| const Object& old_ref = Object::Handle(isolate, Api::UnwrapHandle(object)); |
| PersistentHandle* new_ref = state->persistent_handles().AllocateHandle(); |
| new_ref->set_raw(old_ref); |
| - return reinterpret_cast<Dart_Handle>(new_ref); |
| + return reinterpret_cast<Dart_PersistentHandle>(new_ref); |
| } |
| -static Dart_Handle AllocateFinalizableHandle( |
| +static Dart_WeakPersistentHandle AllocateFinalizableHandle( |
| Isolate* isolate, |
| FinalizablePersistentHandles* handles, |
| Dart_Handle object, |
| @@ -546,11 +562,11 @@ |
| finalizable_ref->set_raw(ref); |
| finalizable_ref->set_peer(peer); |
| finalizable_ref->set_callback(callback); |
| - return reinterpret_cast<Dart_Handle>(finalizable_ref); |
| + return reinterpret_cast<Dart_WeakPersistentHandle>(finalizable_ref); |
| } |
| -DART_EXPORT Dart_Handle Dart_NewWeakPersistentHandle( |
| +DART_EXPORT Dart_WeakPersistentHandle Dart_NewWeakPersistentHandle( |
| Dart_Handle object, |
| void* peer, |
| Dart_WeakPersistentHandleFinalizer callback) { |
| @@ -566,7 +582,7 @@ |
| } |
| -DART_EXPORT Dart_Handle Dart_NewPrologueWeakPersistentHandle( |
| +DART_EXPORT Dart_WeakPersistentHandle Dart_NewPrologueWeakPersistentHandle( |
| Dart_Handle object, |
| void* peer, |
| Dart_WeakPersistentHandleFinalizer callback) { |
| @@ -582,24 +598,12 @@ |
| } |
| -DART_EXPORT void Dart_DeletePersistentHandle(Dart_Handle object) { |
| +DART_EXPORT void Dart_DeletePersistentHandle(Dart_PersistentHandle object) { |
| Isolate* isolate = Isolate::Current(); |
| CHECK_ISOLATE(isolate); |
| ApiState* state = isolate->api_state(); |
| ASSERT(state != NULL); |
| - if (state->IsValidPrologueWeakPersistentHandle(object)) { |
| - FinalizablePersistentHandle* prologue_weak_ref = |
| - Api::UnwrapAsPrologueWeakPersistentHandle(*state, object); |
| - state->prologue_weak_persistent_handles().FreeHandle(prologue_weak_ref); |
| - return; |
| - } |
| - if (state->IsValidWeakPersistentHandle(object)) { |
| - FinalizablePersistentHandle* weak_ref = |
| - Api::UnwrapAsWeakPersistentHandle(*state, object); |
| - state->weak_persistent_handles().FreeHandle(weak_ref); |
| - return; |
| - } |
| - PersistentHandle* ref = Api::UnwrapAsPersistentHandle(*state, object); |
| + PersistentHandle* ref = Api::UnwrapAsPersistentHandle(object); |
| ASSERT(!state->IsProtectedHandle(ref)); |
| if (!state->IsProtectedHandle(ref)) { |
| state->persistent_handles().FreeHandle(ref); |
| @@ -607,16 +611,25 @@ |
| } |
| -DART_EXPORT bool Dart_IsWeakPersistentHandle(Dart_Handle object) { |
| +DART_EXPORT void Dart_DeleteWeakPersistentHandle(Dart_WeakPersistentHandle object) { |
| Isolate* isolate = Isolate::Current(); |
| CHECK_ISOLATE(isolate); |
| ApiState* state = isolate->api_state(); |
| ASSERT(state != NULL); |
| - return state->IsValidWeakPersistentHandle(object); |
| + if (state->IsValidPrologueWeakPersistentHandle(object)) { |
| + FinalizablePersistentHandle* prologue_weak_ref = |
| + Api::UnwrapAsPrologueWeakPersistentHandle(object); |
| + state->prologue_weak_persistent_handles().FreeHandle(prologue_weak_ref); |
| + return; |
| + } |
| + FinalizablePersistentHandle* weak_ref = |
| + Api::UnwrapAsWeakPersistentHandle(object); |
| + state->weak_persistent_handles().FreeHandle(weak_ref); |
| + return; |
| } |
| -DART_EXPORT bool Dart_IsPrologueWeakPersistentHandle(Dart_Handle object) { |
| +DART_EXPORT bool Dart_IsPrologueWeakPersistentHandle(Dart_WeakPersistentHandle object) { |
| Isolate* isolate = Isolate::Current(); |
| CHECK_ISOLATE(isolate); |
| ApiState* state = isolate->api_state(); |
| @@ -2488,32 +2501,19 @@ |
| static Dart_Handle NewExternalTypedData( |
| - Isolate* isolate, |
| - intptr_t cid, |
| - void* data, |
| - intptr_t length, |
| - void* peer, |
| - Dart_WeakPersistentHandleFinalizer callback) { |
| + Isolate* isolate, intptr_t cid, void* data, intptr_t length) { |
| CHECK_LENGTH(length, ExternalTypedData::MaxElements(cid)); |
| const ExternalTypedData& result = ExternalTypedData::Handle( |
| isolate, |
| ExternalTypedData::New(cid, reinterpret_cast<uint8_t*>(data), length)); |
| - result.AddFinalizer(peer, callback); |
| return Api::NewHandle(isolate, result.raw()); |
| } |
| -static Dart_Handle NewExternalByteData(Isolate* isolate, |
| - void* data, |
| - intptr_t length, |
| - void* peer, |
| - Dart_WeakPersistentHandleFinalizer cb) { |
| - Dart_Handle ext_data = NewExternalTypedData(isolate, |
| - kExternalTypedDataUint8ArrayCid, |
| - data, |
| - length, |
| - peer, |
| - cb); |
| +static Dart_Handle NewExternalByteData( |
| + Isolate* isolate, void* data, intptr_t length) { |
| + Dart_Handle ext_data = NewExternalTypedData( |
| + isolate, kExternalTypedDataUint8ArrayCid, data, length); |
| if (::Dart_IsError(ext_data)) { |
| return ext_data; |
| } |
| @@ -2589,9 +2589,7 @@ |
| DART_EXPORT Dart_Handle Dart_NewExternalTypedData( |
| Dart_TypedData_Type type, |
| void* data, |
| - intptr_t length, |
| - void* peer, |
| - Dart_WeakPersistentHandleFinalizer callback) { |
| + intptr_t length) { |
| Isolate* isolate = Isolate::Current(); |
| DARTSCOPE(isolate); |
| if (data == NULL && length != 0) { |
| @@ -2600,91 +2598,67 @@ |
| CHECK_CALLBACK_STATE(isolate); |
| switch (type) { |
| case kByteData: |
| - return NewExternalByteData(isolate, data, length, peer, callback); |
| + return NewExternalByteData(isolate, data, length); |
| case kInt8: |
| return NewExternalTypedData(isolate, |
| kExternalTypedDataInt8ArrayCid, |
| data, |
| - length, |
| - peer, |
| - callback); |
| + length); |
| case kUint8: |
| return NewExternalTypedData(isolate, |
| kExternalTypedDataUint8ArrayCid, |
| data, |
| - length, |
| - peer, |
| - callback); |
| + length); |
| case kUint8Clamped: |
| return NewExternalTypedData(isolate, |
| kExternalTypedDataUint8ClampedArrayCid, |
| data, |
| - length, |
| - peer, |
| - callback); |
| + length); |
| case kInt16: |
| return NewExternalTypedData(isolate, |
| kExternalTypedDataInt16ArrayCid, |
| data, |
| - length, |
| - peer, |
| - callback); |
| + length); |
| case kUint16: |
| return NewExternalTypedData(isolate, |
| kExternalTypedDataUint16ArrayCid, |
| data, |
| - length, |
| - peer, |
| - callback); |
| + length); |
| case kInt32: |
| return NewExternalTypedData(isolate, |
| kExternalTypedDataInt32ArrayCid, |
| data, |
| - length, |
| - peer, |
| - callback); |
| + length); |
| case kUint32: |
| return NewExternalTypedData(isolate, |
| kExternalTypedDataUint32ArrayCid, |
| data, |
| - length, |
| - peer, |
| - callback); |
| + length); |
| case kInt64: |
| return NewExternalTypedData(isolate, |
| kExternalTypedDataInt64ArrayCid, |
| data, |
| - length, |
| - peer, |
| - callback); |
| + length); |
| case kUint64: |
| return NewExternalTypedData(isolate, |
| kExternalTypedDataUint64ArrayCid, |
| data, |
| - length, |
| - peer, |
| - callback); |
| + length); |
| case kFloat32: |
| return NewExternalTypedData(isolate, |
| kExternalTypedDataFloat32ArrayCid, |
| data, |
| - length, |
| - peer, |
| - callback); |
| + length); |
| case kFloat64: |
| return NewExternalTypedData(isolate, |
| kExternalTypedDataFloat64ArrayCid, |
| data, |
| - length, |
| - peer, |
| - callback); |
| + length); |
| case kFloat32x4: |
| return NewExternalTypedData(isolate, |
| kExternalTypedDataFloat32x4ArrayCid, |
| data, |
| - length, |
| - peer, |
| - callback); |
| + length); |
| default: |
| return Api::NewError("%s expects argument 'type' to be of" |
| " 'external TypedData'", CURRENT_FUNC); |
| @@ -2694,23 +2668,6 @@ |
| } |
| -DART_EXPORT Dart_Handle Dart_ExternalTypedDataGetPeer(Dart_Handle object, |
| - void** peer) { |
| - Isolate* isolate = Isolate::Current(); |
| - DARTSCOPE(isolate); |
| - const ExternalTypedData& array = |
| - Api::UnwrapExternalTypedDataHandle(isolate, object); |
| - if (array.IsNull()) { |
| - RETURN_TYPE_ERROR(isolate, object, ExternalTypedData); |
| - } |
| - if (peer == NULL) { |
| - RETURN_NULL_ERROR(peer); |
| - } |
| - *peer = array.GetPeer(); |
| - return Api::Success(isolate); |
| -} |
| - |
|
siva
2013/05/28 17:37:18
Why is this not needed anymore?
|
| - |
| DART_EXPORT Dart_Handle Dart_TypedDataAcquireData(Dart_Handle object, |
| Dart_TypedData_Type* type, |
| void** data, |