Index: src/hydrogen-instructions.h |
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
index 8668793c8a3e4844783ca40d1ad1a1cc054f6829..f6537e36730e22db0cbc00bf832340f73b87a322 100644 |
--- a/src/hydrogen-instructions.h |
+++ b/src/hydrogen-instructions.h |
@@ -88,12 +88,12 @@ class LChunkBuilder; |
V(CallStub) \ |
V(CapturedObject) \ |
V(Change) \ |
- V(CheckFunction) \ |
V(CheckHeapObject) \ |
V(CheckInstanceType) \ |
V(CheckMaps) \ |
V(CheckMapValue) \ |
V(CheckSmi) \ |
+ V(CheckValue) \ |
V(ClampToUint8) \ |
V(ClassOfTestAndBranch) \ |
V(CompareNumericAndBranch) \ |
@@ -2556,6 +2556,7 @@ class HCheckMaps V8_FINAL : public HTemplateInstruction<2> { |
HValue* value() { return OperandAt(0); } |
SmallMapList* map_set() { return &map_set_; } |
+ ZoneList<UniqueValueId>* map_unique_ids() { return &map_unique_ids_; } |
bool has_migration_target() { |
return has_migration_target_; |
@@ -2624,9 +2625,20 @@ class HCheckMaps V8_FINAL : public HTemplateInstruction<2> { |
}; |
-class HCheckFunction V8_FINAL : public HUnaryOperation { |
+class HCheckValue V8_FINAL : public HUnaryOperation { |
public: |
- DECLARE_INSTRUCTION_FACTORY_P2(HCheckFunction, HValue*, Handle<JSFunction>); |
+ static HCheckValue* New(Zone* zone, HValue* context, |
+ HValue* value, Handle<JSFunction> target) { |
+ bool in_new_space = Isolate::Current()->heap()->InNewSpace(*target); |
+ HCheckValue* check = new(zone) HCheckValue(value, target, in_new_space); |
+ return check; |
+ } |
+ static HCheckValue* New(Zone* zone, HValue* context, |
+ HValue* value, Handle<Map> map, UniqueValueId id) { |
+ HCheckValue* check = new(zone) HCheckValue(value, map, false); |
+ check->object_unique_id_ = id; |
+ return check; |
+ } |
virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
return Representation::Tagged(); |
@@ -2640,32 +2652,31 @@ class HCheckFunction V8_FINAL : public HUnaryOperation { |
#endif |
virtual void FinalizeUniqueValueId() V8_OVERRIDE { |
- target_unique_id_ = UniqueValueId(target_); |
+ object_unique_id_ = UniqueValueId(object_); |
} |
- Handle<JSFunction> target() const { return target_; } |
- bool target_in_new_space() const { return target_in_new_space_; } |
+ Handle<HeapObject> object() const { return object_; } |
+ bool object_in_new_space() const { return object_in_new_space_; } |
- DECLARE_CONCRETE_INSTRUCTION(CheckFunction) |
+ DECLARE_CONCRETE_INSTRUCTION(CheckValue) |
protected: |
virtual bool DataEquals(HValue* other) V8_OVERRIDE { |
- HCheckFunction* b = HCheckFunction::cast(other); |
- return target_unique_id_ == b->target_unique_id_; |
+ HCheckValue* b = HCheckValue::cast(other); |
+ return object_unique_id_ == b->object_unique_id_; |
} |
private: |
- HCheckFunction(HValue* value, Handle<JSFunction> function) |
+ HCheckValue(HValue* value, Handle<HeapObject> object, bool in_new_space) |
: HUnaryOperation(value, value->type()), |
- target_(function), target_unique_id_() { |
+ object_(object), object_in_new_space_(in_new_space) { |
set_representation(Representation::Tagged()); |
SetFlag(kUseGVN); |
- target_in_new_space_ = Isolate::Current()->heap()->InNewSpace(*function); |
} |
- Handle<JSFunction> target_; |
- UniqueValueId target_unique_id_; |
- bool target_in_new_space_; |
+ Handle<HeapObject> object_; |
+ UniqueValueId object_unique_id_; |
+ bool object_in_new_space_; |
}; |
@@ -3224,6 +3235,9 @@ class HCapturedObject V8_FINAL : public HDematerializedObject { |
int length() const { return values_.length(); } |
int capture_id() const { return capture_id_; } |
+ // Shortcut for the map value of this captured object. |
+ HValue* map_value() const { return values()->first(); } |
+ |
// Replay effects of this instruction on the given environment. |
void ReplayEnvironment(HEnvironment* env); |