| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "bin/dartutils.h" | 5 #include "bin/dartutils.h" |
| 6 | 6 |
| 7 #include "bin/extensions.h" | 7 #include "bin/extensions.h" |
| 8 #include "bin/directory.h" | 8 #include "bin/directory.h" |
| 9 #include "bin/file.h" | 9 #include "bin/file.h" |
| 10 #include "bin/io_buffer.h" | 10 #include "bin/io_buffer.h" |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 184 } | 184 } |
| 185 // Calculate the canonical path. | 185 // Calculate the canonical path. |
| 186 const char* canon_url_str = GetCanonicalPath(library_url_str, url_str); | 186 const char* canon_url_str = GetCanonicalPath(library_url_str, url_str); |
| 187 Dart_Handle canon_url = NewString(canon_url_str); | 187 Dart_Handle canon_url = NewString(canon_url_str); |
| 188 free(const_cast<char*>(canon_url_str)); | 188 free(const_cast<char*>(canon_url_str)); |
| 189 | 189 |
| 190 return canon_url; | 190 return canon_url; |
| 191 } | 191 } |
| 192 | 192 |
| 193 | 193 |
| 194 static const uint8_t* ReadFile(const char* filename, | 194 void* DartUtils::OpenFile(const char* name, bool write) { |
| 195 intptr_t* file_len, | 195 File* file = File::Open(name, write ? File::kWriteTruncate : File::kRead); |
| 196 const char** error_msg) { | 196 return reinterpret_cast<void*>(file); |
| 197 File* file = File::Open(filename, File::kRead); | 197 } |
| 198 if (file == NULL) { | 198 |
| 199 |
| 200 void DartUtils::ReadFile(const uint8_t** data, |
| 201 intptr_t* file_len, |
| 202 void* stream) { |
| 203 ASSERT(data != NULL); |
| 204 ASSERT(file_len != NULL); |
| 205 ASSERT(stream != NULL); |
| 206 File* file_stream = reinterpret_cast<File*>(stream); |
| 207 *file_len = file_stream->Length(); |
| 208 ASSERT(*file_len > 0); |
| 209 uint8_t* text_buffer = reinterpret_cast<uint8_t*>(malloc(*file_len)); |
| 210 ASSERT(text_buffer != NULL); |
| 211 if (!file_stream->ReadFully(text_buffer, *file_len)) { |
| 212 *data = NULL; |
| 213 *file_len = -1; // Indicates read was not successful. |
| 214 return; |
| 215 } |
| 216 *data = text_buffer; |
| 217 } |
| 218 |
| 219 |
| 220 void DartUtils::WriteFile(const void* buffer, |
| 221 intptr_t num_bytes, |
| 222 void* stream) { |
| 223 ASSERT(stream != NULL); |
| 224 File* file_stream = reinterpret_cast<File*>(stream); |
| 225 bool bytes_written = file_stream->WriteFully(buffer, num_bytes); |
| 226 ASSERT(bytes_written); |
| 227 } |
| 228 |
| 229 |
| 230 void DartUtils::CloseFile(void* stream) { |
| 231 delete reinterpret_cast<File*>(stream); |
| 232 } |
| 233 |
| 234 |
| 235 static const uint8_t* ReadFileFully(const char* filename, |
| 236 intptr_t* file_len, |
| 237 const char** error_msg) { |
| 238 void* stream = DartUtils::OpenFile(filename, false); |
| 239 if (stream == NULL) { |
| 199 const char* format = "Unable to open file: %s"; | 240 const char* format = "Unable to open file: %s"; |
| 200 intptr_t len = snprintf(NULL, 0, format, filename); | 241 intptr_t len = snprintf(NULL, 0, format, filename); |
| 201 // TODO(iposva): Allocate from the zone instead of leaking error string | 242 // TODO(iposva): Allocate from the zone instead of leaking error string |
| 202 // here. On the other hand the binary is about the exit anyway. | 243 // here. On the other hand the binary is about the exit anyway. |
| 203 char* msg = reinterpret_cast<char*>(malloc(len + 1)); | 244 char* msg = reinterpret_cast<char*>(malloc(len + 1)); |
| 204 snprintf(msg, len + 1, format, filename); | 245 snprintf(msg, len + 1, format, filename); |
| 205 *error_msg = msg; | 246 *error_msg = msg; |
| 206 return NULL; | 247 return NULL; |
| 207 } | 248 } |
| 208 *file_len = file->Length(); | 249 *file_len = -1; |
| 209 uint8_t* text_buffer = reinterpret_cast<uint8_t*>(malloc(*file_len)); | 250 const uint8_t* text_buffer = NULL; |
| 210 if (text_buffer == NULL) { | 251 DartUtils::ReadFile(&text_buffer, file_len, stream); |
| 211 delete file; | 252 if (text_buffer == NULL || *file_len == -1) { |
| 212 *error_msg = "Unable to allocate buffer"; | 253 *error_msg = "Unable to read file contents"; |
| 213 return NULL; | 254 text_buffer = NULL; |
| 214 } | 255 } |
| 215 if (!file->ReadFully(text_buffer, *file_len)) { | 256 DartUtils::CloseFile(stream); |
| 216 delete file; | |
| 217 free(text_buffer); | |
| 218 *error_msg = "Unable to fully read contents"; | |
| 219 return NULL; | |
| 220 } | |
| 221 delete file; | |
| 222 return text_buffer; | 257 return text_buffer; |
| 223 } | 258 } |
| 224 | 259 |
| 225 | 260 |
| 226 Dart_Handle DartUtils::ReadStringFromFile(const char* filename) { | 261 Dart_Handle DartUtils::ReadStringFromFile(const char* filename) { |
| 227 const char* error_msg = NULL; | 262 const char* error_msg = NULL; |
| 228 intptr_t len; | 263 intptr_t len; |
| 229 const uint8_t* text_buffer = ReadFile(filename, &len, &error_msg); | 264 const uint8_t* text_buffer = ReadFileFully(filename, &len, &error_msg); |
| 230 if (text_buffer == NULL) { | 265 if (text_buffer == NULL) { |
| 231 return Dart_Error(error_msg); | 266 return Dart_Error(error_msg); |
| 232 } | 267 } |
| 233 Dart_Handle str = Dart_NewStringFromUTF8(text_buffer, len); | 268 Dart_Handle str = Dart_NewStringFromUTF8(text_buffer, len); |
| 234 return str; | 269 return str; |
| 235 } | 270 } |
| 236 | 271 |
| 237 | 272 |
| 238 Dart_Handle DartUtils::ResolveScriptUri(Dart_Handle script_uri, | 273 Dart_Handle DartUtils::ResolveScriptUri(Dart_Handle script_uri, |
| 239 Dart_Handle builtin_lib) { | 274 Dart_Handle builtin_lib) { |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 377 } | 412 } |
| 378 Dart_Handle script_path = DartUtils::FilePathFromUri(resolved_script_uri, | 413 Dart_Handle script_path = DartUtils::FilePathFromUri(resolved_script_uri, |
| 379 builtin_lib); | 414 builtin_lib); |
| 380 if (Dart_IsError(script_path)) { | 415 if (Dart_IsError(script_path)) { |
| 381 return script_path; | 416 return script_path; |
| 382 } | 417 } |
| 383 const char* script_path_cstr; | 418 const char* script_path_cstr; |
| 384 Dart_StringToCString(script_path, &script_path_cstr); | 419 Dart_StringToCString(script_path, &script_path_cstr); |
| 385 const char* error_msg = NULL; | 420 const char* error_msg = NULL; |
| 386 intptr_t len; | 421 intptr_t len; |
| 387 const uint8_t* text_buffer = ReadFile(script_path_cstr, &len, &error_msg); | 422 const uint8_t* text_buffer = ReadFileFully(script_path_cstr, |
| 423 &len, |
| 424 &error_msg); |
| 388 if (text_buffer == NULL) { | 425 if (text_buffer == NULL) { |
| 389 return Dart_Error(error_msg); | 426 return Dart_Error(error_msg); |
| 390 } | 427 } |
| 391 bool is_snapshot = false; | 428 bool is_snapshot = false; |
| 392 text_buffer = SniffForMagicNumber(text_buffer, &len, &is_snapshot); | 429 text_buffer = SniffForMagicNumber(text_buffer, &len, &is_snapshot); |
| 393 if (is_snapshot) { | 430 if (is_snapshot) { |
| 394 return Dart_LoadScriptFromSnapshot(text_buffer, len); | 431 return Dart_LoadScriptFromSnapshot(text_buffer, len); |
| 395 } else { | 432 } else { |
| 396 Dart_Handle source = Dart_NewStringFromUTF8(text_buffer, len); | 433 Dart_Handle source = Dart_NewStringFromUTF8(text_buffer, len); |
| 397 if (Dart_IsError(source)) { | 434 if (Dart_IsError(source)) { |
| (...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 752 new CObjectString(CObject::NewString(os_error->message())); | 789 new CObjectString(CObject::NewString(os_error->message())); |
| 753 CObjectArray* result = new CObjectArray(CObject::NewArray(3)); | 790 CObjectArray* result = new CObjectArray(CObject::NewArray(3)); |
| 754 result->SetAt(0, new CObjectInt32(CObject::NewInt32(kOSError))); | 791 result->SetAt(0, new CObjectInt32(CObject::NewInt32(kOSError))); |
| 755 result->SetAt(1, new CObjectInt32(CObject::NewInt32(os_error->code()))); | 792 result->SetAt(1, new CObjectInt32(CObject::NewInt32(os_error->code()))); |
| 756 result->SetAt(2, error_message); | 793 result->SetAt(2, error_message); |
| 757 return result; | 794 return result; |
| 758 } | 795 } |
| 759 | 796 |
| 760 } // namespace bin | 797 } // namespace bin |
| 761 } // namespace dart | 798 } // namespace dart |
| OLD | NEW |