Index: src/hydrogen-instructions.h |
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
index eaab8adef2b0eec3406abff64bac5f8333d76ea9..f1093a004c6c340131307d8fe18ed6baf868cef1 100644 |
--- a/src/hydrogen-instructions.h |
+++ b/src/hydrogen-instructions.h |
@@ -98,6 +98,7 @@ class LChunkBuilder; |
V(CompareJSObjectEq) \ |
V(CompareMap) \ |
V(Constant) \ |
+ V(Context) \ |
V(DeleteProperty) \ |
V(Deoptimize) \ |
V(Div) \ |
@@ -129,6 +130,7 @@ class LChunkBuilder; |
V(Mul) \ |
V(ObjectLiteral) \ |
V(OsrEntry) \ |
+ V(OuterContext) \ |
V(Parameter) \ |
V(Power) \ |
V(PushArgument) \ |
@@ -139,6 +141,7 @@ class LChunkBuilder; |
V(Shr) \ |
V(Simulate) \ |
V(StackCheck) \ |
+ V(StoreContextSlot) \ |
V(StoreGlobal) \ |
V(StoreKeyedFastElement) \ |
V(StoreKeyedGeneric) \ |
@@ -163,6 +166,7 @@ class LChunkBuilder; |
V(GlobalVars) \ |
V(Maps) \ |
V(ArrayLengths) \ |
+ V(ContextSlots) \ |
V(OsrEntries) |
#define DECLARE_INSTRUCTION(type) \ |
@@ -1060,12 +1064,39 @@ class HPushArgument: public HUnaryOperation { |
}; |
-class HGlobalObject: public HInstruction { |
+class HContext: public HInstruction { |
public: |
- HGlobalObject() { |
+ HContext() { |
+ set_representation(Representation::Tagged()); |
+ SetFlag(kUseGVN); |
+ } |
+ |
+ DECLARE_CONCRETE_INSTRUCTION(Context, "context"); |
+ |
+ protected: |
+ virtual bool DataEquals(HValue* other) const { return true; } |
+}; |
+ |
+ |
+class HOuterContext: public HUnaryOperation { |
+ public: |
+ explicit HOuterContext(HValue* inner) : HUnaryOperation(inner) { |
+ set_representation(Representation::Tagged()); |
+ SetFlag(kUseGVN); |
+ } |
+ |
+ DECLARE_CONCRETE_INSTRUCTION(OuterContext, "outer_context"); |
+ |
+ protected: |
+ virtual bool DataEquals(HValue* other) const { return true; } |
+}; |
+ |
+ |
+class HGlobalObject: public HUnaryOperation { |
+ public: |
+ explicit HGlobalObject(HValue* context) : HUnaryOperation(context) { |
set_representation(Representation::Tagged()); |
SetFlag(kUseGVN); |
- SetFlag(kDependsOnCalls); |
} |
DECLARE_CONCRETE_INSTRUCTION(GlobalObject, "global_object") |
@@ -1075,12 +1106,12 @@ class HGlobalObject: public HInstruction { |
}; |
-class HGlobalReceiver: public HInstruction { |
+class HGlobalReceiver: public HUnaryOperation { |
public: |
- HGlobalReceiver() { |
+ explicit HGlobalReceiver(HValue* global_object) |
+ : HUnaryOperation(global_object) { |
set_representation(Representation::Tagged()); |
SetFlag(kUseGVN); |
- SetFlag(kDependsOnCalls); |
} |
DECLARE_CONCRETE_INSTRUCTION(GlobalReceiver, "global_receiver") |
@@ -2613,35 +2644,66 @@ class HStoreGlobal: public HUnaryOperation { |
}; |
-class HLoadContextSlot: public HInstruction { |
+class HLoadContextSlot: public HUnaryOperation { |
public: |
- HLoadContextSlot(int context_chain_length , int slot_index) |
- : context_chain_length_(context_chain_length), slot_index_(slot_index) { |
+ HLoadContextSlot(HValue* context , int slot_index) |
+ : HUnaryOperation(context), slot_index_(slot_index) { |
set_representation(Representation::Tagged()); |
SetFlag(kUseGVN); |
- SetFlag(kDependsOnCalls); |
+ SetFlag(kDependsOnContextSlots); |
} |
- int context_chain_length() const { return context_chain_length_; } |
int slot_index() const { return slot_index_; } |
- virtual void PrintDataTo(StringStream* stream) const; |
- |
- virtual intptr_t Hashcode() const { |
- return context_chain_length() * 29 + slot_index(); |
+ virtual Representation RequiredInputRepresentation(int index) const { |
+ return Representation::Tagged(); |
} |
+ virtual void PrintDataTo(StringStream* stream) const; |
+ |
DECLARE_CONCRETE_INSTRUCTION(LoadContextSlot, "load_context_slot") |
protected: |
virtual bool DataEquals(HValue* other) const { |
HLoadContextSlot* b = HLoadContextSlot::cast(other); |
- return (context_chain_length() == b->context_chain_length()) |
- && (slot_index() == b->slot_index()); |
+ return (slot_index() == b->slot_index()); |
} |
private: |
- int context_chain_length_; |
+ int slot_index_; |
+}; |
+ |
+ |
+static inline bool StoringValueNeedsWriteBarrier(HValue* value) { |
+ return !value->type().IsSmi() && |
+ !(value->IsConstant() && HConstant::cast(value)->InOldSpace()); |
+} |
+ |
+ |
+class HStoreContextSlot: public HBinaryOperation { |
+ public: |
+ HStoreContextSlot(HValue* context, int slot_index, HValue* value) |
+ : HBinaryOperation(context, value), slot_index_(slot_index) { |
+ SetFlag(kChangesContextSlots); |
+ } |
+ |
+ HValue* context() const { return OperandAt(0); } |
+ HValue* value() const { return OperandAt(1); } |
+ int slot_index() const { return slot_index_; } |
+ |
+ bool NeedsWriteBarrier() const { |
+ return StoringValueNeedsWriteBarrier(value()); |
+ } |
+ |
+ virtual Representation RequiredInputRepresentation(int index) const { |
+ return Representation::Tagged(); |
+ } |
+ |
+ virtual void PrintDataTo(StringStream* stream) const; |
+ |
+ DECLARE_CONCRETE_INSTRUCTION(StoreContextSlot, "store_context_slot") |
+ |
+ private: |
int slot_index_; |
}; |
@@ -2777,12 +2839,6 @@ class HLoadKeyedGeneric: public HLoadKeyed { |
}; |
-static inline bool StoringValueNeedsWriteBarrier(HValue* value) { |
- return !value->type().IsSmi() && |
- !(value->IsConstant() && HConstant::cast(value)->InOldSpace()); |
-} |
- |
- |
class HStoreNamed: public HBinaryOperation { |
public: |
HStoreNamed(HValue* obj, Handle<Object> name, HValue* val) |
@@ -2800,10 +2856,6 @@ class HStoreNamed: public HBinaryOperation { |
HValue* value() const { return OperandAt(1); } |
void set_value(HValue* value) { SetOperandAt(1, value); } |
- bool NeedsWriteBarrier() const { |
- return StoringValueNeedsWriteBarrier(value()); |
- } |
- |
DECLARE_INSTRUCTION(StoreNamed) |
private: |
@@ -2831,7 +2883,7 @@ class HStoreNamedField: public HStoreNamed { |
DECLARE_CONCRETE_INSTRUCTION(StoreNamedField, "store_named_field") |
virtual Representation RequiredInputRepresentation(int index) const { |
- return Representation::Tagged(); |
+ return Representation::Tagged(); |
} |
virtual void PrintDataTo(StringStream* stream) const; |
@@ -2840,6 +2892,10 @@ class HStoreNamedField: public HStoreNamed { |
Handle<Map> transition() const { return transition_; } |
void set_transition(Handle<Map> map) { transition_ = map; } |
+ bool NeedsWriteBarrier() const { |
+ return StoringValueNeedsWriteBarrier(value()); |
+ } |
+ |
private: |
bool is_in_object_; |
int offset_; |