| Index: src/compiler/instruction.h
|
| diff --git a/src/compiler/instruction.h b/src/compiler/instruction.h
|
| index 327c8c119213dae84d0de56a9ccfd981e959fee5..084f397ceb920a1875c2335fd63ef6ccaa3bfd92 100644
|
| --- a/src/compiler/instruction.h
|
| +++ b/src/compiler/instruction.h
|
| @@ -1104,52 +1104,123 @@ std::ostream& operator<<(std::ostream& os, const Constant& constant);
|
| // Forward declarations.
|
| class FrameStateDescriptor;
|
|
|
| -
|
| -enum class StateValueKind { kPlain, kNested, kDuplicate };
|
| -
|
| +enum class StateValueKind : uint8_t {
|
| + kPlain,
|
| + kOptimizedOut,
|
| + kNested,
|
| + kDuplicate
|
| +};
|
|
|
| class StateValueDescriptor {
|
| public:
|
| - explicit StateValueDescriptor(Zone* zone)
|
| + StateValueDescriptor()
|
| : kind_(StateValueKind::kPlain),
|
| type_(MachineType::AnyTagged()),
|
| - id_(0),
|
| - fields_(zone) {}
|
| + id_(0) {}
|
|
|
| - static StateValueDescriptor Plain(Zone* zone, MachineType type) {
|
| - return StateValueDescriptor(StateValueKind::kPlain, zone, type, 0);
|
| + static StateValueDescriptor Plain(MachineType type) {
|
| + return StateValueDescriptor(StateValueKind::kPlain, type, 0);
|
| }
|
| - static StateValueDescriptor Recursive(Zone* zone, size_t id) {
|
| - return StateValueDescriptor(StateValueKind::kNested, zone,
|
| + static StateValueDescriptor OptimizedOut() {
|
| + return StateValueDescriptor(StateValueKind::kOptimizedOut,
|
| + MachineType::AnyTagged(), 0);
|
| + }
|
| + static StateValueDescriptor Recursive(size_t id) {
|
| + return StateValueDescriptor(StateValueKind::kNested,
|
| MachineType::AnyTagged(), id);
|
| }
|
| - static StateValueDescriptor Duplicate(Zone* zone, size_t id) {
|
| - return StateValueDescriptor(StateValueKind::kDuplicate, zone,
|
| + static StateValueDescriptor Duplicate(size_t id) {
|
| + return StateValueDescriptor(StateValueKind::kDuplicate,
|
| MachineType::AnyTagged(), id);
|
| }
|
|
|
| - size_t size() { return fields_.size(); }
|
| - ZoneVector<StateValueDescriptor>& fields() { return fields_; }
|
| int IsPlain() { return kind_ == StateValueKind::kPlain; }
|
| + int IsOptimizedOut() { return kind_ == StateValueKind::kOptimizedOut; }
|
| int IsNested() { return kind_ == StateValueKind::kNested; }
|
| int IsDuplicate() { return kind_ == StateValueKind::kDuplicate; }
|
| MachineType type() const { return type_; }
|
| - MachineType GetOperandType(size_t index) const {
|
| - return fields_[index].type_;
|
| - }
|
| size_t id() const { return id_; }
|
|
|
| private:
|
| - StateValueDescriptor(StateValueKind kind, Zone* zone, MachineType type,
|
| - size_t id)
|
| - : kind_(kind), type_(type), id_(id), fields_(zone) {}
|
| + StateValueDescriptor(StateValueKind kind, MachineType type, size_t id)
|
| + : kind_(kind), type_(type), id_(id) {}
|
|
|
| StateValueKind kind_;
|
| MachineType type_;
|
| size_t id_;
|
| - ZoneVector<StateValueDescriptor> fields_;
|
| };
|
|
|
| +class StateValueList {
|
| + public:
|
| + explicit StateValueList(Zone* zone) : fields_(zone), nested_(zone) {}
|
| +
|
| + size_t size() { return fields_.size(); }
|
| +
|
| + struct Value {
|
| + StateValueDescriptor* desc;
|
| + StateValueList* nested;
|
| +
|
| + Value(StateValueDescriptor* desc, StateValueList* nested)
|
| + : desc(desc), nested(nested) {}
|
| + };
|
| +
|
| + class iterator {
|
| + public:
|
| + // Bare minimum of operators needed for range iteration.
|
| + bool operator!=(const iterator& other) const {
|
| + return field_iterator != other.field_iterator;
|
| + }
|
| + bool operator==(const iterator& other) const {
|
| + return field_iterator == other.field_iterator;
|
| + }
|
| + iterator& operator++() {
|
| + if (field_iterator->IsNested()) {
|
| + nested_iterator++;
|
| + }
|
| + ++field_iterator;
|
| + return *this;
|
| + }
|
| + Value operator*() {
|
| + StateValueDescriptor* desc = &(*field_iterator);
|
| + StateValueList* nested = desc->IsNested() ? *nested_iterator : nullptr;
|
| + return Value(desc, nested);
|
| + }
|
| +
|
| + private:
|
| + friend class StateValueList;
|
| +
|
| + iterator(ZoneVector<StateValueDescriptor>::iterator it,
|
| + ZoneVector<StateValueList*>::iterator nested)
|
| + : field_iterator(it), nested_iterator(nested) {}
|
| +
|
| + ZoneVector<StateValueDescriptor>::iterator field_iterator;
|
| + ZoneVector<StateValueList*>::iterator nested_iterator;
|
| + };
|
| +
|
| + StateValueList* PushRecursiveField(Zone* zone, size_t id) {
|
| + fields_.push_back(StateValueDescriptor::Recursive(id));
|
| + StateValueList* nested =
|
| + new (zone->New(sizeof(StateValueList))) StateValueList(zone);
|
| + nested_.push_back(nested);
|
| + return nested;
|
| + }
|
| + void PushDuplicate(size_t id) {
|
| + fields_.push_back(StateValueDescriptor::Duplicate(id));
|
| + }
|
| + void PushPlain(MachineType type) {
|
| + fields_.push_back(StateValueDescriptor::Plain(type));
|
| + }
|
| + void PushOptimizedOut() {
|
| + fields_.push_back(StateValueDescriptor::OptimizedOut());
|
| + }
|
| +
|
| + iterator begin() { return iterator(fields_.begin(), nested_.begin()); }
|
| + iterator end() { return iterator(fields_.end(), nested_.end()); }
|
| +
|
| + private:
|
| + ZoneVector<StateValueDescriptor> fields_;
|
| + ZoneVector<StateValueList*> nested_;
|
| +};
|
|
|
| class FrameStateDescriptor : public ZoneObject {
|
| public:
|
| @@ -1178,10 +1249,7 @@ class FrameStateDescriptor : public ZoneObject {
|
| size_t GetFrameCount() const;
|
| size_t GetJSFrameCount() const;
|
|
|
| - MachineType GetType(size_t index) const {
|
| - return values_.GetOperandType(index);
|
| - }
|
| - StateValueDescriptor* GetStateValueDescriptor() { return &values_; }
|
| + StateValueList* GetStateValueDescriptors() { return &values_; }
|
|
|
| static const int kImpossibleValue = 0xdead;
|
|
|
| @@ -1192,7 +1260,7 @@ class FrameStateDescriptor : public ZoneObject {
|
| size_t parameters_count_;
|
| size_t locals_count_;
|
| size_t stack_count_;
|
| - StateValueDescriptor values_;
|
| + StateValueList values_;
|
| MaybeHandle<SharedFunctionInfo> const shared_info_;
|
| FrameStateDescriptor* outer_state_;
|
| };
|
|
|