Chromium Code Reviews| Index: runtime/vm/dart_api_impl.cc |
| =================================================================== |
| --- runtime/vm/dart_api_impl.cc (revision 11476) |
| +++ runtime/vm/dart_api_impl.cc (working copy) |
| @@ -1528,22 +1528,48 @@ |
| DART_EXPORT Dart_Handle Dart_ExternalStringGetPeer(Dart_Handle object, |
| void** peer) { |
| - Isolate* isolate = Isolate::Current(); |
| - DARTSCOPE(isolate); |
| - const String& str = Api::UnwrapStringHandle(isolate, object); |
| - if (str.IsNull()) { |
| - RETURN_TYPE_ERROR(isolate, object, String); |
| - } |
| - if (!str.IsExternal()) { |
| - return |
| - Api::NewError("%s expects argument 'object' to be an external String.", |
| - CURRENT_FUNC); |
| - } |
| if (peer == NULL) { |
| RETURN_NULL_ERROR(peer); |
| } |
| - *peer = str.GetPeer(); |
| - return Api::Success(isolate); |
| +// NoGCScope no_gc_scope; |
| + if (Dart_IsExternalString(object)) { |
|
Ivan Posva
2012/08/28 22:21:20
I would restructure this a bit to avoid duplicate
Tom Ball
2012/08/29 00:16:39
Thanks, this looks much cleaner -- done.
|
| + Isolate* isolate = Isolate::Current(); |
| + intptr_t class_id = Api::ClassId(object); |
| + void* raw_peer; |
| + switch (class_id) { |
| + case kExternalOneByteStringCid: { |
| + RawExternalOneByteString* raw_string = |
| + (*(reinterpret_cast<RawExternalOneByteString**>(object)))->ptr(); |
|
Ivan Posva
2012/08/28 22:21:20
Please do not reach into the internals of handles.
Tom Ball
2012/08/29 00:16:39
Done.
|
| + ExternalStringData<uint8_t>* data = raw_string->external_data_; |
| + raw_peer = data != NULL ? data->peer() : NULL; |
|
Ivan Posva
2012/08/28 22:21:20
This extra check for data being NULL is not necess
Tom Ball
2012/08/29 00:16:39
Done.
|
| + break; |
| + } |
| + case kExternalTwoByteStringCid: { |
| + RawExternalTwoByteString* raw_string = |
| + (*(reinterpret_cast<RawExternalTwoByteString**>(object)))->ptr(); |
| + ExternalStringData<uint16_t>* data = raw_string->external_data_; |
| + raw_peer = data != NULL ? data->peer() : NULL; |
| + break; |
| + } |
| + default: { |
| + RawExternalFourByteString* raw_string = |
| + (*(reinterpret_cast<RawExternalFourByteString**>(object)))->ptr(); |
| + ExternalStringData<uint32_t>* data = raw_string->external_data_; |
| + raw_peer = data != NULL ? data->peer() : NULL; |
| + break; |
| + } |
| + } |
| + if (raw_peer != NULL) { |
| + *peer = raw_peer; |
| + return Api::Success(isolate); |
| + } else { |
| + RETURN_TYPE_ERROR(isolate, object, String); |
| + } |
| + } |
| + const char* error_msg = Dart_IsString(object) ? |
| + "%s expects argument 'object' to be an external String." : |
| + "%s expects argument 'object' to be of type String."; |
| + return Api::NewError(error_msg, CURRENT_FUNC); |
| } |