| OLD | NEW | 
|     1 // Copyright 2012 the V8 project authors. All rights reserved. |     1 // Copyright 2012 the V8 project authors. All rights reserved. | 
|     2 // Use of this source code is governed by a BSD-style license that can be |     2 // Use of this source code is governed by a BSD-style license that can be | 
|     3 // found in the LICENSE file. |     3 // found in the LICENSE file. | 
|     4  |     4  | 
|     5 #include "src/parsing/parser.h" |     5 #include "src/parsing/parser.h" | 
|     6  |     6  | 
|     7 #include "src/api.h" |     7 #include "src/api.h" | 
|     8 #include "src/ast/ast.h" |     8 #include "src/ast/ast.h" | 
|     9 #include "src/ast/ast-expression-rewriter.h" |     9 #include "src/ast/ast-expression-rewriter.h" | 
|    10 #include "src/ast/ast-expression-visitor.h" |    10 #include "src/ast/ast-expression-visitor.h" | 
| (...skipping 6085 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  6096 // |  6096 // | 
|  6097 //   do { |  6097 //   do { | 
|  6098 //     let O = lhs; |  6098 //     let O = lhs; | 
|  6099 //     let C = rhs; |  6099 //     let C = rhs; | 
|  6100 //     if (!IS_RECEIVER(C)) throw MakeTypeError(kNonObjectInInstanceOfCheck); |  6100 //     if (!IS_RECEIVER(C)) throw MakeTypeError(kNonObjectInInstanceOfCheck); | 
|  6101 //     let handler_result = C[Symbol.hasInstance]; |  6101 //     let handler_result = C[Symbol.hasInstance]; | 
|  6102 //     if (handler_result === undefined) { |  6102 //     if (handler_result === undefined) { | 
|  6103 //       if (!IS_CALLABLE(C)) { |  6103 //       if (!IS_CALLABLE(C)) { | 
|  6104 //         throw MakeTypeError(kCalledNonCallableInstanceOf); |  6104 //         throw MakeTypeError(kCalledNonCallableInstanceOf); | 
|  6105 //       } |  6105 //       } | 
|  6106 //       handler_result = %ordinary_has_instance(C, O); |  6106 //       handler_result = %_GetOrdinaryHasInstance() | 
 |  6107 //       handler_result = %_Call(handler_result, C, O); | 
|  6107 //     } else { |  6108 //     } else { | 
|  6108 //       handler_result = !!(%_Call(handler_result, C, O)); |  6109 //       handler_result = !!(%_Call(handler_result, C, O)); | 
|  6109 //     } |  6110 //     } | 
|  6110 //     handler_result; |  6111 //     handler_result; | 
|  6111 //   } |  6112 //   } | 
|  6112 // |  6113 // | 
|  6113 Expression* ParserTraits::RewriteInstanceof(Expression* lhs, Expression* rhs, |  6114 Expression* ParserTraits::RewriteInstanceof(Expression* lhs, Expression* rhs, | 
|  6114                                             int pos) { |  6115                                             int pos) { | 
|  6115   const int nopos = RelocInfo::kNoPosition; |  6116   const int nopos = RelocInfo::kNoPosition; | 
|  6116  |  6117  | 
| (...skipping 24 matching lines...) Expand all  Loading... | 
|  6141  |  6142  | 
|  6142   // if (!IS_RECEIVER(C)) throw MakeTypeError(kNonObjectInInstanceOfCheck); |  6143   // if (!IS_RECEIVER(C)) throw MakeTypeError(kNonObjectInInstanceOfCheck); | 
|  6143   Statement* validate_C; |  6144   Statement* validate_C; | 
|  6144   { |  6145   { | 
|  6145     auto args = new (zone) ZoneList<Expression*>(1, zone); |  6146     auto args = new (zone) ZoneList<Expression*>(1, zone); | 
|  6146     args->Add(factory->NewVariableProxy(var_C), zone); |  6147     args->Add(factory->NewVariableProxy(var_C), zone); | 
|  6147     Expression* is_receiver_call = |  6148     Expression* is_receiver_call = | 
|  6148         factory->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos); |  6149         factory->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos); | 
|  6149     Expression* call = |  6150     Expression* call = | 
|  6150         NewThrowTypeError(MessageTemplate::kNonObjectInInstanceOfCheck, |  6151         NewThrowTypeError(MessageTemplate::kNonObjectInInstanceOfCheck, | 
|  6151                           avfactory->empty_string(), nopos); |  6152                           avfactory->empty_string(), pos); | 
|  6152     Statement* throw_call = factory->NewExpressionStatement(call, nopos); |  6153     Statement* throw_call = factory->NewExpressionStatement(call, nopos); | 
|  6153  |  6154  | 
|  6154     validate_C = |  6155     validate_C = | 
|  6155         factory->NewIfStatement(is_receiver_call, |  6156         factory->NewIfStatement(is_receiver_call, | 
|  6156                                 factory->NewEmptyStatement(nopos), |  6157                                 factory->NewEmptyStatement(nopos), | 
|  6157                                 throw_call, |  6158                                 throw_call, | 
|  6158                                 nopos); |  6159                                 nopos); | 
|  6159   } |  6160   } | 
|  6160  |  6161  | 
|  6161   // let handler_result = C[Symbol.hasInstance]; |  6162   // let handler_result = C[Symbol.hasInstance]; | 
|  6162   Variable* var_handler_result = scope->NewTemporary(avfactory->empty_string()); |  6163   Variable* var_handler_result = scope->NewTemporary(avfactory->empty_string()); | 
|  6163   Statement* initialize_handler; |  6164   Statement* initialize_handler; | 
|  6164   { |  6165   { | 
|  6165     Expression* hasInstance_symbol_literal = |  6166     Expression* hasInstance_symbol_literal = | 
|  6166         factory->NewSymbolLiteral("hasInstance_symbol", RelocInfo::kNoPosition); |  6167         factory->NewSymbolLiteral("hasInstance_symbol", RelocInfo::kNoPosition); | 
|  6167     Expression* prop = factory->NewProperty(factory->NewVariableProxy(var_C), |  6168     Expression* prop = factory->NewProperty(factory->NewVariableProxy(var_C), | 
|  6168                                             hasInstance_symbol_literal, pos); |  6169                                             hasInstance_symbol_literal, pos); | 
|  6169     Expression* handler_proxy = factory->NewVariableProxy(var_handler_result); |  6170     Expression* handler_proxy = factory->NewVariableProxy(var_handler_result); | 
|  6170     Expression* assignment = |  6171     Expression* assignment = | 
|  6171         factory->NewAssignment(Token::ASSIGN, handler_proxy, prop, nopos); |  6172         factory->NewAssignment(Token::ASSIGN, handler_proxy, prop, nopos); | 
|  6172     initialize_handler = factory->NewExpressionStatement(assignment, nopos); |  6173     initialize_handler = factory->NewExpressionStatement(assignment, nopos); | 
|  6173   } |  6174   } | 
|  6174  |  6175  | 
|  6175   // if (handler_result === undefined) { |  6176   // if (handler_result === undefined) { | 
|  6176   //   if (!IS_CALLABLE(C)) { |  6177   //   if (!IS_CALLABLE(C)) { | 
|  6177   //     throw MakeTypeError(kCalledNonCallableInstanceOf); |  6178   //     throw MakeTypeError(kCalledNonCallableInstanceOf); | 
|  6178   //   } |  6179   //   } | 
|  6179   //   result = %ordinary_has_instance(C, O); |  6180   //   handler_result = %_GetOrdinaryHasInstance() | 
 |  6181   //   handler_result = %_Call(handler_result, C, O); | 
|  6180   // } else { |  6182   // } else { | 
|  6181   //   handler_result = !!%_Call(handler_result, C, O); |  6183   //   handler_result = !!%_Call(handler_result, C, O); | 
|  6182   // } |  6184   // } | 
|  6183   Statement* call_handler; |  6185   Statement* call_handler; | 
|  6184   { |  6186   { | 
|  6185     Expression* condition = factory->NewCompareOperation( |  6187     Expression* condition = factory->NewCompareOperation( | 
|  6186         Token::EQ_STRICT, factory->NewVariableProxy(var_handler_result), |  6188         Token::EQ_STRICT, factory->NewVariableProxy(var_handler_result), | 
|  6187         factory->NewUndefinedLiteral(nopos), nopos); |  6189         factory->NewUndefinedLiteral(nopos), nopos); | 
|  6188  |  6190  | 
|  6189     Block* then_side = factory->NewBlock(nullptr, 2, false, nopos); |  6191     Block* then_side = factory->NewBlock(nullptr, 3, false, nopos); | 
|  6190     { |  6192     { | 
|  6191       Expression* throw_expr = |  6193       Expression* throw_expr = | 
|  6192           NewThrowTypeError(MessageTemplate::kCalledNonCallableInstanceOf, |  6194           NewThrowTypeError(MessageTemplate::kCalledNonCallableInstanceOf, | 
|  6193                             avfactory->empty_string(), nopos); |  6195                             avfactory->empty_string(), pos); | 
|  6194       Statement* validate_C = CheckCallable(var_C, throw_expr); |  6196       Statement* validate_C = CheckCallable(var_C, throw_expr); | 
|  6195       ZoneList<Expression*>* args = new (zone) ZoneList<Expression*>(2, zone); |  6197  | 
 |  6198       ZoneList<Expression*>* empty_args = | 
 |  6199           new (zone) ZoneList<Expression*>(0, zone); | 
 |  6200       Expression* ordinary_has_instance = factory->NewCallRuntime( | 
 |  6201           Runtime::kInlineGetOrdinaryHasInstance, empty_args, pos); | 
 |  6202       Expression* handler_proxy = factory->NewVariableProxy(var_handler_result); | 
 |  6203       Expression* assignment_handler = factory->NewAssignment( | 
 |  6204           Token::ASSIGN, handler_proxy, ordinary_has_instance, nopos); | 
 |  6205       Statement* assignment_get_handler = | 
 |  6206           factory->NewExpressionStatement(assignment_handler, nopos); | 
 |  6207  | 
 |  6208       ZoneList<Expression*>* args = new (zone) ZoneList<Expression*>(3, zone); | 
 |  6209       args->Add(factory->NewVariableProxy(var_handler_result), zone); | 
|  6196       args->Add(factory->NewVariableProxy(var_C), zone); |  6210       args->Add(factory->NewVariableProxy(var_C), zone); | 
|  6197       args->Add(factory->NewVariableProxy(var_O), zone); |  6211       args->Add(factory->NewVariableProxy(var_O), zone); | 
|  6198       CallRuntime* call = factory->NewCallRuntime( |  6212       Expression* call = | 
|  6199           Context::ORDINARY_HAS_INSTANCE_INDEX, args, pos); |  6213           factory->NewCallRuntime(Runtime::kInlineCall, args, pos); | 
|  6200       Expression* result_proxy = factory->NewVariableProxy(var_handler_result); |  6214       Expression* result_proxy = factory->NewVariableProxy(var_handler_result); | 
|  6201       Expression* assignment = |  6215       Expression* assignment = | 
|  6202           factory->NewAssignment(Token::ASSIGN, result_proxy, call, nopos); |  6216           factory->NewAssignment(Token::ASSIGN, result_proxy, call, nopos); | 
|  6203       Statement* assignment_return = |  6217       Statement* assignment_return = | 
|  6204           factory->NewExpressionStatement(assignment, nopos); |  6218           factory->NewExpressionStatement(assignment, nopos); | 
|  6205  |  6219  | 
|  6206       then_side->statements()->Add(validate_C, zone); |  6220       then_side->statements()->Add(validate_C, zone); | 
 |  6221       then_side->statements()->Add(assignment_get_handler, zone); | 
|  6207       then_side->statements()->Add(assignment_return, zone); |  6222       then_side->statements()->Add(assignment_return, zone); | 
|  6208     } |  6223     } | 
|  6209  |  6224  | 
|  6210     Statement* else_side; |  6225     Statement* else_side; | 
|  6211     { |  6226     { | 
|  6212       auto args = new (zone) ZoneList<Expression*>(3, zone); |  6227       auto args = new (zone) ZoneList<Expression*>(3, zone); | 
|  6213       args->Add(factory->NewVariableProxy(var_handler_result), zone); |  6228       args->Add(factory->NewVariableProxy(var_handler_result), zone); | 
|  6214       args->Add(factory->NewVariableProxy(var_C), zone); |  6229       args->Add(factory->NewVariableProxy(var_C), zone); | 
|  6215       args->Add(factory->NewVariableProxy(var_O), zone); |  6230       args->Add(factory->NewVariableProxy(var_O), zone); | 
|  6216       Expression* call = |  6231       Expression* call = | 
| (...skipping 565 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  6782                         try_block, target); |  6797                         try_block, target); | 
|  6783     final_loop = target; |  6798     final_loop = target; | 
|  6784   } |  6799   } | 
|  6785  |  6800  | 
|  6786   return final_loop; |  6801   return final_loop; | 
|  6787 } |  6802 } | 
|  6788  |  6803  | 
|  6789  |  6804  | 
|  6790 }  // namespace internal |  6805 }  // namespace internal | 
|  6791 }  // namespace v8 |  6806 }  // namespace v8 | 
| OLD | NEW |