Chromium Code Reviews| Index: runtime/bin/file.cc |
| diff --git a/runtime/bin/file.cc b/runtime/bin/file.cc |
| index bc8ca4cbcd4645fb4ee5981c72c37960001acfab..09f4a7bf723e0608d37e4c75e5dd0ed33ace14d7 100644 |
| --- a/runtime/bin/file.cc |
| +++ b/runtime/bin/file.cc |
| @@ -582,6 +582,38 @@ void FUNCTION_NAME(File_GetType)(Dart_NativeArguments args) { |
| } |
| +void FUNCTION_NAME(File_Stat)(Dart_NativeArguments args) { |
| + Dart_EnterScope(); |
| + if (Dart_IsString(Dart_GetNativeArgument(args, 0))) { |
| + const char* path = |
| + DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0)); |
| + |
| + int64_t stat_data[File::kStatSize]; |
| + File::Stat(path, stat_data); |
| + Dart_Handle returned_data = Dart_NewTypedData(kInt64, File::kStatSize); |
| + if (Dart_IsError(returned_data)) Dart_PropagateError(returned_data); |
| + Dart_TypedData_Type data_type_unused; |
| + void* data_location; |
| + intptr_t data_length_unused; |
| + Dart_Handle status = Dart_TypedDataAcquireData(returned_data, |
| + &data_type_unused, |
| + &data_location, |
| + &data_length_unused); |
| + if (Dart_IsError(status)) Dart_PropagateError(status); |
| + memmove(data_location, stat_data, File::kStatSize * sizeof(int64_t)); |
| + status = Dart_TypedDataReleaseData(returned_data); |
| + if (Dart_IsError(status)) Dart_PropagateError(status); |
| + Dart_SetReturnValue(args, returned_data); |
| + } else { |
| + Dart_Handle err = DartUtils::NewDartArgumentError( |
| + "Non-string argument to FileSystemEntity.type"); |
|
Søren Gjesse
2013/05/14 13:50:36
.type -> .stat
Bill Hesse
2013/05/14 16:33:58
Done.
|
| + if (Dart_IsError(err)) Dart_PropagateError(err); |
| + Dart_SetReturnValue(args, err); |
| + } |
| + Dart_ExitScope(); |
| +} |
| + |
| + |
| void FUNCTION_NAME(File_AreIdentical)(Dart_NativeArguments args) { |
| Dart_EnterScope(); |
| if (Dart_IsString(Dart_GetNativeArgument(args, 0)) && |
| @@ -1122,6 +1154,26 @@ static CObject* FileIdenticalRequest(const CObjectArray& request) { |
| } |
| +static CObject* FileStatRequest(const CObjectArray& request) { |
| + if (request.Length() == 2 && |
| + request[1]->IsString()) { |
| + int64_t data[File::kStatSize]; |
| + CObjectString path(request[1]); |
| + File::Stat(path.CString(), data); |
| + CObjectArray* result = |
| + new CObjectArray(CObject::NewArray(File::kStatSize)); |
| + for (int i = 0; i < File::kStatSize; ++i) { |
| + result->SetAt(i, new CObjectInt64(CObject::NewInt64(data[i]))); |
| + } |
| + CObjectArray* wrapper = new CObjectArray(CObject::NewArray(2)); |
| + wrapper->SetAt(0, new CObjectInt32(CObject::NewInt32(CObject::kSuccess))); |
| + wrapper->SetAt(1, result); |
| + return wrapper; |
| + } |
| + return CObject::IllegalArgumentError(); |
| +} |
| + |
| + |
| static void FileService(Dart_Port dest_port_id, |
| Dart_Port reply_port_id, |
| Dart_CObject* message) { |
| @@ -1203,6 +1255,9 @@ static void FileService(Dart_Port dest_port_id, |
| case File::kIdenticalRequest: |
| response = FileIdenticalRequest(request); |
| break; |
| + case File::kStatRequest: |
| + response = FileStatRequest(request); |
| + break; |
| default: |
| UNREACHABLE(); |
| } |