Index: src/hydrogen-instructions.h |
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
index 1a43f0fb53fd88f5e68b4e00ac68f49643a8c7c1..7988d2f25968c851c9074c38d8043fb7f18ebfc6 100644 |
--- a/src/hydrogen-instructions.h |
+++ b/src/hydrogen-instructions.h |
@@ -1496,18 +1496,18 @@ class HEnterInlined: public HTemplateInstruction<0> { |
HEnterInlined(Handle<JSFunction> closure, |
int arguments_count, |
FunctionLiteral* function, |
- CallKind call_kind, |
InliningKind inlining_kind, |
Variable* arguments_var, |
- ZoneList<HValue*>* arguments_values) |
+ ZoneList<HValue*>* arguments_values, |
+ bool undefined_receiver) |
: closure_(closure), |
arguments_count_(arguments_count), |
arguments_pushed_(false), |
function_(function), |
- call_kind_(call_kind), |
inlining_kind_(inlining_kind), |
arguments_var_(arguments_var), |
- arguments_values_(arguments_values) { |
+ arguments_values_(arguments_values), |
+ undefined_receiver_(undefined_receiver) { |
} |
virtual void PrintDataTo(StringStream* stream); |
@@ -1517,8 +1517,8 @@ class HEnterInlined: public HTemplateInstruction<0> { |
bool arguments_pushed() const { return arguments_pushed_; } |
void set_arguments_pushed() { arguments_pushed_ = true; } |
FunctionLiteral* function() const { return function_; } |
- CallKind call_kind() const { return call_kind_; } |
InliningKind inlining_kind() const { return inlining_kind_; } |
+ bool undefined_receiver() const { return undefined_receiver_; } |
virtual Representation RequiredInputRepresentation(int index) { |
return Representation::None(); |
@@ -1534,10 +1534,10 @@ class HEnterInlined: public HTemplateInstruction<0> { |
int arguments_count_; |
bool arguments_pushed_; |
FunctionLiteral* function_; |
- CallKind call_kind_; |
InliningKind inlining_kind_; |
Variable* arguments_var_; |
ZoneList<HValue*>* arguments_values_; |
+ bool undefined_receiver_; |
}; |
@@ -2322,6 +2322,7 @@ class HCheckFunction: public HUnaryOperation { |
: HUnaryOperation(value), target_(function) { |
set_representation(Representation::Tagged()); |
SetFlag(kUseGVN); |
+ target_in_new_space_ = Isolate::Current()->heap()->InNewSpace(*function); |
} |
virtual Representation RequiredInputRepresentation(int index) { |
@@ -2335,6 +2336,7 @@ class HCheckFunction: public HUnaryOperation { |
#endif |
Handle<JSFunction> target() const { return target_; } |
+ bool target_in_new_space() const { return target_in_new_space_; } |
DECLARE_CONCRETE_INSTRUCTION(CheckFunction) |
@@ -2346,6 +2348,7 @@ class HCheckFunction: public HUnaryOperation { |
private: |
Handle<JSFunction> target_; |
+ bool target_in_new_space_; |
}; |
@@ -2475,6 +2478,8 @@ class HCheckPrototypeMaps: public HTemplateInstruction<0> { |
virtual intptr_t Hashcode() { |
ASSERT_ALLOCATION_DISABLED; |
+ // Dereferencing to use the object's raw address for hashing is safe. |
+ AllowHandleDereference allow_handle_deref; |
intptr_t hash = 0; |
for (int i = 0; i < prototypes_.length(); i++) { |
hash = 17 * hash + reinterpret_cast<intptr_t>(*prototypes_[i]); |
@@ -2692,15 +2697,16 @@ class HConstant: public HTemplateInstruction<0> { |
Heap* heap = HEAP; |
// We should have handled minus_zero_value and nan_value in the |
// has_double_value_ clause above. |
+ // Dereferencing is safe to compare against singletons. |
+ AllowHandleDereference allow_handle_deref; |
ASSERT(*handle_ != heap->minus_zero_value()); |
ASSERT(*handle_ != heap->nan_value()); |
- if (*handle_ == heap->undefined_value()) return true; |
- if (*handle_ == heap->null_value()) return true; |
- if (*handle_ == heap->true_value()) return true; |
- if (*handle_ == heap->false_value()) return true; |
- if (*handle_ == heap->the_hole_value()) return true; |
- if (*handle_ == heap->empty_string()) return true; |
- return false; |
+ return *handle_ == heap->undefined_value() || |
+ *handle_ == heap->null_value() || |
+ *handle_ == heap->true_value() || |
+ *handle_ == heap->false_value() || |
+ *handle_ == heap->the_hole_value() || |
+ *handle_ == heap->empty_string(); |
} |
virtual Representation RequiredInputRepresentation(int index) { |
@@ -2752,6 +2758,8 @@ class HConstant: public HTemplateInstruction<0> { |
hash = static_cast<intptr_t>(BitCast<int64_t>(double_value_)); |
} else { |
ASSERT(!handle_.is_null()); |
+ // Dereferencing to use the object's raw address for hashing is safe. |
+ AllowHandleDereference allow_handle_deref; |
hash = reinterpret_cast<intptr_t>(*handle_); |
} |
@@ -2779,7 +2787,7 @@ class HConstant: public HTemplateInstruction<0> { |
} else { |
ASSERT(!handle_.is_null()); |
return !other_constant->handle_.is_null() && |
- *handle_ == *other_constant->handle_; |
+ handle_.is_identical_to(other_constant->handle_); |
} |
} |
@@ -4013,13 +4021,15 @@ class HLoadGlobalCell: public HTemplateInstruction<0> { |
SetGVNFlag(kDependsOnGlobalVars); |
} |
- Handle<JSGlobalPropertyCell> cell() const { return cell_; } |
+ Handle<JSGlobalPropertyCell> cell() const { return cell_; } |
bool RequiresHoleCheck() const; |
virtual void PrintDataTo(StringStream* stream); |
virtual intptr_t Hashcode() { |
ASSERT_ALLOCATION_DISABLED; |
+ // Dereferencing to use the object's raw address for hashing is safe. |
+ AllowHandleDereference allow_handle_deref; |
return reinterpret_cast<intptr_t>(*cell_); |
} |
@@ -4812,7 +4822,9 @@ class HTransitionElementsKind: public HTemplateInstruction<1> { |
Handle<Map> original_map, |
Handle<Map> transitioned_map) |
: original_map_(original_map), |
- transitioned_map_(transitioned_map) { |
+ transitioned_map_(transitioned_map), |
+ from_kind_(original_map->elements_kind()), |
+ to_kind_(transitioned_map->elements_kind()) { |
SetOperandAt(0, object); |
SetFlag(kUseGVN); |
SetGVNFlag(kChangesElementsKind); |
@@ -4834,6 +4846,8 @@ class HTransitionElementsKind: public HTemplateInstruction<1> { |
HValue* object() { return OperandAt(0); } |
Handle<Map> original_map() { return original_map_; } |
Handle<Map> transitioned_map() { return transitioned_map_; } |
+ ElementsKind from_kind() { return from_kind_; } |
+ ElementsKind to_kind() { return to_kind_; } |
virtual void PrintDataTo(StringStream* stream); |
@@ -4849,6 +4863,8 @@ class HTransitionElementsKind: public HTemplateInstruction<1> { |
private: |
Handle<Map> original_map_; |
Handle<Map> transitioned_map_; |
+ ElementsKind from_kind_; |
+ ElementsKind to_kind_; |
}; |