| Index: src/compiler/js-operator.h | 
| diff --git a/src/compiler/js-operator.h b/src/compiler/js-operator.h | 
| index 60a20ad0145b25fc95e90e959bd6abe1921305e2..cc50cc23a56df9ab224b8bc96254ec965c8e90a8 100644 | 
| --- a/src/compiler/js-operator.h | 
| +++ b/src/compiler/js-operator.h | 
| @@ -41,8 +41,26 @@ bool operator!=(VectorSlotPair const&, VectorSlotPair const&); | 
|  | 
| size_t hash_value(VectorSlotPair const&); | 
|  | 
| + | 
| +// Defines hints about receiver values based on structural knowledge. This is | 
| +// used as a parameter by JSConvertReceiver operators. | 
| +enum class ConvertReceiverMode { | 
| +  kNullOrUndefined,     // Guaranteed to be null or undefined. | 
| +  kNotNullOrUndefined,  // Guaranteed to never be null or undefined. | 
| +  kAny                  // No specific knowledge about receiver. | 
| +}; | 
| + | 
| +size_t hash_value(ConvertReceiverMode const&); | 
| + | 
| +std::ostream& operator<<(std::ostream&, ConvertReceiverMode const&); | 
| + | 
| +const ConvertReceiverMode& ConvertReceiverModeOf(const Operator* op); | 
| + | 
| + | 
| +// Defines whether tail call optimization is allowed. | 
| enum TailCallMode { NO_TAIL_CALLS, ALLOW_TAIL_CALLS }; | 
|  | 
| + | 
| // Defines the arity and the call flags for a JavaScript function call. This is | 
| // used as a parameter by JSCallFunction operators. | 
| class CallFunctionParameters final { | 
| @@ -50,22 +68,27 @@ class CallFunctionParameters final { | 
| CallFunctionParameters(size_t arity, CallFunctionFlags flags, | 
| LanguageMode language_mode, | 
| VectorSlotPair const& feedback, | 
| -                         TailCallMode tail_call_mode) | 
| +                         TailCallMode tail_call_mode, | 
| +                         ConvertReceiverMode convert_mode) | 
| : bit_field_(ArityField::encode(arity) | FlagsField::encode(flags) | | 
| LanguageModeField::encode(language_mode)), | 
| feedback_(feedback), | 
| -        tail_call_mode_(tail_call_mode) {} | 
| +        tail_call_mode_(tail_call_mode), | 
| +        convert_mode_(convert_mode) {} | 
|  | 
| size_t arity() const { return ArityField::decode(bit_field_); } | 
| CallFunctionFlags flags() const { return FlagsField::decode(bit_field_); } | 
| LanguageMode language_mode() const { | 
| return LanguageModeField::decode(bit_field_); | 
| } | 
| +  ConvertReceiverMode convert_mode() const { return convert_mode_; } | 
| VectorSlotPair const& feedback() const { return feedback_; } | 
|  | 
| bool operator==(CallFunctionParameters const& that) const { | 
| return this->bit_field_ == that.bit_field_ && | 
| -           this->feedback_ == that.feedback_; | 
| +           this->feedback_ == that.feedback_ && | 
| +           this->tail_call_mode_ == that.tail_call_mode_ && | 
| +           this->convert_mode_ == that.convert_mode_; | 
| } | 
| bool operator!=(CallFunctionParameters const& that) const { | 
| return !(*this == that); | 
| @@ -75,7 +98,7 @@ class CallFunctionParameters final { | 
|  | 
| private: | 
| friend size_t hash_value(CallFunctionParameters const& p) { | 
| -    return base::hash_combine(p.bit_field_, p.feedback_); | 
| +    return base::hash_combine(p.bit_field_, p.feedback_, p.convert_mode_); | 
| } | 
|  | 
| typedef BitField<size_t, 0, 28> ArityField; | 
| @@ -84,7 +107,8 @@ class CallFunctionParameters final { | 
|  | 
| const uint32_t bit_field_; | 
| const VectorSlotPair feedback_; | 
| -  bool tail_call_mode_; | 
| +  TailCallMode tail_call_mode_; | 
| +  ConvertReceiverMode convert_mode_; | 
| }; | 
|  | 
| size_t hash_value(CallFunctionParameters const&); | 
| @@ -440,11 +464,13 @@ class JSOperatorBuilder final : public ZoneObject { | 
| const Operator* CallFunction( | 
| size_t arity, CallFunctionFlags flags, LanguageMode language_mode, | 
| VectorSlotPair const& feedback = VectorSlotPair(), | 
| +      ConvertReceiverMode convert_mode = ConvertReceiverMode::kAny, | 
| TailCallMode tail_call_mode = NO_TAIL_CALLS); | 
| const Operator* CallRuntime(Runtime::FunctionId id, size_t arity); | 
| - | 
| const Operator* CallConstruct(int arguments); | 
|  | 
| +  const Operator* ConvertReceiver(ConvertReceiverMode convert_mode); | 
| + | 
| const Operator* LoadProperty(LanguageMode language_mode, | 
| VectorSlotPair const& feedback); | 
| const Operator* LoadNamed(LanguageMode language_mode, Handle<Name> name, | 
|  |