Index: runtime/bin/file.cc |
diff --git a/runtime/bin/file.cc b/runtime/bin/file.cc |
index a1efe42c5fc6159e89123e0994c3c852894a2ab6..7cc3e7181198de86a31755b42c2e20ca44efcdd6 100644 |
--- a/runtime/bin/file.cc |
+++ b/runtime/bin/file.cc |
@@ -24,7 +24,6 @@ static bool capture_stdout = false; |
// Are we capturing output from stderr for the VM service? |
static bool capture_stderr = false; |
- |
void SetCaptureStdout(bool value) { |
capture_stdout = value; |
} |
@@ -45,7 +44,6 @@ bool ShouldCaptureStderr() { |
} |
- |
// The file pointer has been passed into Dart as an intptr_t and it is safe |
// to pull it out of Dart as a 64-bit integer, cast it to an intptr_t and |
// from there to a File pointer. |
@@ -83,11 +81,11 @@ bool File::WriteFully(const void* buffer, int64_t num_bytes) { |
} |
if (capture_stdout || capture_stderr) { |
intptr_t fd = GetFD(); |
- if (fd == STDOUT_FILENO && capture_stdout) { |
+ if ((fd == STDOUT_FILENO) && capture_stdout) { |
Dart_ServiceSendDataEvent("Stdout", "WriteEvent", |
reinterpret_cast<const uint8_t*>(buffer), |
num_bytes); |
- } else if (fd == STDERR_FILENO && capture_stderr) { |
+ } else if ((fd == STDERR_FILENO) && capture_stderr) { |
Dart_ServiceSendDataEvent("Stderr", "WriteEvent", |
reinterpret_cast<const uint8_t*>(buffer), |
num_bytes); |
@@ -98,11 +96,11 @@ bool File::WriteFully(const void* buffer, int64_t num_bytes) { |
File::FileOpenMode File::DartModeToFileMode(DartFileOpenMode mode) { |
- ASSERT(mode == File::kDartRead || |
- mode == File::kDartWrite || |
- mode == File::kDartAppend || |
- mode == File::kDartWriteOnly || |
- mode == File::kDartWriteOnlyAppend); |
+ ASSERT((mode == File::kDartRead) || |
+ (mode == File::kDartWrite) || |
+ (mode == File::kDartAppend) || |
+ (mode == File::kDartWriteOnly) || |
+ (mode == File::kDartWriteOnlyAppend)); |
if (mode == File::kDartWrite) { |
return File::kWriteTruncate; |
} |
@@ -131,7 +129,7 @@ void FUNCTION_NAME(File_Open)(Dart_NativeArguments args) { |
// files. Directories can be opened for reading using the posix |
// 'open' call. |
File* file = NULL; |
- file = File::Open(filename, file_mode); |
+ file = File::ScopedOpen(filename, file_mode); |
if (file != NULL) { |
Dart_SetReturnValue(args, |
Dart_NewInteger(reinterpret_cast<intptr_t>(file))); |
@@ -219,7 +217,9 @@ void FUNCTION_NAME(File_Read)(Dart_NativeArguments args) { |
// TODO(sgjesse): Cache the _makeUint8ListView function somewhere. |
Dart_Handle io_lib = |
Dart_LookupLibrary(DartUtils::NewString("dart:io")); |
- if (Dart_IsError(io_lib)) Dart_PropagateError(io_lib); |
+ if (Dart_IsError(io_lib)) { |
+ Dart_PropagateError(io_lib); |
+ } |
Dart_Handle array_view = |
Dart_Invoke(io_lib, |
DartUtils::NewString("_makeUint8ListView"), |
@@ -253,9 +253,11 @@ void FUNCTION_NAME(File_ReadInto)(Dart_NativeArguments args) { |
intptr_t length = end - start; |
intptr_t array_len = 0; |
Dart_Handle result = Dart_ListLength(buffer_obj, &array_len); |
- if (Dart_IsError(result)) Dart_PropagateError(result); |
+ if (Dart_IsError(result)) { |
+ Dart_PropagateError(result); |
+ } |
ASSERT(end <= array_len); |
- uint8_t* buffer = new uint8_t[length]; |
+ uint8_t* buffer = Dart_ScopeAllocate(length); |
int64_t bytes_read = file->Read(reinterpret_cast<void*>(buffer), length); |
if (bytes_read >= 0) { |
result = Dart_ListSetAsBytes(buffer_obj, start, buffer, bytes_read); |
@@ -267,7 +269,6 @@ void FUNCTION_NAME(File_ReadInto)(Dart_NativeArguments args) { |
} else { |
Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
} |
- delete[] buffer; |
} |
@@ -294,7 +295,9 @@ void FUNCTION_NAME(File_WriteFrom)(Dart_NativeArguments args) { |
void* buffer = NULL; |
Dart_Handle result = |
Dart_TypedDataAcquireData(buffer_obj, &type, &buffer, &buffer_len); |
- if (Dart_IsError(result)) Dart_PropagateError(result); |
+ if (Dart_IsError(result)) { |
+ Dart_PropagateError(result); |
+ } |
ASSERT(type == Dart_TypedData_kUint8 || type == Dart_TypedData_kInt8); |
ASSERT(end <= buffer_len); |
@@ -305,7 +308,9 @@ void FUNCTION_NAME(File_WriteFrom)(Dart_NativeArguments args) { |
// Release the direct pointer acquired above. |
result = Dart_TypedDataReleaseData(buffer_obj); |
- if (Dart_IsError(result)) Dart_PropagateError(result); |
+ if (Dart_IsError(result)) { |
+ Dart_PropagateError(result); |
+ } |
if (!success) { |
Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
@@ -466,12 +471,11 @@ void FUNCTION_NAME(File_LinkTarget)(Dart_NativeArguments args) { |
if (Dart_IsString(Dart_GetNativeArgument(args, 0))) { |
const char* name = |
DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0)); |
- char* target = File::LinkTarget(name); |
+ const char* target = File::LinkTarget(name); |
if (target == NULL) { |
Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
} else { |
Dart_SetReturnValue(args, DartUtils::NewString(target)); |
- free(target); |
} |
} else { |
Dart_Handle err = DartUtils::NewDartArgumentError( |
@@ -550,10 +554,9 @@ void FUNCTION_NAME(File_Copy)(Dart_NativeArguments args) { |
void FUNCTION_NAME(File_ResolveSymbolicLinks)(Dart_NativeArguments args) { |
const char* str = |
DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0)); |
- char* path = File::GetCanonicalPath(str); |
+ const char* path = File::GetCanonicalPath(str); |
if (path != NULL) { |
Dart_SetReturnValue(args, DartUtils::NewString(path)); |
- free(path); |
} else { |
Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
} |
@@ -605,7 +608,9 @@ void FUNCTION_NAME(File_Stat)(Dart_NativeArguments args) { |
} else { |
Dart_Handle returned_data = Dart_NewTypedData(Dart_TypedData_kInt64, |
File::kStatSize); |
- if (Dart_IsError(returned_data)) Dart_PropagateError(returned_data); |
+ if (Dart_IsError(returned_data)) { |
+ Dart_PropagateError(returned_data); |
+ } |
Dart_TypedData_Type data_type_unused; |
void* data_location; |
intptr_t data_length_unused; |
@@ -613,10 +618,14 @@ void FUNCTION_NAME(File_Stat)(Dart_NativeArguments args) { |
&data_type_unused, |
&data_location, |
&data_length_unused); |
- if (Dart_IsError(status)) Dart_PropagateError(status); |
+ 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); |
+ if (Dart_IsError(status)) { |
+ Dart_PropagateError(status); |
+ } |
Dart_SetReturnValue(args, returned_data); |
} |
} else { |
@@ -669,7 +678,7 @@ File* CObjectToFilePointer(CObject* cobject) { |
CObject* File::ExistsRequest(const CObjectArray& request) { |
- if (request.Length() == 1 && request[0]->IsString()) { |
+ if ((request.Length() == 1) && request[0]->IsString()) { |
CObjectString filename(request[0]); |
bool result = File::Exists(filename.CString()); |
return CObject::Bool(result); |
@@ -679,7 +688,7 @@ CObject* File::ExistsRequest(const CObjectArray& request) { |
CObject* File::CreateRequest(const CObjectArray& request) { |
- if (request.Length() == 1 && request[0]->IsString()) { |
+ if ((request.Length() == 1) && request[0]->IsString()) { |
CObjectString filename(request[0]); |
bool result = File::Create(filename.CString()); |
if (result) { |
@@ -691,9 +700,10 @@ CObject* File::CreateRequest(const CObjectArray& request) { |
return CObject::IllegalArgumentError(); |
} |
+ |
CObject* File::OpenRequest(const CObjectArray& request) { |
File* file = NULL; |
- if (request.Length() == 2 && |
+ if ((request.Length() == 2) && |
request[0]->IsString() && |
request[1]->IsInt32()) { |
CObjectString filename(request[0]); |
@@ -701,7 +711,7 @@ CObject* File::OpenRequest(const CObjectArray& request) { |
File::DartFileOpenMode dart_file_mode = |
static_cast<File::DartFileOpenMode>(mode.Value()); |
File::FileOpenMode file_mode = File::DartModeToFileMode(dart_file_mode); |
- file = File::Open(filename.CString(), file_mode); |
+ file = File::ScopedOpen(filename.CString(), file_mode); |
if (file != NULL) { |
return new CObjectIntptr( |
CObject::NewIntptr(reinterpret_cast<intptr_t>(file))); |
@@ -714,7 +724,7 @@ CObject* File::OpenRequest(const CObjectArray& request) { |
CObject* File::DeleteRequest(const CObjectArray& request) { |
- if (request.Length() == 1 && request[0]->IsString()) { |
+ if ((request.Length() == 1) && request[0]->IsString()) { |
CObjectString filename(request[0]); |
bool result = File::Delete(filename.CString()); |
if (result) { |
@@ -728,13 +738,15 @@ CObject* File::DeleteRequest(const CObjectArray& request) { |
CObject* File::RenameRequest(const CObjectArray& request) { |
- if (request.Length() == 2 && |
+ if ((request.Length() == 2) && |
request[0]->IsString() && |
request[1]->IsString()) { |
CObjectString old_path(request[0]); |
CObjectString new_path(request[1]); |
bool completed = File::Rename(old_path.CString(), new_path.CString()); |
- if (completed) return CObject::True(); |
+ if (completed) { |
+ return CObject::True(); |
+ } |
return CObject::NewOSError(); |
} |
return CObject::IllegalArgumentError(); |
@@ -742,13 +754,15 @@ CObject* File::RenameRequest(const CObjectArray& request) { |
CObject* File::CopyRequest(const CObjectArray& request) { |
- if (request.Length() == 2 && |
+ if ((request.Length() == 2) && |
request[0]->IsString() && |
request[1]->IsString()) { |
CObjectString old_path(request[0]); |
CObjectString new_path(request[1]); |
bool completed = File::Copy(old_path.CString(), new_path.CString()); |
- if (completed) return CObject::True(); |
+ if (completed) { |
+ return CObject::True(); |
+ } |
return CObject::NewOSError(); |
} |
return CObject::IllegalArgumentError(); |
@@ -756,12 +770,11 @@ CObject* File::CopyRequest(const CObjectArray& request) { |
CObject* File::ResolveSymbolicLinksRequest(const CObjectArray& request) { |
- if (request.Length() == 1 && request[0]->IsString()) { |
+ if ((request.Length() == 1) && request[0]->IsString()) { |
CObjectString filename(request[0]); |
- char* result = File::GetCanonicalPath(filename.CString()); |
+ const char* result = File::GetCanonicalPath(filename.CString()); |
if (result != NULL) { |
CObject* path = new CObjectString(CObject::NewString(result)); |
- free(result); |
return path; |
} else { |
return CObject::NewOSError(); |
@@ -773,7 +786,7 @@ CObject* File::ResolveSymbolicLinksRequest(const CObjectArray& request) { |
CObject* File::CloseRequest(const CObjectArray& request) { |
intptr_t return_value = -1; |
- if (request.Length() == 1 && request[0]->IsIntptr()) { |
+ if ((request.Length() == 1) && request[0]->IsIntptr()) { |
File* file = CObjectToFilePointer(request[0]); |
ASSERT(file != NULL); |
delete file; |
@@ -784,7 +797,7 @@ CObject* File::CloseRequest(const CObjectArray& request) { |
CObject* File::PositionRequest(const CObjectArray& request) { |
- if (request.Length() == 1 && request[0]->IsIntptr()) { |
+ if ((request.Length() == 1) && request[0]->IsIntptr()) { |
File* file = CObjectToFilePointer(request[0]); |
ASSERT(file != NULL); |
if (!file->IsClosed()) { |
@@ -803,7 +816,7 @@ CObject* File::PositionRequest(const CObjectArray& request) { |
CObject* File::SetPositionRequest(const CObjectArray& request) { |
- if (request.Length() == 2 && |
+ if ((request.Length() == 2) && |
request[0]->IsIntptr() && |
request[1]->IsInt32OrInt64()) { |
File* file = CObjectToFilePointer(request[0]); |
@@ -824,7 +837,7 @@ CObject* File::SetPositionRequest(const CObjectArray& request) { |
CObject* File::TruncateRequest(const CObjectArray& request) { |
- if (request.Length() == 2 && |
+ if ((request.Length() == 2) && |
request[0]->IsIntptr() && |
request[1]->IsInt32OrInt64()) { |
File* file = CObjectToFilePointer(request[0]); |
@@ -845,7 +858,7 @@ CObject* File::TruncateRequest(const CObjectArray& request) { |
CObject* File::LengthRequest(const CObjectArray& request) { |
- if (request.Length() == 1 && request[0]->IsIntptr()) { |
+ if ((request.Length() == 1) && request[0]->IsIntptr()) { |
File* file = CObjectToFilePointer(request[0]); |
ASSERT(file != NULL); |
if (!file->IsClosed()) { |
@@ -864,7 +877,7 @@ CObject* File::LengthRequest(const CObjectArray& request) { |
CObject* File::LengthFromPathRequest(const CObjectArray& request) { |
- if (request.Length() == 1 && request[0]->IsString()) { |
+ if ((request.Length() == 1) && request[0]->IsString()) { |
CObjectString filepath(request[0]); |
int64_t return_value = File::LengthFromPath(filepath.CString()); |
if (return_value >= 0) { |
@@ -878,7 +891,7 @@ CObject* File::LengthFromPathRequest(const CObjectArray& request) { |
CObject* File::LastModifiedRequest(const CObjectArray& request) { |
- if (request.Length() == 1 && request[0]->IsString()) { |
+ if ((request.Length() == 1) && request[0]->IsString()) { |
CObjectString filepath(request[0]); |
int64_t return_value = File::LastModified(filepath.CString()); |
if (return_value >= 0) { |
@@ -892,7 +905,7 @@ CObject* File::LastModifiedRequest(const CObjectArray& request) { |
CObject* File::FlushRequest(const CObjectArray& request) { |
- if (request.Length() == 1 && request[0]->IsIntptr()) { |
+ if ((request.Length() == 1) && request[0]->IsIntptr()) { |
File* file = CObjectToFilePointer(request[0]); |
ASSERT(file != NULL); |
if (!file->IsClosed()) { |
@@ -910,7 +923,7 @@ CObject* File::FlushRequest(const CObjectArray& request) { |
CObject* File::ReadByteRequest(const CObjectArray& request) { |
- if (request.Length() == 1 && request[0]->IsIntptr()) { |
+ if ((request.Length() == 1) && request[0]->IsIntptr()) { |
File* file = CObjectToFilePointer(request[0]); |
ASSERT(file != NULL); |
if (!file->IsClosed()) { |
@@ -932,7 +945,7 @@ CObject* File::ReadByteRequest(const CObjectArray& request) { |
CObject* File::WriteByteRequest(const CObjectArray& request) { |
- if (request.Length() == 2 && |
+ if ((request.Length() == 2) && |
request[0]->IsIntptr() && |
request[1]->IsInt32OrInt64()) { |
File* file = CObjectToFilePointer(request[0]); |
@@ -955,7 +968,7 @@ CObject* File::WriteByteRequest(const CObjectArray& request) { |
CObject* File::ReadRequest(const CObjectArray& request) { |
- if (request.Length() == 2 && |
+ if ((request.Length() == 2) && |
request[0]->IsIntptr() && |
request[1]->IsInt32OrInt64()) { |
File* file = CObjectToFilePointer(request[0]); |
@@ -987,7 +1000,7 @@ CObject* File::ReadRequest(const CObjectArray& request) { |
CObject* File::ReadIntoRequest(const CObjectArray& request) { |
- if (request.Length() == 2 && |
+ if ((request.Length() == 2) && |
request[0]->IsIntptr() && |
request[1]->IsInt32OrInt64()) { |
File* file = CObjectToFilePointer(request[0]); |
@@ -1045,7 +1058,7 @@ static int SizeInBytes(Dart_TypedData_Type type) { |
CObject* File::WriteFromRequest(const CObjectArray& request) { |
- if (request.Length() == 4 && |
+ if ((request.Length() == 4) && |
request[0]->IsIntptr() && |
(request[1]->IsTypedData() || request[1]->IsArray()) && |
request[2]->IsInt32OrInt64() && |
@@ -1064,14 +1077,13 @@ CObject* File::WriteFromRequest(const CObjectArray& request) { |
buffer_start = typed_data.Buffer() + start; |
} else { |
CObjectArray array(request[1]); |
- buffer_start = new uint8_t[length]; |
+ buffer_start = Dart_ScopeAllocate(length); |
for (int i = 0; i < length; i++) { |
if (array[i + start]->IsInt32OrInt64()) { |
int64_t value = CObjectInt32OrInt64ToInt64(array[i + start]); |
buffer_start[i] = static_cast<uint8_t>(value & 0xFF); |
} else { |
// Unsupported type. |
- delete[] buffer_start; |
return CObject::IllegalArgumentError(); |
} |
} |
@@ -1079,9 +1091,6 @@ CObject* File::WriteFromRequest(const CObjectArray& request) { |
} |
bool success = |
file->WriteFully(reinterpret_cast<void*>(buffer_start), length); |
- if (!request[1]->IsTypedData()) { |
- delete[] buffer_start; |
- } |
if (success) { |
return new CObjectInt64(CObject::NewInt64(length)); |
} else { |
@@ -1096,7 +1105,7 @@ CObject* File::WriteFromRequest(const CObjectArray& request) { |
CObject* File::CreateLinkRequest(const CObjectArray& request) { |
- if (request.Length() != 2 || |
+ if ((request.Length() != 2) || |
!request[0]->IsString() || |
!request[1]->IsString()) { |
return CObject::IllegalArgumentError(); |
@@ -1112,7 +1121,7 @@ CObject* File::CreateLinkRequest(const CObjectArray& request) { |
CObject* File::DeleteLinkRequest(const CObjectArray& request) { |
- if (request.Length() == 1 && request[0]->IsString()) { |
+ if ((request.Length() == 1) && request[0]->IsString()) { |
CObjectString link_path(request[0]); |
bool result = File::DeleteLink(link_path.CString()); |
if (result) { |
@@ -1126,13 +1135,15 @@ CObject* File::DeleteLinkRequest(const CObjectArray& request) { |
CObject* File::RenameLinkRequest(const CObjectArray& request) { |
- if (request.Length() == 2 && |
+ if ((request.Length() == 2) && |
request[0]->IsString() && |
request[1]->IsString()) { |
CObjectString old_path(request[0]); |
CObjectString new_path(request[1]); |
bool completed = File::RenameLink(old_path.CString(), new_path.CString()); |
- if (completed) return CObject::True(); |
+ if (completed) { |
+ return CObject::True(); |
+ } |
return CObject::NewOSError(); |
} |
return CObject::IllegalArgumentError(); |
@@ -1140,12 +1151,11 @@ CObject* File::RenameLinkRequest(const CObjectArray& request) { |
CObject* File::LinkTargetRequest(const CObjectArray& request) { |
- if (request.Length() == 1 && request[0]->IsString()) { |
+ if ((request.Length() == 1) && request[0]->IsString()) { |
CObjectString link_path(request[0]); |
- char* target = File::LinkTarget(link_path.CString()); |
+ const char* target = File::LinkTarget(link_path.CString()); |
if (target != NULL) { |
CObject* result = new CObjectString(CObject::NewString(target)); |
- free(target); |
return result; |
} else { |
return CObject::NewOSError(); |
@@ -1156,7 +1166,7 @@ CObject* File::LinkTargetRequest(const CObjectArray& request) { |
CObject* File::TypeRequest(const CObjectArray& request) { |
- if (request.Length() == 2 && |
+ if ((request.Length() == 2) && |
request[0]->IsString() && |
request[1]->IsBool()) { |
CObjectString path(request[0]); |
@@ -1169,7 +1179,7 @@ CObject* File::TypeRequest(const CObjectArray& request) { |
CObject* File::IdenticalRequest(const CObjectArray& request) { |
- if (request.Length() == 2 && |
+ if ((request.Length() == 2) && |
request[0]->IsString() && |
request[1]->IsString()) { |
CObjectString path1(request[0]); |
@@ -1189,8 +1199,7 @@ CObject* File::IdenticalRequest(const CObjectArray& request) { |
CObject* File::StatRequest(const CObjectArray& request) { |
- if (request.Length() == 1 && |
- request[0]->IsString()) { |
+ if ((request.Length() == 1) && request[0]->IsString()) { |
int64_t data[File::kStatSize]; |
CObjectString path(request[0]); |
File::Stat(path.CString(), data); |
@@ -1212,7 +1221,7 @@ CObject* File::StatRequest(const CObjectArray& request) { |
CObject* File::LockRequest(const CObjectArray& request) { |
- if (request.Length() == 4 && |
+ if ((request.Length() == 4) && |
request[0]->IsIntptr() && |
request[1]->IsInt32OrInt64() && |
request[2]->IsInt32OrInt64() && |