Index: src/utils.cc |
=================================================================== |
--- src/utils.cc (revision 6353) |
+++ src/utils.cc (working copy) |
@@ -276,4 +276,96 @@ |
} |
+MemoryMappedExternalResource::MemoryMappedExternalResource(const char* filename) |
+ : filename_(NULL), |
+ data_(NULL), |
+ length_(0), |
+ remove_file_on_cleanup_(false) { |
+ Init(filename); |
+} |
+ |
+ |
+MemoryMappedExternalResource:: |
+ MemoryMappedExternalResource(const char* filename, |
+ bool remove_file_on_cleanup) |
+ : filename_(NULL), |
+ data_(NULL), |
+ length_(0), |
+ remove_file_on_cleanup_(remove_file_on_cleanup) { |
+ Init(filename); |
+} |
+ |
+ |
+MemoryMappedExternalResource::~MemoryMappedExternalResource() { |
+ // Release the resources if we had successfully acquired them: |
+ if (file_ != NULL) { |
+ delete file_; |
+ if (remove_file_on_cleanup_) { |
+ OS::Remove(filename_); |
+ } |
+ DeleteArray<char>(filename_); |
+ } |
+} |
+ |
+ |
+void MemoryMappedExternalResource::Init(const char* filename) { |
+ file_ = OS::MemoryMappedFile::open(filename); |
+ if (file_ != NULL) { |
+ filename_ = StrDup(filename); |
+ data_ = reinterpret_cast<char*>(file_->memory()); |
+ length_ = file_->size(); |
+ } |
+} |
+ |
+ |
+bool MemoryMappedExternalResource::EnsureIsAscii(bool abort_if_failed) const { |
+ bool is_ascii = true; |
+ |
+ int line_no = 1; |
+ const char* start_of_line = data_; |
+ const char* end = data_ + length_; |
+ for (const char* p = data_; p < end; p++) { |
+ char c = *p; |
+ if ((c & 0x80) != 0) { |
+ // Non-ascii detected: |
+ is_ascii = false; |
+ |
+ // Report the error and abort if appropriate: |
+ if (abort_if_failed) { |
+ int char_no = (p - start_of_line) - 1; |
+ |
+ ASSERT(filename_ != NULL); |
+ PrintF("\n\n\n" |
+ "Abort: Non-Ascii character 0x%.2x in file %s line %d char %d", |
+ c, filename_, line_no, char_no); |
+ |
+ // Allow for some context up to kNumberOfLeadingContextChars chars |
+ // before the offending non-ascii char to help the user see where |
+ // the offending char is. |
+ const int kNumberOfLeadingContextChars = 10; |
+ const char* err_context = p - kNumberOfLeadingContextChars; |
+ if (err_context < data_) { |
+ err_context = data_; |
+ } |
+ // Compute the length of the error context and print it. |
+ int err_context_length = p - err_context; |
+ if (err_context_length != 0) { |
+ PrintF(" after \"%.*s\"", err_context_length, err_context); |
+ } |
+ PrintF(".\n\n\n"); |
+ OS::Abort(); |
+ } |
+ |
+ break; // Non-ascii detected. No need to continue scanning. |
+ } |
+ if (c == '\n') { |
+ start_of_line = p; |
+ line_no++; |
+ } |
+ } |
+ |
+ return is_ascii; |
+} |
+ |
+ |
} } // namespace v8::internal |