| Index: src/preparse-data.h | 
| diff --git a/src/preparse-data.h b/src/preparse-data.h | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..a96e50fa1061628b500b4d0ed2e47578c86ae090 | 
| --- /dev/null | 
| +++ b/src/preparse-data.h | 
| @@ -0,0 +1,223 @@ | 
| +// Copyright 2010 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. | 
| + | 
| +#ifndef V8_PREPARSER_DATA_H_ | 
| +#define V8_PREPARSER_DATA_H_ | 
| + | 
| +#include "hashmap.h" | 
| + | 
| +namespace v8 { | 
| +namespace internal { | 
| + | 
| +// Generic and general data used by preparse data recorders and readers. | 
| + | 
| +class PreparseDataConstants : public AllStatic { | 
| + public: | 
| +  // Layout and constants of the preparse data exchange format. | 
| +  static const unsigned kMagicNumber = 0xBadDead; | 
| +  static const unsigned kCurrentVersion = 5; | 
| + | 
| +  static const int kMagicOffset = 0; | 
| +  static const int kVersionOffset = 1; | 
| +  static const int kHasErrorOffset = 2; | 
| +  static const int kFunctionsSizeOffset = 3; | 
| +  static const int kSymbolCountOffset = 4; | 
| +  static const int kSizeOffset = 5; | 
| +  static const int kHeaderSize = 6; | 
| + | 
| +  // If encoding a message, the following positions are fixed. | 
| +  static const int kMessageStartPos = 0; | 
| +  static const int kMessageEndPos = 1; | 
| +  static const int kMessageArgCountPos = 2; | 
| +  static const int kMessageTextPos = 3; | 
| + | 
| +  static const byte kNumberTerminator = 0x80u; | 
| +}; | 
| + | 
| + | 
| +// ---------------------------------------------------------------------------- | 
| +// ParserRecorder - Logging of preparser data. | 
| + | 
| +// Abstract interface for preparse data recorder. | 
| +class ParserRecorder { | 
| + public: | 
| +  ParserRecorder() { } | 
| +  virtual ~ParserRecorder() { } | 
| + | 
| +  // Logs the scope and some details of a function literal in the source. | 
| +  virtual void LogFunction(int start, | 
| +                           int end, | 
| +                           int literals, | 
| +                           int properties) = 0; | 
| + | 
| +  // Logs a symbol creation of a literal or identifier. | 
| +  virtual void LogSymbol(int start, const char* symbol, int length) = 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) = 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; | 
| +}; | 
| + | 
| + | 
| +// ---------------------------------------------------------------------------- | 
| +// FunctionLoggingParserRecorder - Record only function entries | 
| + | 
| +class FunctionLoggingParserRecorder : public ParserRecorder { | 
| + public: | 
| +  FunctionLoggingParserRecorder(); | 
| +  virtual ~FunctionLoggingParserRecorder() {} | 
| + | 
| +  virtual void LogFunction(int start, int end, int literals, int properties) { | 
| +    function_store_.Add(start); | 
| +    function_store_.Add(end); | 
| +    function_store_.Add(literals); | 
| +    function_store_.Add(properties); | 
| +  } | 
| + | 
| +  // 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); | 
| + | 
| +  virtual int function_position() { return function_store_.size(); } | 
| + | 
| + | 
| +  virtual Vector<unsigned> ExtractData() = 0; | 
| + | 
| +  virtual void PauseRecording() { | 
| +    pause_count_++; | 
| +    is_recording_ = false; | 
| +  } | 
| + | 
| +  virtual void ResumeRecording() { | 
| +    ASSERT(pause_count_ > 0); | 
| +    if (--pause_count_ == 0) is_recording_ = !has_error(); | 
| +  } | 
| + | 
| + protected: | 
| +  bool has_error() { | 
| +    return static_cast<bool>(preamble_[PreparseDataConstants::kHasErrorOffset]); | 
| +  } | 
| + | 
| +  bool is_recording() { | 
| +    return is_recording_; | 
| +  } | 
| + | 
| +  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 | 
| +}; | 
| + | 
| + | 
| +// ---------------------------------------------------------------------------- | 
| +// PartialParserRecorder - Record only function entries | 
| + | 
| +class PartialParserRecorder : public FunctionLoggingParserRecorder { | 
| + public: | 
| +  PartialParserRecorder() : FunctionLoggingParserRecorder() { } | 
| +  virtual void LogSymbol(int start, const char* symbol, int length) { } | 
| +  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 LogSymbol(int start, const char* symbol, int length); | 
| + | 
| +  virtual Vector<unsigned> ExtractData(); | 
| + | 
| +  virtual int symbol_position() { return symbol_store_.size(); } | 
| +  virtual int symbol_ids() { return symbol_id_; } | 
| + | 
| + private: | 
| +  static int vector_hash(Vector<const char> string) { | 
| +    int hash = 0; | 
| +    for (int i = 0; i < string.length(); i++) { | 
| +      int c = string[i]; | 
| +      hash += c; | 
| +      hash += (hash << 10); | 
| +      hash ^= (hash >> 6); | 
| +    } | 
| +    return hash; | 
| +  } | 
| + | 
| +  static bool vector_compare(void* a, void* b) { | 
| +    Vector<const char>* string1 = reinterpret_cast<Vector<const char>* >(a); | 
| +    Vector<const char>* string2 = reinterpret_cast<Vector<const char>* >(b); | 
| +    int length = string1->length(); | 
| +    if (string2->length() != length) return false; | 
| +    return memcmp(string1->start(), string2->start(), length) == 0; | 
| +  } | 
| + | 
| +  // Write a non-negative number to the symbol store. | 
| +  void WriteNumber(int number); | 
| + | 
| +  Collector<byte> symbol_store_; | 
| +  Collector<Vector<const char> > symbol_entries_; | 
| +  HashMap symbol_table_; | 
| +  int symbol_id_; | 
| +}; | 
| + | 
| + | 
| +} }  // namespace v8::internal. | 
| + | 
| +#endif  // V8_PREPARSER_DATA_H_ | 
|  |