| 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
|
|
|