| Index: src/ast/ast-value-factory.h
|
| diff --git a/src/ast/ast-value-factory.h b/src/ast/ast-value-factory.h
|
| index bdb1f5e7c0ac291f731f2bafa8939ca2a6b3751e..51c0df7a807416ad69e3361c338eef356e75a105 100644
|
| --- a/src/ast/ast-value-factory.h
|
| +++ b/src/ast/ast-value-factory.h
|
| @@ -44,7 +44,7 @@ namespace internal {
|
| class AstString : public ZoneObject {
|
| public:
|
| explicit AstString(bool is_raw)
|
| - : bit_field_(IsRawStringBits::encode(is_raw)) {}
|
| + : next_(nullptr), bit_field_(IsRawStringBits::encode(is_raw)) {}
|
|
|
| int length() const;
|
| bool IsEmpty() const { return length() == 0; }
|
| @@ -54,13 +54,21 @@ class AstString : public ZoneObject {
|
|
|
| // This function can be called after internalizing.
|
| V8_INLINE Handle<String> string() const {
|
| - DCHECK(!string_.is_null());
|
| - return string_;
|
| + DCHECK_NOT_NULL(string_);
|
| + return Handle<String>(string_);
|
| }
|
|
|
| + AstString* next() { return next_; }
|
| + AstString** next_location() { return &next_; }
|
| +
|
| protected:
|
| - // Handle<String>::null() until internalized.
|
| - Handle<String> string_;
|
| + void set_string(Handle<String> string) { string_ = string.location(); }
|
| + // {string_} is stored as String** instead of a Handle<String> so it can be
|
| + // stored in a union with {next_}.
|
| + union {
|
| + AstString* next_;
|
| + String** string_;
|
| + };
|
| // Poor-man's virtual dispatch to AstRawString / AstConsString. Takes less
|
| // memory.
|
| class IsRawStringBits : public BitField<bool, 0, 1> {};
|
| @@ -129,21 +137,16 @@ class AstConsString final : public AstString {
|
| : AstString(false),
|
| length_(left->length() + right->length()),
|
| left_(left),
|
| - right_(right),
|
| - next_(nullptr) {}
|
| + right_(right) {}
|
|
|
| int length() const { return length_; }
|
|
|
| void Internalize(Isolate* isolate);
|
|
|
| - AstConsString* next() { return next_; }
|
| - AstConsString** next_location() { return &next_; }
|
| -
|
| private:
|
| const int length_;
|
| const AstString* left_;
|
| const AstString* right_;
|
| - AstConsString* next_;
|
| };
|
|
|
|
|
| @@ -205,13 +208,14 @@ class AstValue : public ZoneObject {
|
| if (type_ == STRING) {
|
| return string_->string();
|
| }
|
| - DCHECK(!value_.is_null());
|
| - return value_;
|
| + DCHECK_NOT_NULL(value_);
|
| + return Handle<Object>(value_);
|
| }
|
| AstValue* next() const { return next_; }
|
| void set_next(AstValue* next) { next_ = next; }
|
|
|
| private:
|
| + void set_value(Handle<Object> object) { value_ = object.location(); }
|
| friend class AstValueFactory;
|
|
|
| enum Type {
|
| @@ -259,6 +263,13 @@ class AstValue : public ZoneObject {
|
|
|
| Type type_;
|
|
|
| + // {value_} is stored as Object** instead of a Handle<Object> so it can be
|
| + // stored in a union with {next_}.
|
| + union {
|
| + Object** value_; // if internalized
|
| + AstValue* next_; // if !internalized
|
| + };
|
| +
|
| // Uninternalized value.
|
| union {
|
| const AstRawString* string_;
|
| @@ -267,10 +278,6 @@ class AstValue : public ZoneObject {
|
| bool bool_;
|
| const char* symbol_name_;
|
| };
|
| -
|
| - // Handle<String>::null() until internalized.
|
| - Handle<Object> value_;
|
| - AstValue* next_;
|
| };
|
|
|
|
|
| @@ -325,8 +332,8 @@ class AstValueFactory {
|
| AstValueFactory(Zone* zone, uint32_t hash_seed)
|
| : string_table_(AstRawStringCompare),
|
| values_(nullptr),
|
| - cons_strings_(nullptr),
|
| - cons_strings_end_(&cons_strings_),
|
| + strings_(nullptr),
|
| + strings_end_(&strings_),
|
| zone_(zone),
|
| hash_seed_(hash_seed) {
|
| #define F(name, str) name##_string_ = NULL;
|
| @@ -387,14 +394,14 @@ class AstValueFactory {
|
| values_ = value;
|
| return value;
|
| }
|
| - AstConsString* AddConsString(AstConsString* string) {
|
| - *cons_strings_end_ = string;
|
| - cons_strings_end_ = string->next_location();
|
| + AstString* AddString(AstString* string) {
|
| + *strings_end_ = string;
|
| + strings_end_ = string->next_location();
|
| return string;
|
| }
|
| - void ResetConsStrings() {
|
| - cons_strings_ = nullptr;
|
| - cons_strings_end_ = &cons_strings_;
|
| + void ResetStrings() {
|
| + strings_ = nullptr;
|
| + strings_end_ = &strings_;
|
| }
|
| V8_EXPORT_PRIVATE AstRawString* GetOneByteStringInternal(
|
| Vector<const uint8_t> literal);
|
| @@ -409,10 +416,10 @@ class AstValueFactory {
|
| // For keeping track of all AstValues and AstRawStrings we've created (so that
|
| // they can be internalized later).
|
| AstValue* values_;
|
| - // We need to keep track of cons_strings_ in order since they require their
|
| + // We need to keep track of strings_ in order since cons strings require their
|
| // members to be internalized first.
|
| - AstConsString* cons_strings_;
|
| - AstConsString** cons_strings_end_;
|
| + AstString* strings_;
|
| + AstString** strings_end_;
|
| Zone* zone_;
|
|
|
| uint32_t hash_seed_;
|
|
|