Index: runtime/bin/dartutils.cc |
=================================================================== |
--- runtime/bin/dartutils.cc (revision 22375) |
+++ runtime/bin/dartutils.cc (working copy) |
@@ -191,11 +191,52 @@ |
} |
-static const uint8_t* ReadFile(const char* filename, |
- intptr_t* file_len, |
- const char** error_msg) { |
- File* file = File::Open(filename, File::kRead); |
- if (file == NULL) { |
+void* DartUtils::OpenFile(const char* name, bool write) { |
+ File* file = File::Open(name, write ? File::kWriteTruncate : File::kRead); |
+ return reinterpret_cast<void*>(file); |
+} |
+ |
+ |
+void DartUtils::ReadFile(const uint8_t** data, |
+ intptr_t* file_len, |
+ void* stream) { |
+ ASSERT(data != NULL); |
+ ASSERT(file_len != NULL); |
+ ASSERT(stream != NULL); |
+ File* file_stream = reinterpret_cast<File*>(stream); |
+ *file_len = file_stream->Length(); |
+ ASSERT(*file_len > 0); |
+ uint8_t* text_buffer = reinterpret_cast<uint8_t*>(malloc(*file_len)); |
+ ASSERT(text_buffer != NULL); |
+ if (!file_stream->ReadFully(text_buffer, *file_len)) { |
+ *data = NULL; |
+ *file_len = -1; // Indicates read was not successful. |
+ return; |
+ } |
+ *data = text_buffer; |
+} |
+ |
+ |
+void DartUtils::WriteFile(const void* buffer, |
+ intptr_t num_bytes, |
+ void* stream) { |
+ ASSERT(stream != NULL); |
+ File* file_stream = reinterpret_cast<File*>(stream); |
+ bool bytes_written = file_stream->WriteFully(buffer, num_bytes); |
+ ASSERT(bytes_written); |
+} |
+ |
+ |
+void DartUtils::CloseFile(void* stream) { |
+ delete reinterpret_cast<File*>(stream); |
+} |
+ |
+ |
+static const uint8_t* ReadFileFully(const char* filename, |
+ intptr_t* file_len, |
+ const char** error_msg) { |
+ void* stream = DartUtils::OpenFile(filename, false); |
+ if (stream == NULL) { |
const char* format = "Unable to open file: %s"; |
intptr_t len = snprintf(NULL, 0, format, filename); |
// TODO(iposva): Allocate from the zone instead of leaking error string |
@@ -205,20 +246,14 @@ |
*error_msg = msg; |
return NULL; |
} |
- *file_len = file->Length(); |
- uint8_t* text_buffer = reinterpret_cast<uint8_t*>(malloc(*file_len)); |
- if (text_buffer == NULL) { |
- delete file; |
- *error_msg = "Unable to allocate buffer"; |
- return NULL; |
+ *file_len = -1; |
+ const uint8_t* text_buffer = NULL; |
+ DartUtils::ReadFile(&text_buffer, file_len, stream); |
+ if (text_buffer == NULL || *file_len == -1) { |
+ *error_msg = "Unable to read file contents"; |
+ text_buffer = NULL; |
} |
- if (!file->ReadFully(text_buffer, *file_len)) { |
- delete file; |
- free(text_buffer); |
- *error_msg = "Unable to fully read contents"; |
- return NULL; |
- } |
- delete file; |
+ DartUtils::CloseFile(stream); |
return text_buffer; |
} |
@@ -226,7 +261,7 @@ |
Dart_Handle DartUtils::ReadStringFromFile(const char* filename) { |
const char* error_msg = NULL; |
intptr_t len; |
- const uint8_t* text_buffer = ReadFile(filename, &len, &error_msg); |
+ const uint8_t* text_buffer = ReadFileFully(filename, &len, &error_msg); |
if (text_buffer == NULL) { |
return Dart_Error(error_msg); |
} |
@@ -384,7 +419,9 @@ |
Dart_StringToCString(script_path, &script_path_cstr); |
const char* error_msg = NULL; |
intptr_t len; |
- const uint8_t* text_buffer = ReadFile(script_path_cstr, &len, &error_msg); |
+ const uint8_t* text_buffer = ReadFileFully(script_path_cstr, |
+ &len, |
+ &error_msg); |
if (text_buffer == NULL) { |
return Dart_Error(error_msg); |
} |