Index: src/ast/ast-value-factory.h |
diff --git a/src/ast/ast-value-factory.h b/src/ast/ast-value-factory.h |
index 21103a0e7a03834fec4d1d0fe37a017dc02766d1..818bcc7dc342dba15c87146c3481fbf589c750a8 100644 |
--- a/src/ast/ast-value-factory.h |
+++ b/src/ast/ast-value-factory.h |
@@ -43,9 +43,7 @@ namespace internal { |
class AstString : public ZoneObject { |
public: |
explicit AstString(bool is_raw) |
- : bit_field_(IsRawStringBits::encode(is_raw)) {} |
- |
- ~AstString() {} |
+ : next_(nullptr), bit_field_(IsRawStringBits::encode(is_raw)) {} |
int length() const; |
bool IsEmpty() const { return length() == 0; } |
@@ -59,9 +57,13 @@ class AstString : public ZoneObject { |
return string_; |
} |
+ AstString** next_location() { return &next_; } |
+ AstString* next() const { return next_; } |
+ |
protected: |
- // This is null until the string is internalized. |
+ // Handle<String>::null() until internalized. |
Handle<String> string_; |
+ AstString* next_; |
// Poor-man's virtual dispatch to AstRawString / AstConsString. Takes less |
// memory. |
class IsRawStringBits : public BitField<bool, 0, 1> {}; |
@@ -80,8 +82,7 @@ class AstRawString final : public AstString { |
void Internalize(Isolate* isolate); |
- bool AsArrayIndex(uint32_t* index, HandleDereferenceMode deref_mode = |
- HandleDereferenceMode::kAllowed) const; |
+ bool AsArrayIndex(uint32_t* index) const; |
// The string is not null-terminated, use length() to find out the length. |
const unsigned char* raw_data() const { |
@@ -181,8 +182,7 @@ class AstValue : public ZoneObject { |
return type_ == STRING && string_ == string; |
} |
- bool IsPropertyName( |
- HandleDereferenceMode deref_mode = HandleDereferenceMode::kAllowed) const; |
+ bool IsPropertyName() const; |
bool BooleanValue() const; |
@@ -203,6 +203,8 @@ class AstValue : public ZoneObject { |
DCHECK(!value_.is_null()); |
return value_; |
} |
+ AstValue* next() const { return next_; } |
+ void set_next(AstValue* next) { next_ = next; } |
private: |
friend class AstValueFactory; |
@@ -219,11 +221,15 @@ class AstValue : public ZoneObject { |
THE_HOLE |
}; |
- explicit AstValue(const AstRawString* s) : type_(STRING) { string_ = s; } |
+ explicit AstValue(const AstRawString* s) : type_(STRING), next_(nullptr) { |
+ string_ = s; |
+ } |
- explicit AstValue(const char* name) : type_(SYMBOL) { symbol_name_ = name; } |
+ explicit AstValue(const char* name) : type_(SYMBOL), next_(nullptr) { |
+ symbol_name_ = name; |
+ } |
- explicit AstValue(double n, bool with_dot) { |
+ explicit AstValue(double n, bool with_dot) : next_(nullptr) { |
if (with_dot) { |
type_ = NUMBER_WITH_DOT; |
number_ = n; |
@@ -239,14 +245,14 @@ class AstValue : public ZoneObject { |
} |
} |
- AstValue(Type t, int i) : type_(t) { |
+ AstValue(Type t, int i) : type_(t), next_(nullptr) { |
DCHECK(type_ == SMI); |
smi_ = i; |
} |
- explicit AstValue(bool b) : type_(BOOLEAN) { bool_ = b; } |
+ explicit AstValue(bool b) : type_(BOOLEAN), next_(nullptr) { bool_ = b; } |
- explicit AstValue(Type t) : type_(t) { |
+ explicit AstValue(Type t) : type_(t), next_(nullptr) { |
DCHECK(t == NULL_TYPE || t == UNDEFINED || t == THE_HOLE); |
} |
@@ -258,12 +264,13 @@ class AstValue : public ZoneObject { |
double number_; |
int smi_; |
bool bool_; |
- ZoneList<const AstRawString*>* strings_; |
+ const AstRawString* strings_; |
const char* symbol_name_; |
}; |
- // Internalized value (empty before internalized). |
+ // Handle<String>::null() until internalized. |
Handle<Object> value_; |
+ AstValue* next_; |
}; |
@@ -316,9 +323,12 @@ class AstValueFactory { |
public: |
AstValueFactory(Zone* zone, uint32_t hash_seed) |
: string_table_(AstRawStringCompare), |
+ values_(nullptr), |
+ strings_end_(&strings_), |
zone_(zone), |
isolate_(NULL), |
hash_seed_(hash_seed) { |
+ ResetStrings(); |
#define F(name, str) name##_string_ = NULL; |
STRING_CONSTANTS(F) |
#undef F |
@@ -373,6 +383,28 @@ class AstValueFactory { |
const AstValue* NewTheHole(); |
private: |
+ AstValue* AddValue(AstValue* value) { |
+ if (isolate_) { |
+ value->Internalize(isolate_); |
+ } else { |
+ value->set_next(values_); |
+ values_ = value; |
+ } |
+ return value; |
+ } |
+ AstString* AddString(AstString* string) { |
+ if (isolate_) { |
+ string->Internalize(isolate_); |
+ } else { |
+ *strings_end_ = string; |
+ strings_end_ = string->next_location(); |
+ } |
+ return string; |
+ } |
+ void ResetStrings() { |
+ strings_ = nullptr; |
+ strings_end_ = &strings_; |
+ } |
AstRawString* GetOneByteStringInternal(Vector<const uint8_t> literal); |
AstRawString* GetTwoByteStringInternal(Vector<const uint16_t> literal); |
AstRawString* GetString(uint32_t hash, bool is_one_byte, |
@@ -384,8 +416,11 @@ class AstValueFactory { |
base::HashMap string_table_; |
// For keeping track of all AstValues and AstRawStrings we've created (so that |
// they can be internalized later). |
- List<AstValue*> values_; |
- List<AstString*> strings_; |
+ AstValue* values_; |
+ // We need to keep track of strings_ in order, since cons strings require |
+ // their members to be internalized first. |
+ AstString* strings_; |
+ AstString** strings_end_; |
Zone* zone_; |
Isolate* isolate_; |