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,47 @@ |
| 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; |
| + intptr_t class_id = Api::ClassId(object); |
| + RawObject* raw_obj = Api::UnwrapHandle(object); |
| + switch (class_id) { |
| + case kExternalOneByteStringCid: { |
| + RawExternalOneByteString* raw_string = |
| + reinterpret_cast<RawExternalOneByteString*>(raw_obj)->ptr(); |
| + ExternalStringData<uint8_t>* data = raw_string->external_data_; |
| + *peer = data->peer(); |
|
Ivan Posva
2012/08/29 05:59:30
How about this?
RawExternalOneByteString* raw_stri
|
| + break; |
| + } |
| + case kExternalTwoByteStringCid: { |
| + RawExternalTwoByteString* raw_string = |
| + reinterpret_cast<RawExternalTwoByteString*>(raw_obj)->ptr(); |
| + ExternalStringData<uint16_t>* data = raw_string->external_data_; |
| + *peer = data->peer(); |
| + break; |
| + } |
| + case kExternalFourByteStringCid: { |
| + RawExternalFourByteString* raw_string = |
| + reinterpret_cast<RawExternalFourByteString*>(raw_obj)->ptr(); |
| + ExternalStringData<uint32_t>* data = raw_string->external_data_; |
| + *peer = data->peer(); |
| + break; |
| + } |
| + default: { |
| + // It's not an external string, return appropriate error. |
| + if (!RawObject::IsStringClassId(class_id)) { |
| + RETURN_TYPE_ERROR(Isolate::Current(), object, String); |
| + } else { |
| + return |
| + Api::NewError( |
| + "%s expects argument 'object' to be an external String.", |
| + CURRENT_FUNC); |
| + } |
| + } |
| + } |
| + return Api::Success(Isolate::Current()); |
| } |