| Index: dart/runtime/vm/dart_api_impl.cc
|
| ===================================================================
|
| --- dart/runtime/vm/dart_api_impl.cc (revision 31530)
|
| +++ dart/runtime/vm/dart_api_impl.cc (working copy)
|
| @@ -293,6 +293,28 @@
|
| }
|
|
|
|
|
| +bool Api::GetNativeReceiver(Dart_NativeArguments args, intptr_t* value) {
|
| + NoGCScope no_gc_scope;
|
| + NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
|
| + RawObject* raw_obj = arguments->NativeArg0();
|
| + if (raw_obj->IsHeapObject()) {
|
| + intptr_t cid = raw_obj->GetClassId();
|
| + if (cid > kNumPredefinedCids) {
|
| + ASSERT(Instance::Cast(Object::Handle(raw_obj)).IsValidNativeIndex(0));
|
| + RawTypedData* native_fields = *reinterpret_cast<RawTypedData**>(
|
| + RawObject::ToAddr(raw_obj) + sizeof(RawObject));
|
| + if (native_fields == TypedData::null()) {
|
| + *value = 0;
|
| + } else {
|
| + *value = *bit_cast<intptr_t*, uint8_t*>(native_fields->ptr()->data_);
|
| + }
|
| + return true;
|
| + }
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +
|
| bool Api::GetNativeBooleanArgument(Dart_NativeArguments args,
|
| int arg_index,
|
| bool* value) {
|
| @@ -556,6 +578,20 @@
|
| return reinterpret_cast<Dart_PersistentHandle>(new_ref);
|
| }
|
|
|
| +
|
| +DART_EXPORT void Dart_SetPersistentHandle(Dart_PersistentHandle obj1,
|
| + Dart_Handle obj2) {
|
| + Isolate* isolate = Isolate::Current();
|
| + DARTSCOPE(isolate);
|
| + ApiState* state = isolate->api_state();
|
| + ASSERT(state != NULL);
|
| + ASSERT(state->IsValidPersistentHandle(obj1));
|
| + const Object& obj2_ref = Object::Handle(isolate, Api::UnwrapHandle(obj2));
|
| + PersistentHandle* obj1_ref = Api::UnwrapAsPersistentHandle(obj1);
|
| + obj1_ref->set_raw(obj2_ref);
|
| +}
|
| +
|
| +
|
| static Dart_WeakPersistentHandle AllocateFinalizableHandle(
|
| Isolate* isolate,
|
| FinalizablePersistentHandles* handles,
|
| @@ -3783,25 +3819,14 @@
|
| NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
|
| Isolate* isolate = arguments->isolate();
|
| CHECK_ISOLATE(isolate);
|
| - ReusableObjectHandleScope reused_obj_handle(isolate);
|
| - Object& obj = reused_obj_handle.Handle();
|
| - obj = arguments->NativeArg0();
|
| - intptr_t cid = obj.GetClassId();
|
| - if (cid <= kNumPredefinedCids) {
|
| - if (cid == kNullCid) {
|
| - return Api::NewError("%s expects receiver argument to be non-null.",
|
| - CURRENT_FUNC);
|
| - }
|
| - return Api::NewError("%s expects receiver argument to be of"
|
| - " type Instance.", CURRENT_FUNC);
|
| - }
|
| - const Instance& instance = Instance::Cast(obj);
|
| - ASSERT(instance.IsValidNativeIndex(0));
|
| if (value == NULL) {
|
| RETURN_NULL_ERROR(value);
|
| }
|
| - *value = instance.GetNativeField(isolate, 0);
|
| - return Api::Success();
|
| + if (Api::GetNativeReceiver(args, value)) {
|
| + return Api::Success();
|
| + }
|
| + return Api::NewError("%s expects receiver argument to be non-null and of"
|
| + " type Instance.", CURRENT_FUNC);
|
| }
|
|
|
|
|
|
|