Index: runtime/bin/directory.cc |
diff --git a/runtime/bin/directory.cc b/runtime/bin/directory.cc |
index a28b01cd9852e6ca7a5815ff5e05b2a6fba1c664..3791197cc5ddb0d2936475c166e05ad5317da0f1 100644 |
--- a/runtime/bin/directory.cc |
+++ b/runtime/bin/directory.cc |
@@ -13,10 +13,9 @@ namespace dart { |
namespace bin { |
void FUNCTION_NAME(Directory_Current)(Dart_NativeArguments args) { |
- char* current = Directory::Current(); |
+ const char* current = Directory::Current(); |
if (current != NULL) { |
Dart_SetReturnValue(args, DartUtils::NewString(current)); |
- free(current); |
} else { |
Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
} |
@@ -69,9 +68,8 @@ void FUNCTION_NAME(Directory_Create)(Dart_NativeArguments args) { |
void FUNCTION_NAME(Directory_SystemTemp)( |
Dart_NativeArguments args) { |
- char* result = Directory::SystemTemp(); |
+ const char* result = Directory::SystemTemp(); |
Dart_SetReturnValue(args, DartUtils::NewString(result)); |
- free(result); |
} |
@@ -82,10 +80,10 @@ void FUNCTION_NAME(Directory_CreateTemp)(Dart_NativeArguments args) { |
"Prefix argument of CreateSystemTempSync is not a String")); |
return; |
} |
- char* result = Directory::CreateTemp(DartUtils::GetStringValue(path)); |
+ const char* result = |
+ Directory::CreateTemp(DartUtils::GetStringValue(path)); |
if (result != NULL) { |
Dart_SetReturnValue(args, DartUtils::NewString(result)); |
- free(result); |
} else { |
Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
} |
@@ -187,10 +185,9 @@ CObject* Directory::ExistsRequest(const CObjectArray& request) { |
CObject* Directory::CreateTempRequest(const CObjectArray& request) { |
if (request.Length() == 1 && request[0]->IsString()) { |
CObjectString path(request[0]); |
- char* result = Directory::CreateTemp(path.CString()); |
+ const char* result = Directory::CreateTemp(path.CString()); |
if (result != NULL) { |
CObject* temp_dir = new CObjectString(CObject::NewString(result)); |
- free(result); |
return temp_dir; |
} else { |
return CObject::NewOSError(); |
@@ -243,8 +240,7 @@ CObject* Directory::ListStartRequest(const CObjectArray& request) { |
CObject* Directory::ListNextRequest(const CObjectArray& request) { |
- if (request.Length() == 1 && |
- request[0]->IsIntptr()) { |
+ if ((request.Length() == 1) && request[0]->IsIntptr()) { |
CObjectIntptr ptr(request[0]); |
AsyncDirectoryListing* dir_listing = |
reinterpret_cast<AsyncDirectoryListing*>(ptr.Value()); |
@@ -265,7 +261,7 @@ CObject* Directory::ListNextRequest(const CObjectArray& request) { |
CObject* Directory::ListStopRequest(const CObjectArray& request) { |
- if (request.Length() == 1 && request[0]->IsIntptr()) { |
+ if ((request.Length() == 1) && request[0]->IsIntptr()) { |
CObjectIntptr ptr(request[0]); |
AsyncDirectoryListing* dir_listing = |
reinterpret_cast<AsyncDirectoryListing*>(ptr.Value()); |
@@ -283,7 +279,9 @@ CObject* Directory::RenameRequest(const CObjectArray& request) { |
CObjectString path(request[0]); |
CObjectString new_path(request[1]); |
bool completed = Directory::Rename(path.CString(), new_path.CString()); |
- if (completed) return CObject::True(); |
+ if (completed) { |
+ return CObject::True(); |
+ } |
return CObject::NewOSError(); |
} |
return CObject::IllegalArgumentError(); |
@@ -291,7 +289,7 @@ CObject* Directory::RenameRequest(const CObjectArray& request) { |
bool AsyncDirectoryListing::AddFileSystemEntityToResponse(Response type, |
- char* arg) { |
+ const char* arg) { |
array_->SetAt(index_++, new CObjectInt32(CObject::NewInt32(type))); |
if (arg != NULL) { |
array_->SetAt(index_++, new CObjectString(CObject::NewString(arg))); |
@@ -302,37 +300,42 @@ bool AsyncDirectoryListing::AddFileSystemEntityToResponse(Response type, |
} |
-bool AsyncDirectoryListing::HandleDirectory(char* dir_name) { |
+bool AsyncDirectoryListing::HandleDirectory(const char* dir_name) { |
return AddFileSystemEntityToResponse(kListDirectory, dir_name); |
} |
-bool AsyncDirectoryListing::HandleFile(char* file_name) { |
+bool AsyncDirectoryListing::HandleFile(const char* file_name) { |
return AddFileSystemEntityToResponse(kListFile, file_name); |
} |
-bool AsyncDirectoryListing::HandleLink(char* link_name) { |
+bool AsyncDirectoryListing::HandleLink(const char* link_name) { |
return AddFileSystemEntityToResponse(kListLink, link_name); |
} |
+ |
void AsyncDirectoryListing::HandleDone() { |
AddFileSystemEntityToResponse(kListDone, NULL); |
} |
-bool AsyncDirectoryListing::HandleError(const char* dir_name) { |
+bool AsyncDirectoryListing::HandleError() { |
CObject* err = CObject::NewOSError(); |
array_->SetAt(index_++, new CObjectInt32(CObject::NewInt32(kListError))); |
CObjectArray* response = new CObjectArray(CObject::NewArray(3)); |
response->SetAt(0, new CObjectInt32(CObject::NewInt32(kListError))); |
- response->SetAt(1, new CObjectString(CObject::NewString(dir_name))); |
+ // Delay calling CurrentPath() until after CObject::NewOSError() in case |
+ // CurrentPath() pollutes the OS error code. |
+ response->SetAt(1, new CObjectString(CObject::NewString( |
+ error() ? "Invalid path" : CurrentPath()))); |
response->SetAt(2, err); |
array_->SetAt(index_++, response); |
return index_ < length_; |
} |
-bool SyncDirectoryListing::HandleDirectory(char* dir_name) { |
+ |
+bool SyncDirectoryListing::HandleDirectory(const char* dir_name) { |
Dart_Handle dir_name_dart = DartUtils::NewString(dir_name); |
Dart_Handle dir = |
Dart_New(directory_type_, Dart_Null(), 1, &dir_name_dart); |
@@ -340,7 +343,8 @@ bool SyncDirectoryListing::HandleDirectory(char* dir_name) { |
return true; |
} |
-bool SyncDirectoryListing::HandleLink(char* link_name) { |
+ |
+bool SyncDirectoryListing::HandleLink(const char* link_name) { |
Dart_Handle link_name_dart = DartUtils::NewString(link_name); |
Dart_Handle link = |
Dart_New(link_type_, Dart_Null(), 1, &link_name_dart); |
@@ -348,7 +352,8 @@ bool SyncDirectoryListing::HandleLink(char* link_name) { |
return true; |
} |
-bool SyncDirectoryListing::HandleFile(char* file_name) { |
+ |
+bool SyncDirectoryListing::HandleFile(const char* file_name) { |
Dart_Handle file_name_dart = DartUtils::NewString(file_name); |
Dart_Handle file = |
Dart_New(file_type_, Dart_Null(), 1, &file_name_dart); |
@@ -356,11 +361,12 @@ bool SyncDirectoryListing::HandleFile(char* file_name) { |
return true; |
} |
-bool SyncDirectoryListing::HandleError(const char* dir_name) { |
+ |
+bool SyncDirectoryListing::HandleError() { |
Dart_Handle dart_os_error = DartUtils::NewDartOSError(); |
Dart_Handle args[3]; |
args[0] = DartUtils::NewString("Directory listing failed"); |
- args[1] = DartUtils::NewString(dir_name); |
+ args[1] = DartUtils::NewString(error() ? "Invalid path" : CurrentPath()); |
args[2] = dart_os_error; |
Dart_ThrowException(Dart_New( |
DartUtils::GetDartType(DartUtils::kIOLibURL, "FileSystemException"), |
@@ -386,7 +392,7 @@ static bool ListNext(DirectoryListing* listing) { |
return listing->HandleDirectory(listing->CurrentPath()); |
case kListError: |
- return listing->HandleError(listing->CurrentPath()); |
+ return listing->HandleError(); |
case kListDone: |
listing->Pop(); |
@@ -403,9 +409,10 @@ static bool ListNext(DirectoryListing* listing) { |
return false; |
} |
+ |
void Directory::List(DirectoryListing* listing) { |
if (listing->error()) { |
- listing->HandleError("Invalid path"); |
+ listing->HandleError(); |
listing->HandleDone(); |
} else { |
while (ListNext(listing)) {} |