diff options
Diffstat (limited to 'deps/v8/src/hydrogen-instructions.h')
-rw-r--r-- | deps/v8/src/hydrogen-instructions.h | 54 |
1 files changed, 46 insertions, 8 deletions
diff --git a/deps/v8/src/hydrogen-instructions.h b/deps/v8/src/hydrogen-instructions.h index 52fed88442..d7c0eb059e 100644 --- a/deps/v8/src/hydrogen-instructions.h +++ b/deps/v8/src/hydrogen-instructions.h @@ -3447,8 +3447,21 @@ class HStoreGlobalGeneric: public HTemplateInstruction<3> { class HLoadContextSlot: public HUnaryOperation { public: - HLoadContextSlot(HValue* context , int slot_index) - : HUnaryOperation(context), slot_index_(slot_index) { + enum Mode { + // Perform a normal load of the context slot without checking its value. + kLoad, + // Load and check the value of the context slot. Deoptimize if it's the + // hole value. This is used for checking for loading of uninitialized + // harmony bindings where we deoptimize into full-codegen generated code + // which will subsequently throw a reference error. + kLoadCheck + }; + + HLoadContextSlot(HValue* context, Variable* var) + : HUnaryOperation(context), slot_index_(var->index()) { + ASSERT(var->IsContextSlot()); + mode_ = (var->mode() == LET || var->mode() == CONST_HARMONY) + ? kLoadCheck : kLoad; set_representation(Representation::Tagged()); SetFlag(kUseGVN); SetFlag(kDependsOnContextSlots); @@ -3456,6 +3469,10 @@ class HLoadContextSlot: public HUnaryOperation { int slot_index() const { return slot_index_; } + bool RequiresHoleCheck() { + return mode_ == kLoadCheck; + } + virtual Representation RequiredInputRepresentation(int index) { return Representation::Tagged(); } @@ -3472,13 +3489,25 @@ class HLoadContextSlot: public HUnaryOperation { private: int slot_index_; + Mode mode_; }; class HStoreContextSlot: public HTemplateInstruction<2> { public: - HStoreContextSlot(HValue* context, int slot_index, HValue* value) - : slot_index_(slot_index) { + enum Mode { + // Perform a normal store to the context slot without checking its previous + // value. + kAssign, + // Check the previous value of the context slot and deoptimize if it's the + // hole value. This is used for checking for assignments to uninitialized + // harmony bindings where we deoptimize into full-codegen generated code + // which will subsequently throw a reference error. + kAssignCheck + }; + + HStoreContextSlot(HValue* context, int slot_index, Mode mode, HValue* value) + : slot_index_(slot_index), mode_(mode) { SetOperandAt(0, context); SetOperandAt(1, value); SetFlag(kChangesContextSlots); @@ -3487,11 +3516,16 @@ class HStoreContextSlot: public HTemplateInstruction<2> { HValue* context() { return OperandAt(0); } HValue* value() { return OperandAt(1); } int slot_index() const { return slot_index_; } + Mode mode() const { return mode_; } bool NeedsWriteBarrier() { return StoringValueNeedsWriteBarrier(value()); } + bool RequiresHoleCheck() { + return mode_ == kAssignCheck; + } + virtual Representation RequiredInputRepresentation(int index) { return Representation::Tagged(); } @@ -3502,6 +3536,7 @@ class HStoreContextSlot: public HTemplateInstruction<2> { private: int slot_index_; + Mode mode_; }; @@ -4167,18 +4202,21 @@ class HMaterializedLiteral: public HTemplateInstruction<V> { class HArrayLiteral: public HMaterializedLiteral<1> { public: HArrayLiteral(HValue* context, - Handle<FixedArray> constant_elements, + Handle<JSObject> boilerplate_object, int length, int literal_index, int depth) : HMaterializedLiteral<1>(literal_index, depth), length_(length), - constant_elements_(constant_elements) { + boilerplate_object_(boilerplate_object) { SetOperandAt(0, context); } HValue* context() { return OperandAt(0); } - Handle<FixedArray> constant_elements() const { return constant_elements_; } + ElementsKind boilerplate_elements_kind() const { + return boilerplate_object_->GetElementsKind(); + } + Handle<JSObject> boilerplate_object() const { return boilerplate_object_; } int length() const { return length_; } bool IsCopyOnWrite() const; @@ -4192,7 +4230,7 @@ class HArrayLiteral: public HMaterializedLiteral<1> { private: int length_; - Handle<FixedArray> constant_elements_; + Handle<JSObject> boilerplate_object_; }; |