| 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_;
|
| };
|
|
|
|
|
|
|