Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(185)

Unified Diff: runtime/vm/dart_api_impl.cc

Issue 15772005: - Add different types for persistent and weak persistent handles (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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,

Powered by Google App Engine
This is Rietveld 408576698