Chromium Code Reviews| Index: runtime/vm/dart_api_impl.cc |
| =================================================================== |
| --- runtime/vm/dart_api_impl.cc (revision 26169) |
| +++ runtime/vm/dart_api_impl.cc (working copy) |
| @@ -240,26 +240,41 @@ |
| } |
| +#define GET_PEER(type, ctype, raw_obj, peer) \ |
|
srdjan
2013/08/15 01:47:06
I am not certain if for only two cases it is worth
siva
2013/08/15 17:05:18
Femoved macro and inlined the code in the other ca
|
| + RawExternal##type* raw_string = \ |
| + reinterpret_cast<RawExternal##type*>(raw_obj)->ptr(); \ |
| + ExternalStringData<ctype>* data = raw_string->external_data_; \ |
| + *peer = data->peer(); \ |
| + return true; \ |
| + |
| + |
| +#define EXTERNAL_PEER_HELPER(cid, raw_obj, peer) \ |
|
srdjan
2013/08/15 01:47:06
Can this be a function instead of a macro?
siva
2013/08/15 17:05:18
Would have loved to make it a function but that wo
|
| + switch (cid) { \ |
| + case kExternalOneByteStringCid: { \ |
| + GET_PEER(OneByteString, uint8_t, raw_obj, peer); \ |
| + } \ |
| + case kExternalTwoByteStringCid: { \ |
| + GET_PEER(TwoByteString, uint16_t, raw_obj, peer); \ |
| + } \ |
| + } \ |
| + return false; \ |
| + |
| + |
| +bool Api::ExternalStringGetPeerHelper(Dart_NativeArguments args, |
| + int arg_index, |
| + void** peer) { |
| + NoGCScope no_gc_scope; |
| + NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| + RawObject* raw_obj = arguments->NativeArgAt(arg_index); |
| + intptr_t cid = raw_obj->GetClassId(); |
| + EXTERNAL_PEER_HELPER(cid, raw_obj, peer); |
| +} |
| + |
| + |
| bool Api::ExternalStringGetPeerHelper(Dart_Handle object, void** peer) { |
| NoGCScope no_gc_scope; |
| RawObject* raw_obj = Api::UnwrapHandle(object); |
| - switch (Api::ClassId(object)) { |
| - case kExternalOneByteStringCid: { |
| - RawExternalOneByteString* raw_string = |
| - reinterpret_cast<RawExternalOneByteString*>(raw_obj)->ptr(); |
| - ExternalStringData<uint8_t>* data = raw_string->external_data_; |
| - *peer = data->peer(); |
| - return true; |
| - } |
| - case kExternalTwoByteStringCid: { |
| - RawExternalTwoByteString* raw_string = |
| - reinterpret_cast<RawExternalTwoByteString*>(raw_obj)->ptr(); |
| - ExternalStringData<uint16_t>* data = raw_string->external_data_; |
| - *peer = data->peer(); |
| - return true; |
| - } |
| - } |
| - return false; |
| + EXTERNAL_PEER_HELPER(Api::ClassId(object), raw_obj, peer); |
| } |
| @@ -3686,18 +3701,14 @@ |
| NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| Isolate* isolate = arguments->isolate(); |
| CHECK_ISOLATE(isolate); |
| + if (Api::ExternalStringGetPeerHelper(args, arg_index, peer)) { |
| + return Api::Success(); |
| + } |
| + *peer = NULL; |
| 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 != NULL); |
| - return Api::Success(); |
| - } |
| - *peer = NULL; |
| - if (RawObject::IsStringClassId(cid)) { |
| + if (RawObject::IsStringClassId(obj.GetClassId())) { |
| return Api::NewHandle(isolate, obj.raw()); |
| } |
| return Api::NewError("%s expects argument to be of" |