| Index: runtime/vm/dart_api_impl.cc
|
| ===================================================================
|
| --- runtime/vm/dart_api_impl.cc (revision 34199)
|
| +++ runtime/vm/dart_api_impl.cc (working copy)
|
| @@ -371,6 +371,29 @@
|
| }
|
|
|
|
|
| +void FinalizablePersistentHandle::Finalize(Isolate* isolate,
|
| + FinalizablePersistentHandle* handle,
|
| + bool is_prologue_weak) {
|
| + if (!handle->raw()->IsHeapObject()) {
|
| + return;
|
| + }
|
| + Dart_WeakPersistentHandleFinalizer callback = handle->callback();
|
| + ASSERT(callback != NULL);
|
| + void* peer = handle->peer();
|
| + Dart_WeakPersistentHandle object = is_prologue_weak ?
|
| + handle->apiPrologueHandle() :
|
| + handle->apiHandle();
|
| + (*callback)(isolate->init_callback_data(), object, peer);
|
| + ApiState* state = isolate->api_state();
|
| + ASSERT(state != NULL);
|
| + if (is_prologue_weak) {
|
| + state->prologue_weak_persistent_handles().FreeHandle(handle);
|
| + } else {
|
| + state->weak_persistent_handles().FreeHandle(handle);
|
| + }
|
| +}
|
| +
|
| +
|
| // --- Handles ---
|
|
|
| DART_EXPORT bool Dart_IsError(Dart_Handle handle) {
|
| @@ -654,6 +677,9 @@
|
| Dart_WeakPersistentHandleFinalizer callback) {
|
| Isolate* isolate = Isolate::Current();
|
| CHECK_ISOLATE(isolate);
|
| + if (callback == NULL) {
|
| + return NULL;
|
| + }
|
| return AllocateFinalizableHandle(isolate,
|
| object,
|
| false,
|
| @@ -670,6 +696,9 @@
|
| Dart_WeakPersistentHandleFinalizer callback) {
|
| Isolate* isolate = Isolate::Current();
|
| CHECK_ISOLATE(isolate);
|
| + if (callback == NULL) {
|
| + return NULL;
|
| + }
|
| return AllocateFinalizableHandle(isolate,
|
| object,
|
| true,
|
|
|