| 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_;
 | 
|  };
 | 
| 
 |