| Index: runtime/vm/dart_api_impl.cc
|
| ===================================================================
|
| --- runtime/vm/dart_api_impl.cc (revision 34879)
|
| +++ runtime/vm/dart_api_impl.cc (working copy)
|
| @@ -816,6 +816,52 @@
|
| }
|
|
|
|
|
| +class PrologueWeakVisitor : public HandleVisitor {
|
| + public:
|
| + PrologueWeakVisitor(Isolate* isolate,
|
| + Dart_GcPrologueWeakHandleCallback callback)
|
| + : HandleVisitor(isolate),
|
| + callback_(callback) {
|
| + }
|
| +
|
| + void VisitHandle(uword addr) {
|
| + NoGCScope no_gc;
|
| + FinalizablePersistentHandle* handle =
|
| + reinterpret_cast<FinalizablePersistentHandle*>(addr);
|
| + RawObject* raw_obj = handle->raw();
|
| + if (raw_obj->IsHeapObject()) {
|
| + ASSERT(handle->IsPrologueWeakPersistent());
|
| + ReusableInstanceHandleScope reused_instance_handle(isolate());
|
| + Instance& instance = reused_instance_handle.Handle();
|
| + instance ^= reinterpret_cast<RawInstance*>(handle->raw());
|
| + intptr_t num_native_fields = instance.NumNativeFields();
|
| + intptr_t* native_fields = instance.NativeFieldsDataAddr();
|
| + if (native_fields != NULL) {
|
| + callback_(isolate()->init_callback_data(),
|
| + reinterpret_cast<Dart_WeakPersistentHandle>(addr),
|
| + num_native_fields,
|
| + native_fields);
|
| + }
|
| + }
|
| + }
|
| +
|
| + private:
|
| + Dart_GcPrologueWeakHandleCallback callback_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(PrologueWeakVisitor);
|
| +};
|
| +
|
| +
|
| +DART_EXPORT Dart_Handle Dart_VisitPrologueWeakHandles(
|
| + Dart_GcPrologueWeakHandleCallback callback) {
|
| + Isolate* isolate = Isolate::Current();
|
| + CHECK_ISOLATE(isolate);
|
| + PrologueWeakVisitor visitor(isolate, callback);
|
| + isolate->VisitPrologueWeakPersistentHandles(&visitor);
|
| + return Api::Success();
|
| +}
|
| +
|
| +
|
| // --- Initialization and Globals ---
|
|
|
| DART_EXPORT const char* Dart_VersionString() {
|
| @@ -3130,6 +3176,7 @@
|
| if (result.IsError()) {
|
| return Api::NewHandle(isolate, result.raw());
|
| }
|
| +
|
| if (constructor.IsConstructor()) {
|
| ASSERT(result.IsNull());
|
| } else {
|
| @@ -3872,8 +3919,7 @@
|
| intptr_t value) {
|
| Isolate* isolate = Isolate::Current();
|
| DARTSCOPE(isolate);
|
| - ReusableObjectHandleScope reused_obj_handle(isolate);
|
| - const Instance& instance = Api::UnwrapInstanceHandle(reused_obj_handle, obj);
|
| + const Instance& instance = Api::UnwrapInstanceHandle(isolate, obj);
|
| if (instance.IsNull()) {
|
| RETURN_TYPE_ERROR(isolate, obj, Instance);
|
| }
|
|
|