| Index: src/ast/ast-value-factory.h
|
| diff --git a/src/ast/ast-value-factory.h b/src/ast/ast-value-factory.h
|
| index 2e791416291b8fc534a7b42a8d9dd58ce3afe734..a85deb060af2d48a7cb63433c0dd635c444afe42 100644
|
| --- a/src/ast/ast-value-factory.h
|
| +++ b/src/ast/ast-value-factory.h
|
| @@ -106,6 +106,8 @@ class AstRawString final : public AstString {
|
| return *c;
|
| }
|
|
|
| + static bool Compare(void* a, void* b);
|
| +
|
| // For storing AstRawStrings in a hash map.
|
| uint32_t hash() const {
|
| return hash_;
|
| @@ -336,7 +338,9 @@ class AstValue : public ZoneObject {
|
| class AstStringConstants final {
|
| public:
|
| AstStringConstants(Isolate* isolate, uint32_t hash_seed)
|
| - : zone_(isolate->allocator(), ZONE_NAME), hash_seed_(hash_seed) {
|
| + : zone_(isolate->allocator(), ZONE_NAME),
|
| + string_table_(AstRawString::Compare),
|
| + hash_seed_(hash_seed) {
|
| DCHECK(ThreadId::Current().Equals(isolate->thread_id()));
|
| #define F(name, str) \
|
| { \
|
| @@ -349,20 +353,28 @@ class AstStringConstants final {
|
| /* The Handle returned by the factory is located on the roots */ \
|
| /* array, not on the temporary HandleScope, so this is safe. */ \
|
| name##_string_->set_string(isolate->factory()->name##_string()); \
|
| + base::HashMap::Entry* entry = \
|
| + string_table_.InsertNew(name##_string_, name##_string_->hash()); \
|
| + DCHECK(entry->value == nullptr); \
|
| + entry->value = reinterpret_cast<void*>(1); \
|
| }
|
| STRING_CONSTANTS(F)
|
| #undef F
|
| }
|
|
|
| #define F(name, str) \
|
| - AstRawString* name##_string() { return name##_string_; }
|
| + const AstRawString* name##_string() const { return name##_string_; }
|
| STRING_CONSTANTS(F)
|
| #undef F
|
|
|
| uint32_t hash_seed() const { return hash_seed_; }
|
| + const base::CustomMatcherHashMap* string_table() const {
|
| + return &string_table_;
|
| + }
|
|
|
| private:
|
| Zone zone_;
|
| + base::CustomMatcherHashMap string_table_;
|
| uint32_t hash_seed_;
|
|
|
| #define F(name, str) AstRawString* name##_string_;
|
| @@ -381,9 +393,9 @@ class AstStringConstants final {
|
|
|
| class AstValueFactory {
|
| public:
|
| - AstValueFactory(Zone* zone, AstStringConstants* string_constants,
|
| + AstValueFactory(Zone* zone, const AstStringConstants* string_constants,
|
| uint32_t hash_seed)
|
| - : string_table_(AstRawStringCompare),
|
| + : string_table_(string_constants->string_table()),
|
| values_(nullptr),
|
| strings_(nullptr),
|
| strings_end_(&strings_),
|
| @@ -398,7 +410,6 @@ class AstValueFactory {
|
| std::fill(one_character_strings_,
|
| one_character_strings_ + arraysize(one_character_strings_),
|
| nullptr);
|
| - InitializeStringConstants();
|
| }
|
|
|
| Zone* zone() const { return zone_; }
|
| @@ -462,19 +473,6 @@ class AstValueFactory {
|
| AstRawString* GetString(uint32_t hash, bool is_one_byte,
|
| Vector<const byte> literal_bytes);
|
|
|
| - void InitializeStringConstants() {
|
| -#define F(name, str) \
|
| - AstRawString* raw_string_##name = string_constants_->name##_string(); \
|
| - base::HashMap::Entry* entry_##name = string_table_.LookupOrInsert( \
|
| - raw_string_##name, raw_string_##name->hash()); \
|
| - DCHECK(entry_##name->value == nullptr); \
|
| - entry_##name->value = reinterpret_cast<void*>(1);
|
| - STRING_CONSTANTS(F)
|
| -#undef F
|
| - }
|
| -
|
| - static bool AstRawStringCompare(void* a, void* b);
|
| -
|
| // All strings are copied here, one after another (no NULLs inbetween).
|
| base::CustomMatcherHashMap string_table_;
|
| // For keeping track of all AstValues and AstRawStrings we've created (so that
|
| @@ -487,7 +485,7 @@ class AstValueFactory {
|
| AstString** strings_end_;
|
|
|
| // Holds constant string values which are shared across the isolate.
|
| - AstStringConstants* string_constants_;
|
| + const AstStringConstants* string_constants_;
|
|
|
| // Caches for faster access: small numbers, one character lowercase strings
|
| // (for minified code).
|
|
|