| Index: src/preparse-data.h
|
| diff --git a/src/preparse-data.h b/src/preparse-data.h
|
| index a96e50fa1061628b500b4d0ed2e47578c86ae090..cc82bcc62c0cf3cbce4016a621ca4a2f1e2cbfcc 100644
|
| --- a/src/preparse-data.h
|
| +++ b/src/preparse-data.h
|
| @@ -75,7 +75,8 @@ class ParserRecorder {
|
| int properties) = 0;
|
|
|
| // Logs a symbol creation of a literal or identifier.
|
| - virtual void LogSymbol(int start, const char* symbol, int length) = 0;
|
| + virtual void LogAsciiSymbol(int start, Vector<const char> literal) { }
|
| + virtual void LogUC16Symbol(int start, Vector<const uc16> literal) { }
|
|
|
| // Logs an error message and marks the log as containing an error.
|
| // Further logging will be ignored, and ExtractData will return a vector
|
| @@ -165,7 +166,8 @@ class FunctionLoggingParserRecorder : public ParserRecorder {
|
| class PartialParserRecorder : public FunctionLoggingParserRecorder {
|
| public:
|
| PartialParserRecorder() : FunctionLoggingParserRecorder() { }
|
| - virtual void LogSymbol(int start, const char* symbol, int length) { }
|
| + virtual void LogAsciiSymbol(int start, Vector<const char> literal) { }
|
| + virtual void LogUC16Symbol(int start, Vector<const uc16> literal) { }
|
| virtual ~PartialParserRecorder() { }
|
| virtual Vector<unsigned> ExtractData();
|
| virtual int symbol_position() { return 0; }
|
| @@ -181,7 +183,17 @@ class CompleteParserRecorder: public FunctionLoggingParserRecorder {
|
| CompleteParserRecorder();
|
| virtual ~CompleteParserRecorder() { }
|
|
|
| - virtual void LogSymbol(int start, const char* symbol, int length);
|
| + 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 LogUC16Symbol(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 Vector<unsigned> ExtractData();
|
|
|
| @@ -189,10 +201,21 @@ class CompleteParserRecorder: public FunctionLoggingParserRecorder {
|
| virtual int symbol_ids() { return symbol_id_; }
|
|
|
| private:
|
| - static int vector_hash(Vector<const char> string) {
|
| + 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 = string[i];
|
| + int c = static_cast<int>(string[i]);
|
| hash += c;
|
| hash += (hash << 10);
|
| hash ^= (hash >> 6);
|
| @@ -201,18 +224,21 @@ class CompleteParserRecorder: public FunctionLoggingParserRecorder {
|
| }
|
|
|
| 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;
|
| + 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_;
|
| - Collector<Vector<const char> > symbol_entries_;
|
| + Collector<Key> symbol_keys_;
|
| HashMap symbol_table_;
|
| int symbol_id_;
|
| };
|
|
|