Chromium Code Reviews| Index: runtime/vm/dart_api_impl.cc |
| =================================================================== |
| --- runtime/vm/dart_api_impl.cc (revision 25979) |
| +++ runtime/vm/dart_api_impl.cc (working copy) |
| @@ -26,6 +26,7 @@ |
| #include "vm/object_store.h" |
| #include "vm/port.h" |
| #include "vm/resolver.h" |
| +#include "vm/reusable_handles.h" |
| #include "vm/stack_frame.h" |
| #include "vm/symbols.h" |
| #include "vm/timer.h" |
| @@ -262,6 +263,13 @@ |
| } |
| +void Api::SetWeakHandleReturnValue(NativeArguments* args, |
| + Dart_WeakPersistentHandle retval) { |
| + args->SetReturnUnsafe( |
| + reinterpret_cast<FinalizablePersistentHandle*>(retval)->raw()); |
| +} |
| + |
| + |
| // --- Handles --- |
| DART_EXPORT bool Dart_IsError(Dart_Handle handle) { |
| @@ -1132,7 +1140,7 @@ |
| DART_EXPORT bool Dart_IsNull(Dart_Handle object) { |
| - return Api::ClassId(object) == kNullCid; |
| + return Api::UnwrapHandle(object) == Object::null(); |
| } |
| @@ -1842,6 +1850,25 @@ |
| } |
| +DART_EXPORT Dart_Handle Dart_StringGetProperties(Dart_Handle object, |
| + intptr_t* char_size, |
| + intptr_t* str_len, |
| + void** peer) { |
| + Isolate* isolate = Isolate::Current(); |
| + DARTSCOPE(isolate); |
| + const String& str = Api::UnwrapStringHandle(isolate, object); |
|
vsm
2013/08/12 17:59:04
Do you need some error checking if the object is n
siva
2013/08/13 01:19:09
Done.
|
| + if (str.IsExternal()) { |
| + *peer = str.GetPeer(); |
| + ASSERT(*peer != 0); |
|
srdjan
2013/08/12 18:09:57
Should this be 0 or NULL? (also below).
siva
2013/08/13 01:19:09
Done.
|
| + } else { |
| + *peer = 0; |
| + } |
| + *char_size = str.CharSize(); |
| + *str_len = str.Length(); |
| + return Api::Success(); |
| +} |
| + |
| + |
| // --- Lists --- |
| DART_EXPORT Dart_Handle Dart_NewList(intptr_t length) { |
| @@ -3623,12 +3650,15 @@ |
| return Api::Success(); |
| } |
| + |
| DART_EXPORT Dart_Handle Dart_GetNativeReceiver(Dart_NativeArguments args, |
| intptr_t* value) { |
| NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| Isolate* isolate = arguments->isolate(); |
| - DARTSCOPE(isolate); |
| - const Object& obj = Object::Handle(isolate, arguments->NativeArgAt(0)); |
| + CHECK_ISOLATE(isolate); |
| + ReusableObjectHandleScope reused_obj_handle(isolate); |
| + Object& obj = reused_obj_handle.Handle(); |
| + obj = arguments->NativeArgAt(0); |
| intptr_t cid = obj.GetClassId(); |
| if (cid <= kNumPredefinedCids) { |
| if (cid == kNullCid) { |
| @@ -3648,6 +3678,31 @@ |
| } |
| +DART_EXPORT Dart_Handle Dart_GetNativeStringArgument(Dart_NativeArguments args, |
| + int arg_index, |
| + void** peer) { |
| + 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->NativeArgAt(arg_index); |
| + intptr_t cid = obj.GetClassId(); |
| + if (RawObject::IsExternalStringClassId(cid)) { |
| + const String& str = String::Cast(obj); |
| + *peer = str.GetPeer(); |
| + ASSERT(*peer != 0); |
|
srdjan
2013/08/12 18:09:57
ditto?
siva
2013/08/13 01:19:09
Done.
|
| + return Api::Success(); |
| + } |
| + *peer = 0; |
|
srdjan
2013/08/12 18:09:57
ditto
siva
2013/08/13 01:19:09
Done.
|
| + if (RawObject::IsStringClassId(cid)) { |
| + return Api::NewHandle(isolate, obj.raw()); |
| + } |
| + return Api::NewError("%s expects argument to be of" |
| + " type String.", CURRENT_FUNC); |
| +} |
| + |
| + |
| DART_EXPORT void Dart_SetReturnValue(Dart_NativeArguments args, |
| Dart_Handle retval) { |
| NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| @@ -3663,6 +3718,18 @@ |
| } |
| +DART_EXPORT void Dart_SetWeakHandleReturnValue(Dart_NativeArguments args, |
| + Dart_WeakPersistentHandle rval) { |
| + NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| + Isolate* isolate = arguments->isolate(); |
| + CHECK_ISOLATE(isolate); |
| + ASSERT(isolate->api_state() != NULL && |
| + (isolate->api_state()->IsValidWeakPersistentHandle(rval) || |
| + isolate->api_state()->IsValidPrologueWeakPersistentHandle(rval))); |
| + Api::SetWeakHandleReturnValue(arguments, rval); |
| +} |
| + |
| + |
| DART_EXPORT void Dart_SetBooleanReturnValue(Dart_NativeArguments args, |
| bool retval) { |
| NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |