| Index: src/preparse-data.h
|
| diff --git a/src/preparse-data.h b/src/preparse-data.h
|
| index 07b9d4ca3236323a3003ad50a70417d7be83e8e4..6a968e3b2241ea7331ff0f3ee6584f10f042d6ff 100644
|
| --- a/src/preparse-data.h
|
| +++ b/src/preparse-data.h
|
| @@ -35,13 +35,11 @@
|
| namespace v8 {
|
| namespace internal {
|
|
|
| -// ----------------------------------------------------------------------------
|
| -// ParserRecorder - Logging of preparser data.
|
|
|
| // Abstract interface for preparse data recorder.
|
| class ParserRecorder {
|
| public:
|
| - ParserRecorder() { }
|
| + ParserRecorder() : should_log_symbols_(false) { }
|
| virtual ~ParserRecorder() { }
|
|
|
| // Logs the scope and some details of a function literal in the source.
|
| @@ -51,10 +49,6 @@ class ParserRecorder {
|
| int properties,
|
| StrictMode strict_mode) = 0;
|
|
|
| - // Logs a symbol creation of a literal or identifier.
|
| - virtual void LogOneByteSymbol(int start, Vector<const uint8_t> literal) = 0;
|
| - virtual void LogTwoByteSymbol(int start, Vector<const uint16_t> literal) = 0;
|
| -
|
| // Logs an error message and marks the log as containing an error.
|
| // Further logging will be ignored, and ExtractData will return a vector
|
| // representing the error only.
|
| @@ -63,27 +57,110 @@ class ParserRecorder {
|
| const char* message,
|
| const char* argument_opt) = 0;
|
|
|
| - virtual int function_position() = 0;
|
| + // Logs a symbol creation of a literal or identifier.
|
| + bool ShouldLogSymbols() { return should_log_symbols_; }
|
| + // The following functions are only callable on CompleteParserRecorder
|
| + // and are guarded by calls to ShouldLogSymbols.
|
| + virtual void LogOneByteSymbol(int start, Vector<const uint8_t> literal) {
|
| + UNREACHABLE();
|
| + }
|
| + virtual void LogTwoByteSymbol(int start, Vector<const uint16_t> literal) {
|
| + UNREACHABLE();
|
| + }
|
| + virtual void PauseRecording() { UNREACHABLE(); }
|
| + virtual void ResumeRecording() { UNREACHABLE(); }
|
| +
|
| + protected:
|
| + bool should_log_symbols_;
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(ParserRecorder);
|
| +};
|
|
|
| - virtual int symbol_position() = 0;
|
|
|
| - virtual int symbol_ids() = 0;
|
| +class SingletonLogger : public ParserRecorder {
|
| + public:
|
| + SingletonLogger() : has_error_(false), start_(-1), end_(-1) { }
|
| + virtual ~SingletonLogger() { }
|
|
|
| - virtual Vector<unsigned> ExtractData() = 0;
|
| + void Reset() { has_error_ = false; }
|
|
|
| - virtual void PauseRecording() = 0;
|
| + virtual void LogFunction(int start,
|
| + int end,
|
| + int literals,
|
| + int properties,
|
| + StrictMode strict_mode) {
|
| + ASSERT(!has_error_);
|
| + start_ = start;
|
| + end_ = end;
|
| + literals_ = literals;
|
| + properties_ = properties;
|
| + strict_mode_ = strict_mode;
|
| + };
|
|
|
| - virtual void ResumeRecording() = 0;
|
| -};
|
| + // Logs an error message and marks the log as containing an error.
|
| + // Further logging will be ignored, and ExtractData will return a vector
|
| + // representing the error only.
|
| + virtual void LogMessage(int start,
|
| + int end,
|
| + const char* message,
|
| + const char* argument_opt) {
|
| + if (has_error_) return;
|
| + has_error_ = true;
|
| + start_ = start;
|
| + end_ = end;
|
| + message_ = message;
|
| + argument_opt_ = argument_opt;
|
| + }
|
| +
|
| + bool has_error() { return has_error_; }
|
| +
|
| + int start() { return start_; }
|
| + int end() { return end_; }
|
| + int literals() {
|
| + ASSERT(!has_error_);
|
| + return literals_;
|
| + }
|
| + int properties() {
|
| + ASSERT(!has_error_);
|
| + return properties_;
|
| + }
|
| + StrictMode strict_mode() {
|
| + ASSERT(!has_error_);
|
| + return strict_mode_;
|
| + }
|
| + const char* message() {
|
| + ASSERT(has_error_);
|
| + return message_;
|
| + }
|
| + const char* argument_opt() {
|
| + ASSERT(has_error_);
|
| + return argument_opt_;
|
| + }
|
|
|
| + private:
|
| + bool has_error_;
|
| + int start_;
|
| + int end_;
|
| + // For function entries.
|
| + int literals_;
|
| + int properties_;
|
| + StrictMode strict_mode_;
|
| + // For error messages.
|
| + const char* message_;
|
| + const char* argument_opt_;
|
| +};
|
|
|
| -// ----------------------------------------------------------------------------
|
| -// FunctionLoggingParserRecorder - Record only function entries
|
|
|
| -class FunctionLoggingParserRecorder : public ParserRecorder {
|
| +class CompleteParserRecorder : public ParserRecorder {
|
| public:
|
| - FunctionLoggingParserRecorder();
|
| - virtual ~FunctionLoggingParserRecorder() {}
|
| + struct Key {
|
| + bool is_one_byte;
|
| + Vector<const byte> literal_bytes;
|
| + };
|
| +
|
| + CompleteParserRecorder();
|
| + virtual ~CompleteParserRecorder() {}
|
|
|
| virtual void LogFunction(int start,
|
| int end,
|
| @@ -105,122 +182,44 @@ class FunctionLoggingParserRecorder : public ParserRecorder {
|
| const char* message,
|
| const char* argument_opt);
|
|
|
| - virtual int function_position() { return function_store_.size(); }
|
| -
|
| -
|
| - virtual Vector<unsigned> ExtractData() = 0;
|
| -
|
| virtual void PauseRecording() {
|
| - pause_count_++;
|
| - is_recording_ = false;
|
| + ASSERT(should_log_symbols_);
|
| + should_log_symbols_ = false;
|
| }
|
|
|
| virtual void ResumeRecording() {
|
| - ASSERT(pause_count_ > 0);
|
| - if (--pause_count_ == 0) is_recording_ = !has_error();
|
| + ASSERT(!should_log_symbols_);
|
| + should_log_symbols_ = !has_error();
|
| }
|
|
|
| - protected:
|
| + virtual void LogOneByteSymbol(int start, Vector<const uint8_t> literal);
|
| + virtual void LogTwoByteSymbol(int start, Vector<const uint16_t> literal);
|
| + Vector<unsigned> ExtractData();
|
| +
|
| + private:
|
| bool has_error() {
|
| return static_cast<bool>(preamble_[PreparseDataConstants::kHasErrorOffset]);
|
| }
|
|
|
| - bool is_recording() {
|
| - return is_recording_;
|
| - }
|
| -
|
| void WriteString(Vector<const char> str);
|
|
|
| + // For testing. Defined in test-parsing.cc.
|
| + friend struct CompleteParserRecorderFriend;
|
| +
|
| + void LogSymbol(int start,
|
| + int hash,
|
| + bool is_one_byte,
|
| + Vector<const byte> literal);
|
| +
|
| + // Write a non-negative number to the symbol store.
|
| + void WriteNumber(int number);
|
| +
|
| Collector<unsigned> function_store_;
|
| unsigned preamble_[PreparseDataConstants::kHeaderSize];
|
| - bool is_recording_;
|
| - int pause_count_;
|
|
|
| #ifdef DEBUG
|
| int prev_start_;
|
| #endif
|
| -};
|
| -
|
| -
|
| -// ----------------------------------------------------------------------------
|
| -// PartialParserRecorder - Record only function entries
|
| -
|
| -class PartialParserRecorder : public FunctionLoggingParserRecorder {
|
| - public:
|
| - PartialParserRecorder() : FunctionLoggingParserRecorder() { }
|
| - virtual void LogOneByteSymbol(int start, Vector<const uint8_t> literal) { }
|
| - virtual void LogTwoByteSymbol(int start, Vector<const uint16_t> literal) { }
|
| - virtual ~PartialParserRecorder() { }
|
| - virtual Vector<unsigned> ExtractData();
|
| - virtual int symbol_position() { return 0; }
|
| - virtual int symbol_ids() { return 0; }
|
| -};
|
| -
|
| -
|
| -// ----------------------------------------------------------------------------
|
| -// CompleteParserRecorder - Record both function entries and symbols.
|
| -
|
| -class CompleteParserRecorder: public FunctionLoggingParserRecorder {
|
| - public:
|
| - CompleteParserRecorder();
|
| - virtual ~CompleteParserRecorder() { }
|
| -
|
| - virtual void LogOneByteSymbol(int start, Vector<const uint8_t> literal) {
|
| - if (!is_recording_) return;
|
| - int hash = vector_hash(literal);
|
| - LogSymbol(start, hash, true, literal);
|
| - }
|
| -
|
| - virtual void LogTwoByteSymbol(int start, Vector<const uint16_t> literal) {
|
| - if (!is_recording_) return;
|
| - int hash = vector_hash(literal);
|
| - LogSymbol(start, hash, false, Vector<const byte>::cast(literal));
|
| - }
|
| -
|
| - virtual Vector<unsigned> ExtractData();
|
| -
|
| - virtual int symbol_position() { return symbol_store_.size(); }
|
| - virtual int symbol_ids() { return symbol_id_; }
|
| -
|
| - private:
|
| - // For testing. Defined in test-parsing.cc.
|
| - friend void FakeWritingSymbolIdInPreParseData(CompleteParserRecorder* log,
|
| - int number);
|
| -
|
| - struct Key {
|
| - bool is_ascii;
|
| - Vector<const byte> literal_bytes;
|
| - };
|
| -
|
| - virtual void LogSymbol(int start,
|
| - int hash,
|
| - bool is_ascii,
|
| - Vector<const byte> literal);
|
| -
|
| - template <typename Char>
|
| - static int vector_hash(Vector<const Char> string) {
|
| - int hash = 0;
|
| - for (int i = 0; i < string.length(); i++) {
|
| - int c = static_cast<int>(string[i]);
|
| - hash += c;
|
| - hash += (hash << 10);
|
| - hash ^= (hash >> 6);
|
| - }
|
| - return hash;
|
| - }
|
| -
|
| - static bool vector_compare(void* a, void* b) {
|
| - Key* string1 = reinterpret_cast<Key*>(a);
|
| - Key* string2 = reinterpret_cast<Key*>(b);
|
| - if (string1->is_ascii != string2->is_ascii) return false;
|
| - int length = string1->literal_bytes.length();
|
| - if (string2->literal_bytes.length() != length) return false;
|
| - return memcmp(string1->literal_bytes.start(),
|
| - string2->literal_bytes.start(), length) == 0;
|
| - }
|
| -
|
| - // Write a non-negative number to the symbol store.
|
| - void WriteNumber(int number);
|
|
|
| Collector<byte> literal_chars_;
|
| Collector<byte> symbol_store_;
|
|
|