| Index: runtime/vm/intermediate_language.h
|
| ===================================================================
|
| --- runtime/vm/intermediate_language.h (revision 41687)
|
| +++ runtime/vm/intermediate_language.h (working copy)
|
| @@ -3861,6 +3861,39 @@
|
| };
|
|
|
|
|
| +class AllocateUninitializedContextInstr
|
| + : public TemplateDefinition<0, NoThrow> {
|
| + public:
|
| + AllocateUninitializedContextInstr(intptr_t token_pos,
|
| + intptr_t num_context_variables)
|
| + : token_pos_(token_pos),
|
| + num_context_variables_(num_context_variables),
|
| + identity_(AliasIdentity::Unknown()) {}
|
| +
|
| + DECLARE_INSTRUCTION(AllocateUninitializedContext)
|
| + virtual CompileType ComputeType() const;
|
| +
|
| + virtual intptr_t token_pos() const { return token_pos_; }
|
| + intptr_t num_context_variables() const { return num_context_variables_; }
|
| +
|
| + virtual void PrintOperandsTo(BufferFormatter* f) const;
|
| +
|
| + virtual bool CanDeoptimize() const { return false; }
|
| +
|
| + virtual EffectSet Effects() const { return EffectSet::None(); }
|
| +
|
| + virtual AliasIdentity Identity() const { return identity_; }
|
| + virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; }
|
| +
|
| + private:
|
| + const intptr_t token_pos_;
|
| + const intptr_t num_context_variables_;
|
| + AliasIdentity identity_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(AllocateUninitializedContextInstr);
|
| +};
|
| +
|
| +
|
| // This instruction captures the state of the object which had its allocation
|
| // removed during the AllocationSinking pass.
|
| // It does not produce any real code only deoptimization information.
|
| @@ -3867,11 +3900,11 @@
|
| class MaterializeObjectInstr : public Definition {
|
| public:
|
| MaterializeObjectInstr(AllocateObjectInstr* allocation,
|
| - const Class& cls,
|
| const ZoneGrowableArray<const Object*>& slots,
|
| ZoneGrowableArray<Value*>* values)
|
| : allocation_(allocation),
|
| - cls_(cls),
|
| + cls_(allocation->cls()),
|
| + num_variables_(-1),
|
| slots_(slots),
|
| values_(values),
|
| locations_(NULL),
|
| @@ -3884,13 +3917,37 @@
|
| }
|
| }
|
|
|
| - AllocateObjectInstr* allocation() const { return allocation_; }
|
| + MaterializeObjectInstr(AllocateUninitializedContextInstr* allocation,
|
| + const ZoneGrowableArray<const Object*>& slots,
|
| + ZoneGrowableArray<Value*>* values)
|
| + : allocation_(allocation),
|
| + cls_(Class::ZoneHandle(Object::context_class())),
|
| + num_variables_(allocation->num_context_variables()),
|
| + slots_(slots),
|
| + values_(values),
|
| + locations_(NULL),
|
| + visited_for_liveness_(false),
|
| + registers_remapped_(false) {
|
| + ASSERT(slots_.length() == values_->length());
|
| + for (intptr_t i = 0; i < InputCount(); i++) {
|
| + InputAt(i)->set_instruction(this);
|
| + InputAt(i)->set_use_index(i);
|
| + }
|
| + }
|
| +
|
| + Definition* allocation() const { return allocation_; }
|
| const Class& cls() const { return cls_; }
|
| +
|
| + intptr_t num_variables() const {
|
| + return num_variables_;
|
| + }
|
| +
|
| intptr_t FieldOffsetAt(intptr_t i) const {
|
| return slots_[i]->IsField()
|
| ? Field::Cast(*slots_[i]).Offset()
|
| : Smi::Cast(*slots_[i]).Value();
|
| }
|
| +
|
| const Location& LocationAt(intptr_t i) {
|
| return locations_[i];
|
| }
|
| @@ -3937,8 +3994,9 @@
|
| (*values_)[i] = value;
|
| }
|
|
|
| - AllocateObjectInstr* allocation_;
|
| + Definition* allocation_;
|
| const Class& cls_;
|
| + intptr_t num_variables_;
|
| const ZoneGrowableArray<const Object*>& slots_;
|
| ZoneGrowableArray<Value*>* values_;
|
| Location* locations_;
|
| @@ -4228,7 +4286,7 @@
|
| AllocateContextInstr(intptr_t token_pos,
|
| intptr_t num_context_variables)
|
| : token_pos_(token_pos),
|
| - num_context_variables_(num_context_variables) {}
|
| + num_context_variables_(num_context_variables) { }
|
|
|
| DECLARE_INSTRUCTION(AllocateContext)
|
| virtual CompileType ComputeType() const;
|
| @@ -4274,34 +4332,6 @@
|
| };
|
|
|
|
|
| -class AllocateUninitializedContextInstr
|
| - : public TemplateDefinition<0, NoThrow> {
|
| - public:
|
| - AllocateUninitializedContextInstr(intptr_t token_pos,
|
| - intptr_t num_context_variables)
|
| - : token_pos_(token_pos),
|
| - num_context_variables_(num_context_variables) {}
|
| -
|
| - DECLARE_INSTRUCTION(AllocateUninitializedContext)
|
| - virtual CompileType ComputeType() const;
|
| -
|
| - virtual intptr_t token_pos() const { return token_pos_; }
|
| - intptr_t num_context_variables() const { return num_context_variables_; }
|
| -
|
| - virtual void PrintOperandsTo(BufferFormatter* f) const;
|
| -
|
| - virtual bool CanDeoptimize() const { return false; }
|
| -
|
| - virtual EffectSet Effects() const { return EffectSet::None(); }
|
| -
|
| - private:
|
| - const intptr_t token_pos_;
|
| - const intptr_t num_context_variables_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(AllocateUninitializedContextInstr);
|
| -};
|
| -
|
| -
|
| class CloneContextInstr : public TemplateDefinition<1, NoThrow> {
|
| public:
|
| CloneContextInstr(intptr_t token_pos, Value* context_value)
|
|
|