| Index: src/objects.h
|
| diff --git a/src/objects.h b/src/objects.h
|
| index 174f43d82ad9512554d85bfd7940a5599fd0e7f5..2b215d50763274273a0e13234119ab84b72345e7 100644
|
| --- a/src/objects.h
|
| +++ b/src/objects.h
|
| @@ -3042,7 +3042,7 @@ class SymbolTable: public HashTable<SymbolTableShape, HashTableKey*> {
|
| // true if it is found, assigning the symbol to the given output
|
| // parameter.
|
| bool LookupSymbolIfExists(String* str, String** symbol);
|
| - bool LookupTwoCharsSymbolIfExists(uint32_t c1, uint32_t c2, String** symbol);
|
| + bool LookupTwoCharsSymbolIfExists(uint16_t c1, uint16_t c2, String** symbol);
|
|
|
| // Casting.
|
| static inline SymbolTable* cast(Object* obj);
|
| @@ -6907,30 +6907,14 @@ class StringHasher {
|
| public:
|
| explicit inline StringHasher(int length, uint32_t seed);
|
|
|
| - // Returns true if the hash of this string can be computed without
|
| - // looking at the contents.
|
| - inline bool has_trivial_hash();
|
| -
|
| - // Add a character to the hash and update the array index calculation.
|
| - inline void AddCharacter(uint32_t c);
|
| -
|
| - // Adds a character to the hash but does not update the array index
|
| - // calculation. This can only be called when it has been verified
|
| - // that the input is not an array index.
|
| - inline void AddCharacterNoIndex(uint32_t c);
|
| -
|
| - // Add a character above 0xffff as a surrogate pair. These can get into
|
| - // the hasher through the routines that take a UTF-8 string and make a symbol.
|
| - void AddSurrogatePair(uc32 c);
|
| - void AddSurrogatePairNoIndex(uc32 c);
|
| + template <typename schar>
|
| + static inline uint32_t HashSequentialString(const schar* chars,
|
| + int length,
|
| + uint32_t seed);
|
|
|
| - // Returns the value to store in the hash field of a string with
|
| - // the given length and contents.
|
| - uint32_t GetHashField();
|
| -
|
| - // Returns true if the characters seen so far make up a legal array
|
| - // index.
|
| - bool is_array_index() { return is_array_index_; }
|
| + static uint32_t ComputeHashField(unibrow::CharacterStream* buffer,
|
| + int length,
|
| + uint32_t seed);
|
|
|
| // Calculated hash value for a string consisting of 1 to
|
| // String::kMaxArrayIndexSize digits with no leading zeros (except "0").
|
| @@ -6942,51 +6926,36 @@ class StringHasher {
|
| // use 27 instead.
|
| static const int kZeroHash = 27;
|
|
|
| - private:
|
| - uint32_t array_index() {
|
| - ASSERT(is_array_index());
|
| - return array_index_;
|
| - }
|
| -
|
| - inline uint32_t GetHash();
|
| -
|
| // Reusable parts of the hashing algorithm.
|
| - INLINE(static uint32_t AddCharacterCore(uint32_t running_hash, uint32_t c));
|
| + INLINE(static uint32_t AddCharacterCore(uint32_t running_hash, uint16_t c));
|
| INLINE(static uint32_t GetHashCore(uint32_t running_hash));
|
|
|
| - int length_;
|
| - uint32_t raw_running_hash_;
|
| - uint32_t array_index_;
|
| - bool is_array_index_;
|
| - bool is_first_char_;
|
| - friend class TwoCharHashTableKey;
|
| -
|
| - template <bool seq_ascii> friend class JsonParser;
|
| -};
|
| -
|
| -
|
| -class IncrementalAsciiStringHasher {
|
| - public:
|
| - explicit inline IncrementalAsciiStringHasher(uint32_t seed, char first_char);
|
| - inline void AddCharacter(uc32 c);
|
| - inline uint32_t GetHash();
|
| + protected:
|
| + // Returns the value to store in the hash field of a string with
|
| + // the given length and contents.
|
| + uint32_t GetHashField();
|
| + // Returns true if the hash of this string can be computed without
|
| + // looking at the contents.
|
| + inline bool has_trivial_hash();
|
| + // Adds a block of characters to the hash.
|
| + template<typename Char>
|
| + inline void AddCharacters(const Char* chars, int len);
|
|
|
| private:
|
| + // Add a character to the hash.
|
| + inline void AddCharacter(uint16_t c);
|
| + // Update index. Returns true if string is still an index.
|
| + inline bool UpdateIndex(uint16_t c);
|
| +
|
| int length_;
|
| uint32_t raw_running_hash_;
|
| uint32_t array_index_;
|
| bool is_array_index_;
|
| - char first_char_;
|
| + bool is_first_char_;
|
| + DISALLOW_COPY_AND_ASSIGN(StringHasher);
|
| };
|
|
|
|
|
| -// Calculates string hash.
|
| -template <typename schar>
|
| -inline uint32_t HashSequentialString(const schar* chars,
|
| - int length,
|
| - uint32_t seed);
|
| -
|
| -
|
| // The characteristics of a string are stored in its map. Retrieving these
|
| // few bits of information is moderately expensive, involving two memory
|
| // loads where the second is dependent on the first. To improve efficiency
|
| @@ -7205,10 +7174,6 @@ class String: public HeapObject {
|
| // Returns a hash value used for the property table
|
| inline uint32_t Hash();
|
|
|
| - static uint32_t ComputeHashField(unibrow::CharacterStream* buffer,
|
| - int length,
|
| - uint32_t seed);
|
| -
|
| static bool ComputeArrayIndex(unibrow::CharacterStream* buffer,
|
| uint32_t* index,
|
| int length);
|
| @@ -7848,22 +7813,26 @@ class StringInputBuffer: public unibrow::InputBuffer<String, String*, 1024> {
|
| };
|
|
|
|
|
| +// A ConsStringOp that returns null.
|
| +// Useful when the operation to apply on a ConsString
|
| +// requires an expensive data structure.
|
| +struct ConsStringNullOp {
|
| + static inline String* Operate(String*, unsigned*, int32_t*, unsigned*);
|
| +};
|
| +
|
| +
|
| // This maintains an off-stack representation of the stack frames required
|
| // to traverse a ConsString, allowing an entirely iterative and restartable
|
| // traversal of the entire string
|
| // Note: this class is not GC-safe.
|
| class ConsStringIteratorOp {
|
| public:
|
| - struct ContinueResponse {
|
| - String* string_;
|
| - unsigned offset_;
|
| - unsigned length_;
|
| - int32_t type_;
|
| - };
|
| inline ConsStringIteratorOp() {}
|
| - String* Operate(ConsString* cons_string, unsigned* offset_out,
|
| - int32_t* type_out, unsigned* length_out);
|
| - inline bool ContinueOperation(ContinueResponse* response);
|
| + String* Operate(String* string,
|
| + unsigned* offset_out,
|
| + int32_t* type_out,
|
| + unsigned* length_out);
|
| + inline String* ContinueOperation(int32_t* type_out, unsigned* length_out);
|
| inline void Reset();
|
| inline bool HasMore();
|
|
|
| @@ -7880,6 +7849,9 @@ class ConsStringIteratorOp {
|
| inline void AdjustMaximumDepth();
|
| inline void Pop();
|
| String* NextLeaf(bool* blew_stack, int32_t* type_out, unsigned* length_out);
|
| + String* Search(unsigned* offset_out,
|
| + int32_t* type_out,
|
| + unsigned* length_out);
|
|
|
| unsigned depth_;
|
| unsigned maximum_depth_;
|
| @@ -7888,8 +7860,6 @@ class ConsStringIteratorOp {
|
| ConsString* frames_[kStackSize];
|
| unsigned consumed_;
|
| ConsString* root_;
|
| - int32_t root_type_;
|
| - unsigned root_length_;
|
| DISALLOW_COPY_AND_ASSIGN(ConsStringIteratorOp);
|
| };
|
|
|
| @@ -7897,8 +7867,9 @@ class ConsStringIteratorOp {
|
| // Note: this class is not GC-safe.
|
| class StringCharacterStream {
|
| public:
|
| - inline StringCharacterStream(
|
| - String* string, unsigned offset, ConsStringIteratorOp* op);
|
| + inline StringCharacterStream(String* string,
|
| + unsigned offset,
|
| + ConsStringIteratorOp* op);
|
| inline uint16_t GetNext();
|
| inline bool HasMore();
|
| inline void Reset(String* string, unsigned offset, ConsStringIteratorOp* op);
|
|
|