| 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 6132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6143 // if (!IS_RECEIVER(C)) throw MakeTypeError(kNonObjectInInstanceOfCheck); | 6143 // if (!IS_RECEIVER(C)) throw MakeTypeError(kNonObjectInInstanceOfCheck); |
| 6144 Statement* validate_C; | 6144 Statement* validate_C; |
| 6145 { | 6145 { |
| 6146 auto args = new (zone) ZoneList<Expression*>(1, zone); | 6146 auto args = new (zone) ZoneList<Expression*>(1, zone); |
| 6147 args->Add(factory->NewVariableProxy(var_C), zone); | 6147 args->Add(factory->NewVariableProxy(var_C), zone); |
| 6148 Expression* is_receiver_call = | 6148 Expression* is_receiver_call = |
| 6149 factory->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos); | 6149 factory->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos); |
| 6150 Expression* call = | 6150 Expression* call = |
| 6151 NewThrowTypeError(MessageTemplate::kNonObjectInInstanceOfCheck, | 6151 NewThrowTypeError(MessageTemplate::kNonObjectInInstanceOfCheck, |
| 6152 avfactory->empty_string(), pos); | 6152 avfactory->empty_string(), pos); |
| 6153 Statement* throw_call = factory->NewExpressionStatement(call, nopos); | 6153 Statement* throw_call = factory->NewExpressionStatement(call, pos); |
| 6154 | 6154 |
| 6155 validate_C = | 6155 validate_C = |
| 6156 factory->NewIfStatement(is_receiver_call, | 6156 factory->NewIfStatement(is_receiver_call, |
| 6157 factory->NewEmptyStatement(nopos), | 6157 factory->NewEmptyStatement(nopos), |
| 6158 throw_call, | 6158 throw_call, |
| 6159 nopos); | 6159 nopos); |
| 6160 } | 6160 } |
| 6161 | 6161 |
| 6162 // let handler_result = C[Symbol.hasInstance]; | 6162 // let handler_result = C[Symbol.hasInstance]; |
| 6163 Variable* var_handler_result = scope->NewTemporary(avfactory->empty_string()); | 6163 Variable* var_handler_result = scope->NewTemporary(avfactory->empty_string()); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 6186 { | 6186 { |
| 6187 Expression* condition = factory->NewCompareOperation( | 6187 Expression* condition = factory->NewCompareOperation( |
| 6188 Token::EQ_STRICT, factory->NewVariableProxy(var_handler_result), | 6188 Token::EQ_STRICT, factory->NewVariableProxy(var_handler_result), |
| 6189 factory->NewUndefinedLiteral(nopos), nopos); | 6189 factory->NewUndefinedLiteral(nopos), nopos); |
| 6190 | 6190 |
| 6191 Block* then_side = factory->NewBlock(nullptr, 3, false, nopos); | 6191 Block* then_side = factory->NewBlock(nullptr, 3, false, nopos); |
| 6192 { | 6192 { |
| 6193 Expression* throw_expr = | 6193 Expression* throw_expr = |
| 6194 NewThrowTypeError(MessageTemplate::kCalledNonCallableInstanceOf, | 6194 NewThrowTypeError(MessageTemplate::kCalledNonCallableInstanceOf, |
| 6195 avfactory->empty_string(), pos); | 6195 avfactory->empty_string(), pos); |
| 6196 Statement* validate_C = CheckCallable(var_C, throw_expr); | 6196 Statement* validate_C = CheckCallable(var_C, throw_expr, pos); |
| 6197 | 6197 |
| 6198 ZoneList<Expression*>* empty_args = | 6198 ZoneList<Expression*>* empty_args = |
| 6199 new (zone) ZoneList<Expression*>(0, zone); | 6199 new (zone) ZoneList<Expression*>(0, zone); |
| 6200 Expression* ordinary_has_instance = factory->NewCallRuntime( | 6200 Expression* ordinary_has_instance = factory->NewCallRuntime( |
| 6201 Runtime::kInlineGetOrdinaryHasInstance, empty_args, pos); | 6201 Runtime::kInlineGetOrdinaryHasInstance, empty_args, pos); |
| 6202 Expression* handler_proxy = factory->NewVariableProxy(var_handler_result); | 6202 Expression* handler_proxy = factory->NewVariableProxy(var_handler_result); |
| 6203 Expression* assignment_handler = factory->NewAssignment( | 6203 Expression* assignment_handler = factory->NewAssignment( |
| 6204 Token::ASSIGN, handler_proxy, ordinary_has_instance, nopos); | 6204 Token::ASSIGN, handler_proxy, ordinary_has_instance, nopos); |
| 6205 Statement* assignment_get_handler = | 6205 Statement* assignment_get_handler = |
| 6206 factory->NewExpressionStatement(assignment_handler, nopos); | 6206 factory->NewExpressionStatement(assignment_handler, nopos); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6255 block->statements()->Add(call_handler, zone); | 6255 block->statements()->Add(call_handler, zone); |
| 6256 | 6256 |
| 6257 // Here is the desugared instanceof. | 6257 // Here is the desugared instanceof. |
| 6258 instanceof = factory->NewDoExpression(block, var_handler_result, nopos); | 6258 instanceof = factory->NewDoExpression(block, var_handler_result, nopos); |
| 6259 Rewriter::Rewrite(parser_, instanceof, avfactory); | 6259 Rewriter::Rewrite(parser_, instanceof, avfactory); |
| 6260 } | 6260 } |
| 6261 | 6261 |
| 6262 return instanceof; | 6262 return instanceof; |
| 6263 } | 6263 } |
| 6264 | 6264 |
| 6265 Statement* ParserTraits::CheckCallable(Variable* var, Expression* error) { | 6265 Statement* ParserTraits::CheckCallable(Variable* var, Expression* error, |
| 6266 int pos) { |
| 6266 auto factory = parser_->factory(); | 6267 auto factory = parser_->factory(); |
| 6267 auto avfactory = parser_->ast_value_factory(); | 6268 auto avfactory = parser_->ast_value_factory(); |
| 6268 const int nopos = RelocInfo::kNoPosition; | 6269 const int nopos = RelocInfo::kNoPosition; |
| 6269 Statement* validate_var; | 6270 Statement* validate_var; |
| 6270 { | 6271 { |
| 6271 Expression* type_of = factory->NewUnaryOperation( | 6272 Expression* type_of = factory->NewUnaryOperation( |
| 6272 Token::TYPEOF, factory->NewVariableProxy(var), nopos); | 6273 Token::TYPEOF, factory->NewVariableProxy(var), nopos); |
| 6273 Expression* function_literal = | 6274 Expression* function_literal = |
| 6274 factory->NewStringLiteral(avfactory->function_string(), nopos); | 6275 factory->NewStringLiteral(avfactory->function_string(), nopos); |
| 6275 Expression* condition = factory->NewCompareOperation( | 6276 Expression* condition = factory->NewCompareOperation( |
| 6276 Token::EQ_STRICT, type_of, function_literal, nopos); | 6277 Token::EQ_STRICT, type_of, function_literal, nopos); |
| 6277 | 6278 |
| 6278 Statement* throw_call = factory->NewExpressionStatement(error, nopos); | 6279 Statement* throw_call = factory->NewExpressionStatement(error, pos); |
| 6279 | 6280 |
| 6280 validate_var = factory->NewIfStatement( | 6281 validate_var = factory->NewIfStatement( |
| 6281 condition, factory->NewEmptyStatement(nopos), throw_call, nopos); | 6282 condition, factory->NewEmptyStatement(nopos), throw_call, nopos); |
| 6282 } | 6283 } |
| 6283 return validate_var; | 6284 return validate_var; |
| 6284 } | 6285 } |
| 6285 | 6286 |
| 6286 void ParserTraits::BuildIteratorClose(ZoneList<Statement*>* statements, | 6287 void ParserTraits::BuildIteratorClose(ZoneList<Statement*>* statements, |
| 6287 Variable* iterator, | 6288 Variable* iterator, |
| 6288 Maybe<Variable*> input, | 6289 Maybe<Variable*> input, |
| (...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6547 } | 6548 } |
| 6548 | 6549 |
| 6549 // if (!IS_CALLABLE(iteratorReturn)) { | 6550 // if (!IS_CALLABLE(iteratorReturn)) { |
| 6550 // throw MakeTypeError(kReturnMethodNotCallable); | 6551 // throw MakeTypeError(kReturnMethodNotCallable); |
| 6551 // } | 6552 // } |
| 6552 Statement* check_return_callable; | 6553 Statement* check_return_callable; |
| 6553 { | 6554 { |
| 6554 Expression* throw_expr = NewThrowTypeError( | 6555 Expression* throw_expr = NewThrowTypeError( |
| 6555 MessageTemplate::kReturnMethodNotCallable, | 6556 MessageTemplate::kReturnMethodNotCallable, |
| 6556 avfactory->empty_string(), nopos); | 6557 avfactory->empty_string(), nopos); |
| 6557 check_return_callable = CheckCallable(var_return, throw_expr); | 6558 check_return_callable = CheckCallable(var_return, throw_expr, nopos); |
| 6558 } | 6559 } |
| 6559 | 6560 |
| 6560 // try { %_Call(iteratorReturn, iterator) } catch (_) { } | 6561 // try { %_Call(iteratorReturn, iterator) } catch (_) { } |
| 6561 Statement* try_call_return; | 6562 Statement* try_call_return; |
| 6562 { | 6563 { |
| 6563 auto args = new (zone) ZoneList<Expression*>(2, zone); | 6564 auto args = new (zone) ZoneList<Expression*>(2, zone); |
| 6564 args->Add(factory->NewVariableProxy(var_return), zone); | 6565 args->Add(factory->NewVariableProxy(var_return), zone); |
| 6565 args->Add(factory->NewVariableProxy(iterator), zone); | 6566 args->Add(factory->NewVariableProxy(iterator), zone); |
| 6566 | 6567 |
| 6567 Expression* call = | 6568 Expression* call = |
| (...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6797 try_block, target); | 6798 try_block, target); |
| 6798 final_loop = target; | 6799 final_loop = target; |
| 6799 } | 6800 } |
| 6800 | 6801 |
| 6801 return final_loop; | 6802 return final_loop; |
| 6802 } | 6803 } |
| 6803 | 6804 |
| 6804 | 6805 |
| 6805 } // namespace internal | 6806 } // namespace internal |
| 6806 } // namespace v8 | 6807 } // namespace v8 |
| OLD | NEW |