| Index: src/parsing/parser.cc
 | 
| diff --git a/src/parsing/parser.cc b/src/parsing/parser.cc
 | 
| index 6578fa08ea851de9529d737812bcba3169a7f4e0..c0f736004ff2cddda0563d6b9748b872c1c9ab8b 100644
 | 
| --- a/src/parsing/parser.cc
 | 
| +++ b/src/parsing/parser.cc
 | 
| @@ -6366,180 +6366,6 @@ Expression* ParserTraits::RewriteYieldStar(
 | 
|    return yield_star;
 | 
|  }
 | 
|  
 | 
| -// Desugaring of (lhs) instanceof (rhs)
 | 
| -// ====================================
 | 
| -//
 | 
| -// We desugar instanceof into a load of property @@hasInstance on the rhs.
 | 
| -// We end up with roughly the following code (O, C):
 | 
| -//
 | 
| -//   do {
 | 
| -//     let O = lhs;
 | 
| -//     let C = rhs;
 | 
| -//     if (!IS_RECEIVER(C)) throw MakeTypeError(kNonObjectInInstanceOfCheck);
 | 
| -//     let handler_result = C[Symbol.hasInstance];
 | 
| -//     if (handler_result === undefined) {
 | 
| -//       if (!IS_CALLABLE(C)) {
 | 
| -//         throw MakeTypeError(kCalledNonCallableInstanceOf);
 | 
| -//       }
 | 
| -//       handler_result = %_GetOrdinaryHasInstance()
 | 
| -//       handler_result = %_Call(handler_result, C, O);
 | 
| -//     } else {
 | 
| -//       handler_result = !!(%_Call(handler_result, C, O));
 | 
| -//     }
 | 
| -//     handler_result;
 | 
| -//   }
 | 
| -//
 | 
| -Expression* ParserTraits::RewriteInstanceof(Expression* lhs, Expression* rhs,
 | 
| -                                            int pos) {
 | 
| -  const int nopos = RelocInfo::kNoPosition;
 | 
| -
 | 
| -  auto factory = parser_->factory();
 | 
| -  auto avfactory = parser_->ast_value_factory();
 | 
| -  auto scope = parser_->scope_;
 | 
| -  auto zone = parser_->zone();
 | 
| -
 | 
| -  // let O = lhs;
 | 
| -  Variable* var_O = scope->NewTemporary(avfactory->empty_string());
 | 
| -  Statement* get_O;
 | 
| -  {
 | 
| -    Expression* O_proxy = factory->NewVariableProxy(var_O);
 | 
| -    Expression* assignment =
 | 
| -        factory->NewAssignment(Token::ASSIGN, O_proxy, lhs, nopos);
 | 
| -    get_O = factory->NewExpressionStatement(assignment, nopos);
 | 
| -  }
 | 
| -
 | 
| -  // let C = lhs;
 | 
| -  Variable* var_C = scope->NewTemporary(avfactory->empty_string());
 | 
| -  Statement* get_C;
 | 
| -  {
 | 
| -    Expression* C_proxy = factory->NewVariableProxy(var_C);
 | 
| -    Expression* assignment =
 | 
| -        factory->NewAssignment(Token::ASSIGN, C_proxy, rhs, nopos);
 | 
| -    get_C = factory->NewExpressionStatement(assignment, nopos);
 | 
| -  }
 | 
| -
 | 
| -  // if (!IS_RECEIVER(C)) throw MakeTypeError(kNonObjectInInstanceOfCheck);
 | 
| -  Statement* validate_C;
 | 
| -  {
 | 
| -    auto args = new (zone) ZoneList<Expression*>(1, zone);
 | 
| -    args->Add(factory->NewVariableProxy(var_C), zone);
 | 
| -    Expression* is_receiver_call =
 | 
| -        factory->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos);
 | 
| -    Expression* call =
 | 
| -        NewThrowTypeError(MessageTemplate::kNonObjectInInstanceOfCheck,
 | 
| -                          avfactory->empty_string(), pos);
 | 
| -    Statement* throw_call = factory->NewExpressionStatement(call, pos);
 | 
| -
 | 
| -    validate_C =
 | 
| -        factory->NewIfStatement(is_receiver_call,
 | 
| -                                factory->NewEmptyStatement(nopos),
 | 
| -                                throw_call,
 | 
| -                                nopos);
 | 
| -  }
 | 
| -
 | 
| -  // let handler_result = C[Symbol.hasInstance];
 | 
| -  Variable* var_handler_result = scope->NewTemporary(avfactory->empty_string());
 | 
| -  Statement* initialize_handler;
 | 
| -  {
 | 
| -    Expression* hasInstance_symbol_literal =
 | 
| -        factory->NewSymbolLiteral("hasInstance_symbol", RelocInfo::kNoPosition);
 | 
| -    Expression* prop = factory->NewProperty(factory->NewVariableProxy(var_C),
 | 
| -                                            hasInstance_symbol_literal, pos);
 | 
| -    Expression* handler_proxy = factory->NewVariableProxy(var_handler_result);
 | 
| -    Expression* assignment =
 | 
| -        factory->NewAssignment(Token::ASSIGN, handler_proxy, prop, nopos);
 | 
| -    initialize_handler = factory->NewExpressionStatement(assignment, nopos);
 | 
| -  }
 | 
| -
 | 
| -  // if (handler_result === undefined) {
 | 
| -  //   if (!IS_CALLABLE(C)) {
 | 
| -  //     throw MakeTypeError(kCalledNonCallableInstanceOf);
 | 
| -  //   }
 | 
| -  //   handler_result = %_GetOrdinaryHasInstance()
 | 
| -  //   handler_result = %_Call(handler_result, C, O);
 | 
| -  // } else {
 | 
| -  //   handler_result = !!%_Call(handler_result, C, O);
 | 
| -  // }
 | 
| -  Statement* call_handler;
 | 
| -  {
 | 
| -    Expression* condition = factory->NewCompareOperation(
 | 
| -        Token::EQ_STRICT, factory->NewVariableProxy(var_handler_result),
 | 
| -        factory->NewUndefinedLiteral(nopos), nopos);
 | 
| -
 | 
| -    Block* then_side = factory->NewBlock(nullptr, 3, false, nopos);
 | 
| -    {
 | 
| -      Expression* throw_expr =
 | 
| -          NewThrowTypeError(MessageTemplate::kCalledNonCallableInstanceOf,
 | 
| -                            avfactory->empty_string(), pos);
 | 
| -      Statement* validate_C = CheckCallable(var_C, throw_expr, pos);
 | 
| -
 | 
| -      ZoneList<Expression*>* empty_args =
 | 
| -          new (zone) ZoneList<Expression*>(0, zone);
 | 
| -      Expression* ordinary_has_instance = factory->NewCallRuntime(
 | 
| -          Runtime::kInlineGetOrdinaryHasInstance, empty_args, pos);
 | 
| -      Expression* handler_proxy = factory->NewVariableProxy(var_handler_result);
 | 
| -      Expression* assignment_handler = factory->NewAssignment(
 | 
| -          Token::ASSIGN, handler_proxy, ordinary_has_instance, nopos);
 | 
| -      Statement* assignment_get_handler =
 | 
| -          factory->NewExpressionStatement(assignment_handler, nopos);
 | 
| -
 | 
| -      ZoneList<Expression*>* args = new (zone) ZoneList<Expression*>(3, zone);
 | 
| -      args->Add(factory->NewVariableProxy(var_handler_result), zone);
 | 
| -      args->Add(factory->NewVariableProxy(var_C), zone);
 | 
| -      args->Add(factory->NewVariableProxy(var_O), zone);
 | 
| -      Expression* call =
 | 
| -          factory->NewCallRuntime(Runtime::kInlineCall, args, pos);
 | 
| -      Expression* result_proxy = factory->NewVariableProxy(var_handler_result);
 | 
| -      Expression* assignment =
 | 
| -          factory->NewAssignment(Token::ASSIGN, result_proxy, call, nopos);
 | 
| -      Statement* assignment_return =
 | 
| -          factory->NewExpressionStatement(assignment, nopos);
 | 
| -
 | 
| -      then_side->statements()->Add(validate_C, zone);
 | 
| -      then_side->statements()->Add(assignment_get_handler, zone);
 | 
| -      then_side->statements()->Add(assignment_return, zone);
 | 
| -    }
 | 
| -
 | 
| -    Statement* else_side;
 | 
| -    {
 | 
| -      auto args = new (zone) ZoneList<Expression*>(3, zone);
 | 
| -      args->Add(factory->NewVariableProxy(var_handler_result), zone);
 | 
| -      args->Add(factory->NewVariableProxy(var_C), zone);
 | 
| -      args->Add(factory->NewVariableProxy(var_O), zone);
 | 
| -      Expression* call =
 | 
| -          factory->NewCallRuntime(Runtime::kInlineCall, args, nopos);
 | 
| -      Expression* inner_not =
 | 
| -          factory->NewUnaryOperation(Token::NOT, call, nopos);
 | 
| -      Expression* outer_not =
 | 
| -          factory->NewUnaryOperation(Token::NOT, inner_not, nopos);
 | 
| -      Expression* result_proxy = factory->NewVariableProxy(var_handler_result);
 | 
| -      Expression* assignment =
 | 
| -          factory->NewAssignment(Token::ASSIGN, result_proxy, outer_not, nopos);
 | 
| -
 | 
| -      else_side = factory->NewExpressionStatement(assignment, nopos);
 | 
| -    }
 | 
| -    call_handler =
 | 
| -        factory->NewIfStatement(condition, then_side, else_side, nopos);
 | 
| -  }
 | 
| -
 | 
| -  // do { ... }
 | 
| -  DoExpression* instanceof;
 | 
| -  {
 | 
| -    Block* block = factory->NewBlock(nullptr, 5, true, nopos);
 | 
| -    block->statements()->Add(get_O, zone);
 | 
| -    block->statements()->Add(get_C, zone);
 | 
| -    block->statements()->Add(validate_C, zone);
 | 
| -    block->statements()->Add(initialize_handler, zone);
 | 
| -    block->statements()->Add(call_handler, zone);
 | 
| -
 | 
| -    // Here is the desugared instanceof.
 | 
| -    instanceof = factory->NewDoExpression(block, var_handler_result, nopos);
 | 
| -    Rewriter::Rewrite(parser_, instanceof, avfactory);
 | 
| -  }
 | 
| -
 | 
| -  return instanceof;
 | 
| -}
 | 
| -
 | 
|  Statement* ParserTraits::CheckCallable(Variable* var, Expression* error,
 | 
|                                         int pos) {
 | 
|    auto factory = parser_->factory();
 | 
| 
 |