diff options
Diffstat (limited to 'chromium/v8/src/preparse-data.h')
-rw-r--r-- | chromium/v8/src/preparse-data.h | 255 |
1 files changed, 99 insertions, 156 deletions
diff --git a/chromium/v8/src/preparse-data.h b/chromium/v8/src/preparse-data.h index 3a1e99d5d18..8978098767c 100644 --- a/chromium/v8/src/preparse-data.h +++ b/chromium/v8/src/preparse-data.h @@ -1,42 +1,17 @@ // Copyright 2011 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. #ifndef V8_PREPARSE_DATA_H_ #define V8_PREPARSE_DATA_H_ -#include "allocation.h" -#include "hashmap.h" -#include "utils-inl.h" +#include "src/allocation.h" +#include "src/hashmap.h" +#include "src/utils-inl.h" namespace v8 { namespace internal { -// ---------------------------------------------------------------------------- -// ParserRecorder - Logging of preparser data. // Abstract interface for preparse data recorder. class ParserRecorder { @@ -49,11 +24,7 @@ class ParserRecorder { int end, int literals, int properties, - LanguageMode language_mode) = 0; - - // Logs a symbol creation of a literal or identifier. - virtual void LogAsciiSymbol(int start, Vector<const char> literal) { } - virtual void LogUtf16Symbol(int start, Vector<const uc16> literal) { } + StrictMode strict_mode) = 0; // Logs an error message and marks the log as containing an error. // Further logging will be ignored, and ExtractData will return a vector @@ -61,40 +32,32 @@ class ParserRecorder { virtual void LogMessage(int start, int end, const char* message, - const char* argument_opt) = 0; - - virtual int function_position() = 0; - - virtual int symbol_position() = 0; - - virtual int symbol_ids() = 0; - - virtual Vector<unsigned> ExtractData() = 0; - - virtual void PauseRecording() = 0; - - virtual void ResumeRecording() = 0; + const char* argument_opt, + bool is_reference_error) = 0; + private: + DISALLOW_COPY_AND_ASSIGN(ParserRecorder); }; -// ---------------------------------------------------------------------------- -// FunctionLoggingParserRecorder - Record only function entries - -class FunctionLoggingParserRecorder : public ParserRecorder { +class SingletonLogger : public ParserRecorder { public: - FunctionLoggingParserRecorder(); - virtual ~FunctionLoggingParserRecorder() {} + SingletonLogger() + : has_error_(false), start_(-1), end_(-1), is_reference_error_(false) {} + virtual ~SingletonLogger() {} + + void Reset() { has_error_ = false; } virtual void LogFunction(int start, int end, int literals, int properties, - LanguageMode language_mode) { - function_store_.Add(start); - function_store_.Add(end); - function_store_.Add(literals); - function_store_.Add(properties); - function_store_.Add(language_mode); + StrictMode strict_mode) { + ASSERT(!has_error_); + start_ = start; + end_ = end; + literals_ = literals; + properties_ = properties; + strict_mode_ = strict_mode; } // Logs an error message and marks the log as containing an error. @@ -103,126 +66,106 @@ class FunctionLoggingParserRecorder : public ParserRecorder { virtual void LogMessage(int start, int end, const char* message, - const char* argument_opt); - - virtual int function_position() { return function_store_.size(); } - + const char* argument_opt, + bool is_reference_error) { + if (has_error_) return; + has_error_ = true; + start_ = start; + end_ = end; + message_ = message; + argument_opt_ = argument_opt; + is_reference_error_ = is_reference_error; + } - virtual Vector<unsigned> ExtractData() = 0; + bool has_error() const { return has_error_; } - virtual void PauseRecording() { - pause_count_++; - is_recording_ = false; + int start() const { return start_; } + int end() const { return end_; } + int literals() const { + ASSERT(!has_error_); + return literals_; } - - virtual void ResumeRecording() { - ASSERT(pause_count_ > 0); - if (--pause_count_ == 0) is_recording_ = !has_error(); + int properties() const { + ASSERT(!has_error_); + return properties_; } - - protected: - bool has_error() { - return static_cast<bool>(preamble_[PreparseDataConstants::kHasErrorOffset]); + StrictMode strict_mode() const { + ASSERT(!has_error_); + return strict_mode_; } - - bool is_recording() { - return is_recording_; + int is_reference_error() const { return is_reference_error_; } + const char* message() { + ASSERT(has_error_); + return message_; + } + const char* argument_opt() const { + ASSERT(has_error_); + return argument_opt_; } - void WriteString(Vector<const char> str); - - Collector<unsigned> function_store_; - unsigned preamble_[PreparseDataConstants::kHeaderSize]; - bool is_recording_; - int pause_count_; - -#ifdef DEBUG - int prev_start_; -#endif + 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_; + bool is_reference_error_; }; -// ---------------------------------------------------------------------------- -// PartialParserRecorder - Record only function entries - -class PartialParserRecorder : public FunctionLoggingParserRecorder { +class CompleteParserRecorder : public ParserRecorder { public: - PartialParserRecorder() : FunctionLoggingParserRecorder() { } - virtual void LogAsciiSymbol(int start, Vector<const char> literal) { } - virtual void LogUtf16Symbol(int start, Vector<const uc16> 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. + struct Key { + bool is_one_byte; + Vector<const byte> literal_bytes; + }; -class CompleteParserRecorder: public FunctionLoggingParserRecorder { - public: CompleteParserRecorder(); - virtual ~CompleteParserRecorder() { } + virtual ~CompleteParserRecorder() {} - virtual void LogAsciiSymbol(int start, Vector<const char> literal) { - if (!is_recording_) return; - int hash = vector_hash(literal); - LogSymbol(start, hash, true, Vector<const byte>::cast(literal)); - } - - virtual void LogUtf16Symbol(int start, Vector<const uc16> literal) { - if (!is_recording_) return; - int hash = vector_hash(literal); - LogSymbol(start, hash, false, Vector<const byte>::cast(literal)); + virtual void LogFunction(int start, + int end, + int literals, + int properties, + StrictMode strict_mode) { + function_store_.Add(start); + function_store_.Add(end); + function_store_.Add(literals); + function_store_.Add(properties); + function_store_.Add(strict_mode); } - virtual Vector<unsigned> ExtractData(); - - virtual int symbol_position() { return symbol_store_.size(); } - virtual int symbol_ids() { return symbol_id_; } + // 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, + bool is_reference_error_); + Vector<unsigned> ExtractData(); private: - 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; + bool has_error() { + return static_cast<bool>(preamble_[PreparseDataConstants::kHasErrorOffset]); } - 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; - } + void WriteString(Vector<const char> str); // Write a non-negative number to the symbol store. void WriteNumber(int number); - Collector<byte> literal_chars_; - Collector<byte> symbol_store_; - Collector<Key> symbol_keys_; - HashMap string_table_; - int symbol_id_; + Collector<unsigned> function_store_; + unsigned preamble_[PreparseDataConstants::kHeaderSize]; + +#ifdef DEBUG + int prev_start_; +#endif }; |