| 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 <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "src/api.h" | 9 #include "src/api.h" |
| 10 #include "src/ast/ast.h" | 10 #include "src/ast/ast.h" |
| (...skipping 2723 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2734 // for a non object. | 2734 // for a non object. |
| 2735 // | 2735 // |
| 2736 // return expr; | 2736 // return expr; |
| 2737 // | 2737 // |
| 2738 // Is rewritten as: | 2738 // Is rewritten as: |
| 2739 // | 2739 // |
| 2740 // return (temp = expr) === undefined ? this : | 2740 // return (temp = expr) === undefined ? this : |
| 2741 // %_IsJSReceiver(temp) ? temp : 1; | 2741 // %_IsJSReceiver(temp) ? temp : 1; |
| 2742 | 2742 |
| 2743 // temp = expr | 2743 // temp = expr |
| 2744 Variable* temp = | 2744 Variable* temp = NewTemporary(ast_value_factory()->empty_string()); |
| 2745 scope()->NewTemporary(ast_value_factory()->empty_string()); | |
| 2746 Assignment* assign = factory()->NewAssignment( | 2745 Assignment* assign = factory()->NewAssignment( |
| 2747 Token::ASSIGN, factory()->NewVariableProxy(temp), return_value, pos); | 2746 Token::ASSIGN, factory()->NewVariableProxy(temp), return_value, pos); |
| 2748 | 2747 |
| 2749 // %_IsJSReceiver(temp) | 2748 // %_IsJSReceiver(temp) |
| 2750 ZoneList<Expression*>* is_spec_object_args = | 2749 ZoneList<Expression*>* is_spec_object_args = |
| 2751 new (zone()) ZoneList<Expression*>(1, zone()); | 2750 new (zone()) ZoneList<Expression*>(1, zone()); |
| 2752 is_spec_object_args->Add(factory()->NewVariableProxy(temp), zone()); | 2751 is_spec_object_args->Add(factory()->NewVariableProxy(temp), zone()); |
| 2753 Expression* is_spec_object_call = factory()->NewCallRuntime( | 2752 Expression* is_spec_object_call = factory()->NewCallRuntime( |
| 2754 Runtime::kInlineIsJSReceiver, is_spec_object_args, pos); | 2753 Runtime::kInlineIsJSReceiver, is_spec_object_args, pos); |
| 2755 | 2754 |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2877 | 2876 |
| 2878 Block* switch_block = factory()->NewBlock(NULL, 2, false, kNoSourcePosition); | 2877 Block* switch_block = factory()->NewBlock(NULL, 2, false, kNoSourcePosition); |
| 2879 int switch_pos = peek_position(); | 2878 int switch_pos = peek_position(); |
| 2880 | 2879 |
| 2881 Expect(Token::SWITCH, CHECK_OK); | 2880 Expect(Token::SWITCH, CHECK_OK); |
| 2882 Expect(Token::LPAREN, CHECK_OK); | 2881 Expect(Token::LPAREN, CHECK_OK); |
| 2883 Expression* tag = ParseExpression(true, CHECK_OK); | 2882 Expression* tag = ParseExpression(true, CHECK_OK); |
| 2884 Expect(Token::RPAREN, CHECK_OK); | 2883 Expect(Token::RPAREN, CHECK_OK); |
| 2885 | 2884 |
| 2886 Variable* tag_variable = | 2885 Variable* tag_variable = |
| 2887 scope()->NewTemporary(ast_value_factory()->dot_switch_tag_string()); | 2886 NewTemporary(ast_value_factory()->dot_switch_tag_string()); |
| 2888 Assignment* tag_assign = factory()->NewAssignment( | 2887 Assignment* tag_assign = factory()->NewAssignment( |
| 2889 Token::ASSIGN, factory()->NewVariableProxy(tag_variable), tag, | 2888 Token::ASSIGN, factory()->NewVariableProxy(tag_variable), tag, |
| 2890 tag->position()); | 2889 tag->position()); |
| 2891 Statement* tag_statement = | 2890 Statement* tag_statement = |
| 2892 factory()->NewExpressionStatement(tag_assign, kNoSourcePosition); | 2891 factory()->NewExpressionStatement(tag_assign, kNoSourcePosition); |
| 2893 switch_block->statements()->Add(tag_statement, zone()); | 2892 switch_block->statements()->Add(tag_statement, zone()); |
| 2894 | 2893 |
| 2895 // make statement: undefined; | 2894 // make statement: undefined; |
| 2896 // This is needed so the tag isn't returned as the value, in case the switch | 2895 // This is needed so the tag isn't returned as the value, in case the switch |
| 2897 // statements don't have a value. | 2896 // statements don't have a value. |
| (...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3238 Expression* subject, | 3237 Expression* subject, |
| 3239 Statement* body, | 3238 Statement* body, |
| 3240 int each_keyword_pos) { | 3239 int each_keyword_pos) { |
| 3241 ForOfStatement* for_of = stmt->AsForOfStatement(); | 3240 ForOfStatement* for_of = stmt->AsForOfStatement(); |
| 3242 if (for_of != NULL) { | 3241 if (for_of != NULL) { |
| 3243 const bool finalize = true; | 3242 const bool finalize = true; |
| 3244 return InitializeForOfStatement(for_of, each, subject, body, finalize, | 3243 return InitializeForOfStatement(for_of, each, subject, body, finalize, |
| 3245 each_keyword_pos); | 3244 each_keyword_pos); |
| 3246 } else { | 3245 } else { |
| 3247 if (each->IsArrayLiteral() || each->IsObjectLiteral()) { | 3246 if (each->IsArrayLiteral() || each->IsObjectLiteral()) { |
| 3248 Variable* temp = | 3247 Variable* temp = NewTemporary(ast_value_factory()->empty_string()); |
| 3249 scope()->NewTemporary(ast_value_factory()->empty_string()); | |
| 3250 VariableProxy* temp_proxy = factory()->NewVariableProxy(temp); | 3248 VariableProxy* temp_proxy = factory()->NewVariableProxy(temp); |
| 3251 Expression* assign_each = PatternRewriter::RewriteDestructuringAssignment( | 3249 Expression* assign_each = PatternRewriter::RewriteDestructuringAssignment( |
| 3252 this, factory()->NewAssignment(Token::ASSIGN, each, temp_proxy, | 3250 this, factory()->NewAssignment(Token::ASSIGN, each, temp_proxy, |
| 3253 kNoSourcePosition), | 3251 kNoSourcePosition), |
| 3254 scope()); | 3252 scope()); |
| 3255 auto block = factory()->NewBlock(nullptr, 2, false, kNoSourcePosition); | 3253 auto block = factory()->NewBlock(nullptr, 2, false, kNoSourcePosition); |
| 3256 block->statements()->Add( | 3254 block->statements()->Add( |
| 3257 factory()->NewExpressionStatement(assign_each, kNoSourcePosition), | 3255 factory()->NewExpressionStatement(assign_each, kNoSourcePosition), |
| 3258 zone()); | 3256 zone()); |
| 3259 block->statements()->Add(body, zone()); | 3257 block->statements()->Add(body, zone()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 3272 int next_result_pos) { | 3270 int next_result_pos) { |
| 3273 // Create the auxiliary expressions needed for iterating over the iterable, | 3271 // Create the auxiliary expressions needed for iterating over the iterable, |
| 3274 // and initialize the given ForOfStatement with them. | 3272 // and initialize the given ForOfStatement with them. |
| 3275 // If finalize is true, also instrument the loop with code that performs the | 3273 // If finalize is true, also instrument the loop with code that performs the |
| 3276 // proper ES6 iterator finalization. In that case, the result is not | 3274 // proper ES6 iterator finalization. In that case, the result is not |
| 3277 // immediately a ForOfStatement. | 3275 // immediately a ForOfStatement. |
| 3278 | 3276 |
| 3279 const int nopos = kNoSourcePosition; | 3277 const int nopos = kNoSourcePosition; |
| 3280 auto avfactory = ast_value_factory(); | 3278 auto avfactory = ast_value_factory(); |
| 3281 | 3279 |
| 3282 Variable* iterator = | 3280 Variable* iterator = NewTemporary(ast_value_factory()->dot_iterator_string()); |
| 3283 scope()->NewTemporary(ast_value_factory()->dot_iterator_string()); | 3281 Variable* result = NewTemporary(ast_value_factory()->dot_result_string()); |
| 3284 Variable* result = | 3282 Variable* completion = NewTemporary(avfactory->empty_string()); |
| 3285 scope()->NewTemporary(ast_value_factory()->dot_result_string()); | |
| 3286 Variable* completion = scope()->NewTemporary(avfactory->empty_string()); | |
| 3287 | 3283 |
| 3288 // iterator = iterable[Symbol.iterator]() | 3284 // iterator = iterable[Symbol.iterator]() |
| 3289 Expression* assign_iterator; | 3285 Expression* assign_iterator; |
| 3290 { | 3286 { |
| 3291 assign_iterator = factory()->NewAssignment( | 3287 assign_iterator = factory()->NewAssignment( |
| 3292 Token::ASSIGN, factory()->NewVariableProxy(iterator), | 3288 Token::ASSIGN, factory()->NewVariableProxy(iterator), |
| 3293 GetIterator(iterable, factory(), iterable->position()), | 3289 GetIterator(iterable, factory(), iterable->position()), |
| 3294 iterable->position()); | 3290 iterable->position()); |
| 3295 } | 3291 } |
| 3296 | 3292 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3332 | 3328 |
| 3333 Block* block = factory()->NewBlock(nullptr, 1, true, nopos); | 3329 Block* block = factory()->NewBlock(nullptr, 1, true, nopos); |
| 3334 block->statements()->Add( | 3330 block->statements()->Add( |
| 3335 factory()->NewExpressionStatement(assignment, nopos), zone()); | 3331 factory()->NewExpressionStatement(assignment, nopos), zone()); |
| 3336 set_completion_abrupt = block; | 3332 set_completion_abrupt = block; |
| 3337 } | 3333 } |
| 3338 | 3334 |
| 3339 // do { let tmp = #result_value; #set_completion_abrupt; tmp } | 3335 // do { let tmp = #result_value; #set_completion_abrupt; tmp } |
| 3340 // Expression* result_value (gets overwritten) | 3336 // Expression* result_value (gets overwritten) |
| 3341 if (finalize) { | 3337 if (finalize) { |
| 3342 Variable* var_tmp = scope()->NewTemporary(avfactory->empty_string()); | 3338 Variable* var_tmp = NewTemporary(avfactory->empty_string()); |
| 3343 Expression* tmp = factory()->NewVariableProxy(var_tmp); | 3339 Expression* tmp = factory()->NewVariableProxy(var_tmp); |
| 3344 Expression* assignment = | 3340 Expression* assignment = |
| 3345 factory()->NewAssignment(Token::ASSIGN, tmp, result_value, nopos); | 3341 factory()->NewAssignment(Token::ASSIGN, tmp, result_value, nopos); |
| 3346 | 3342 |
| 3347 Block* block = factory()->NewBlock(nullptr, 2, false, nopos); | 3343 Block* block = factory()->NewBlock(nullptr, 2, false, nopos); |
| 3348 block->statements()->Add( | 3344 block->statements()->Add( |
| 3349 factory()->NewExpressionStatement(assignment, nopos), zone()); | 3345 factory()->NewExpressionStatement(assignment, nopos), zone()); |
| 3350 block->statements()->Add(set_completion_abrupt, zone()); | 3346 block->statements()->Add(set_completion_abrupt, zone()); |
| 3351 | 3347 |
| 3352 result_value = factory()->NewDoExpression(block, var_tmp, nopos); | 3348 result_value = factory()->NewDoExpression(block, var_tmp, nopos); |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3442 | 3438 |
| 3443 // Add statement: let/const x = i. | 3439 // Add statement: let/const x = i. |
| 3444 outer_block->statements()->Add(init, zone()); | 3440 outer_block->statements()->Add(init, zone()); |
| 3445 | 3441 |
| 3446 const AstRawString* temp_name = ast_value_factory()->dot_for_string(); | 3442 const AstRawString* temp_name = ast_value_factory()->dot_for_string(); |
| 3447 | 3443 |
| 3448 // For each lexical variable x: | 3444 // For each lexical variable x: |
| 3449 // make statement: temp_x = x. | 3445 // make statement: temp_x = x. |
| 3450 for (int i = 0; i < names->length(); i++) { | 3446 for (int i = 0; i < names->length(); i++) { |
| 3451 VariableProxy* proxy = NewUnresolved(names->at(i), LET); | 3447 VariableProxy* proxy = NewUnresolved(names->at(i), LET); |
| 3452 Variable* temp = scope()->NewTemporary(temp_name); | 3448 Variable* temp = NewTemporary(temp_name); |
| 3453 VariableProxy* temp_proxy = factory()->NewVariableProxy(temp); | 3449 VariableProxy* temp_proxy = factory()->NewVariableProxy(temp); |
| 3454 Assignment* assignment = factory()->NewAssignment(Token::ASSIGN, temp_proxy, | 3450 Assignment* assignment = factory()->NewAssignment(Token::ASSIGN, temp_proxy, |
| 3455 proxy, kNoSourcePosition); | 3451 proxy, kNoSourcePosition); |
| 3456 Statement* assignment_statement = | 3452 Statement* assignment_statement = |
| 3457 factory()->NewExpressionStatement(assignment, kNoSourcePosition); | 3453 factory()->NewExpressionStatement(assignment, kNoSourcePosition); |
| 3458 outer_block->statements()->Add(assignment_statement, zone()); | 3454 outer_block->statements()->Add(assignment_statement, zone()); |
| 3459 temps.Add(temp, zone()); | 3455 temps.Add(temp, zone()); |
| 3460 } | 3456 } |
| 3461 | 3457 |
| 3462 Variable* first = NULL; | 3458 Variable* first = NULL; |
| 3463 // Make statement: first = 1. | 3459 // Make statement: first = 1. |
| 3464 if (next) { | 3460 if (next) { |
| 3465 first = scope()->NewTemporary(temp_name); | 3461 first = NewTemporary(temp_name); |
| 3466 VariableProxy* first_proxy = factory()->NewVariableProxy(first); | 3462 VariableProxy* first_proxy = factory()->NewVariableProxy(first); |
| 3467 Expression* const1 = factory()->NewSmiLiteral(1, kNoSourcePosition); | 3463 Expression* const1 = factory()->NewSmiLiteral(1, kNoSourcePosition); |
| 3468 Assignment* assignment = factory()->NewAssignment( | 3464 Assignment* assignment = factory()->NewAssignment( |
| 3469 Token::ASSIGN, first_proxy, const1, kNoSourcePosition); | 3465 Token::ASSIGN, first_proxy, const1, kNoSourcePosition); |
| 3470 Statement* assignment_statement = | 3466 Statement* assignment_statement = |
| 3471 factory()->NewExpressionStatement(assignment, kNoSourcePosition); | 3467 factory()->NewExpressionStatement(assignment, kNoSourcePosition); |
| 3472 outer_block->statements()->Add(assignment_statement, zone()); | 3468 outer_block->statements()->Add(assignment_statement, zone()); |
| 3473 } | 3469 } |
| 3474 | 3470 |
| 3475 // make statement: undefined; | 3471 // make statement: undefined; |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3530 Assignment* assignment = factory()->NewAssignment( | 3526 Assignment* assignment = factory()->NewAssignment( |
| 3531 Token::ASSIGN, first_proxy, const0, kNoSourcePosition); | 3527 Token::ASSIGN, first_proxy, const0, kNoSourcePosition); |
| 3532 clear_first = | 3528 clear_first = |
| 3533 factory()->NewExpressionStatement(assignment, kNoSourcePosition); | 3529 factory()->NewExpressionStatement(assignment, kNoSourcePosition); |
| 3534 } | 3530 } |
| 3535 Statement* clear_first_or_next = factory()->NewIfStatement( | 3531 Statement* clear_first_or_next = factory()->NewIfStatement( |
| 3536 compare, clear_first, next, kNoSourcePosition); | 3532 compare, clear_first, next, kNoSourcePosition); |
| 3537 ignore_completion_block->statements()->Add(clear_first_or_next, zone()); | 3533 ignore_completion_block->statements()->Add(clear_first_or_next, zone()); |
| 3538 } | 3534 } |
| 3539 | 3535 |
| 3540 Variable* flag = scope()->NewTemporary(temp_name); | 3536 Variable* flag = NewTemporary(temp_name); |
| 3541 // Make statement: flag = 1. | 3537 // Make statement: flag = 1. |
| 3542 { | 3538 { |
| 3543 VariableProxy* flag_proxy = factory()->NewVariableProxy(flag); | 3539 VariableProxy* flag_proxy = factory()->NewVariableProxy(flag); |
| 3544 Expression* const1 = factory()->NewSmiLiteral(1, kNoSourcePosition); | 3540 Expression* const1 = factory()->NewSmiLiteral(1, kNoSourcePosition); |
| 3545 Assignment* assignment = factory()->NewAssignment( | 3541 Assignment* assignment = factory()->NewAssignment( |
| 3546 Token::ASSIGN, flag_proxy, const1, kNoSourcePosition); | 3542 Token::ASSIGN, flag_proxy, const1, kNoSourcePosition); |
| 3547 Statement* assignment_statement = | 3543 Statement* assignment_statement = |
| 3548 factory()->NewExpressionStatement(assignment, kNoSourcePosition); | 3544 factory()->NewExpressionStatement(assignment, kNoSourcePosition); |
| 3549 ignore_completion_block->statements()->Add(assignment_statement, zone()); | 3545 ignore_completion_block->statements()->Add(assignment_statement, zone()); |
| 3550 } | 3546 } |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3739 // { | 3735 // { |
| 3740 // <let x' be a temporary variable> | 3736 // <let x' be a temporary variable> |
| 3741 // for (x' in/of e) { | 3737 // for (x' in/of e) { |
| 3742 // let/const/var x; | 3738 // let/const/var x; |
| 3743 // x = x'; | 3739 // x = x'; |
| 3744 // b; | 3740 // b; |
| 3745 // } | 3741 // } |
| 3746 // let x; // for TDZ | 3742 // let x; // for TDZ |
| 3747 // } | 3743 // } |
| 3748 | 3744 |
| 3749 Variable* temp = | 3745 Variable* temp = NewTemporary(ast_value_factory()->dot_for_string()); |
| 3750 scope()->NewTemporary(ast_value_factory()->dot_for_string()); | |
| 3751 ForEachStatement* loop = | 3746 ForEachStatement* loop = |
| 3752 factory()->NewForEachStatement(mode, labels, stmt_pos); | 3747 factory()->NewForEachStatement(mode, labels, stmt_pos); |
| 3753 Target target(&this->target_stack_, loop); | 3748 Target target(&this->target_stack_, loop); |
| 3754 | 3749 |
| 3755 int each_keyword_position = scanner()->location().beg_pos; | 3750 int each_keyword_position = scanner()->location().beg_pos; |
| 3756 | 3751 |
| 3757 Expression* enumerable; | 3752 Expression* enumerable; |
| 3758 if (mode == ForEachStatement::ITERATE) { | 3753 if (mode == ForEachStatement::ITERATE) { |
| 3759 ExpressionClassifier classifier(this); | 3754 ExpressionClassifier classifier(this); |
| 3760 enumerable = ParseAssignmentExpression(true, &classifier, CHECK_OK); | 3755 enumerable = ParseAssignmentExpression(true, &classifier, CHECK_OK); |
| (...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4132 bool accept_IN, int pos, bool* ok) { | 4127 bool accept_IN, int pos, bool* ok) { |
| 4133 // function async_function() { | 4128 // function async_function() { |
| 4134 // try { | 4129 // try { |
| 4135 // .generator_object = %CreateGeneratorObject(); | 4130 // .generator_object = %CreateGeneratorObject(); |
| 4136 // ... function body ... | 4131 // ... function body ... |
| 4137 // } catch (e) { | 4132 // } catch (e) { |
| 4138 // return Promise.reject(e); | 4133 // return Promise.reject(e); |
| 4139 // } | 4134 // } |
| 4140 // } | 4135 // } |
| 4141 scope->ForceContextAllocation(); | 4136 scope->ForceContextAllocation(); |
| 4142 Variable* temp = this->scope()->NewTemporary( | 4137 Variable* temp = |
| 4143 ast_value_factory()->dot_generator_object_string()); | 4138 NewTemporary(ast_value_factory()->dot_generator_object_string()); |
| 4144 function_state_->set_generator_object_variable(temp); | 4139 function_state_->set_generator_object_variable(temp); |
| 4145 | 4140 |
| 4146 Expression* init_generator_variable = factory()->NewAssignment( | 4141 Expression* init_generator_variable = factory()->NewAssignment( |
| 4147 Token::INIT, factory()->NewVariableProxy(temp), | 4142 Token::INIT, factory()->NewVariableProxy(temp), |
| 4148 BuildCreateJSGeneratorObject(pos, kind), kNoSourcePosition); | 4143 BuildCreateJSGeneratorObject(pos, kind), kNoSourcePosition); |
| 4149 body->Add(factory()->NewExpressionStatement(init_generator_variable, | 4144 body->Add(factory()->NewExpressionStatement(init_generator_variable, |
| 4150 kNoSourcePosition), | 4145 kNoSourcePosition), |
| 4151 zone()); | 4146 zone()); |
| 4152 | 4147 |
| 4153 Block* try_block = factory()->NewBlock(NULL, 8, true, kNoSourcePosition); | 4148 Block* try_block = factory()->NewBlock(NULL, 8, true, kNoSourcePosition); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 4171 body->Add(BuildRejectPromiseOnException(try_block), zone()); | 4166 body->Add(BuildRejectPromiseOnException(try_block), zone()); |
| 4172 scope->set_end_position(scanner()->location().end_pos); | 4167 scope->set_end_position(scanner()->location().end_pos); |
| 4173 } | 4168 } |
| 4174 | 4169 |
| 4175 DoExpression* Parser::ParseDoExpression(bool* ok) { | 4170 DoExpression* Parser::ParseDoExpression(bool* ok) { |
| 4176 // AssignmentExpression :: | 4171 // AssignmentExpression :: |
| 4177 // do '{' StatementList '}' | 4172 // do '{' StatementList '}' |
| 4178 int pos = peek_position(); | 4173 int pos = peek_position(); |
| 4179 | 4174 |
| 4180 Expect(Token::DO, CHECK_OK); | 4175 Expect(Token::DO, CHECK_OK); |
| 4181 Variable* result = | 4176 Variable* result = NewTemporary(ast_value_factory()->dot_result_string()); |
| 4182 scope()->NewTemporary(ast_value_factory()->dot_result_string()); | |
| 4183 Block* block = ParseBlock(nullptr, CHECK_OK); | 4177 Block* block = ParseBlock(nullptr, CHECK_OK); |
| 4184 DoExpression* expr = factory()->NewDoExpression(block, result, pos); | 4178 DoExpression* expr = factory()->NewDoExpression(block, result, pos); |
| 4185 if (!Rewriter::Rewrite(this, GetClosureScope(), expr, ast_value_factory())) { | 4179 if (!Rewriter::Rewrite(this, GetClosureScope(), expr, ast_value_factory())) { |
| 4186 *ok = false; | 4180 *ok = false; |
| 4187 return nullptr; | 4181 return nullptr; |
| 4188 } | 4182 } |
| 4189 return expr; | 4183 return expr; |
| 4190 } | 4184 } |
| 4191 | 4185 |
| 4192 void ParserTraits::ParseArrowFunctionFormalParameterList( | 4186 void ParserTraits::ParseArrowFunctionFormalParameterList( |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4375 if (is_generator) { | 4369 if (is_generator) { |
| 4376 // For generators, allocating variables in contexts is currently a win | 4370 // For generators, allocating variables in contexts is currently a win |
| 4377 // because it minimizes the work needed to suspend and resume an | 4371 // because it minimizes the work needed to suspend and resume an |
| 4378 // activation. The machine code produced for generators (by full-codegen) | 4372 // activation. The machine code produced for generators (by full-codegen) |
| 4379 // relies on this forced context allocation, but not in an essential way. | 4373 // relies on this forced context allocation, but not in an essential way. |
| 4380 this->scope()->ForceContextAllocation(); | 4374 this->scope()->ForceContextAllocation(); |
| 4381 | 4375 |
| 4382 // Calling a generator returns a generator object. That object is stored | 4376 // Calling a generator returns a generator object. That object is stored |
| 4383 // in a temporary variable, a definition that is used by "yield" | 4377 // in a temporary variable, a definition that is used by "yield" |
| 4384 // expressions. This also marks the FunctionState as a generator. | 4378 // expressions. This also marks the FunctionState as a generator. |
| 4385 Variable* temp = this->scope()->NewTemporary( | 4379 Variable* temp = |
| 4386 ast_value_factory()->dot_generator_object_string()); | 4380 NewTemporary(ast_value_factory()->dot_generator_object_string()); |
| 4387 function_state.set_generator_object_variable(temp); | 4381 function_state.set_generator_object_variable(temp); |
| 4388 } | 4382 } |
| 4389 | 4383 |
| 4390 Expect(Token::LPAREN, CHECK_OK); | 4384 Expect(Token::LPAREN, CHECK_OK); |
| 4391 int start_position = scanner()->location().beg_pos; | 4385 int start_position = scanner()->location().beg_pos; |
| 4392 this->scope()->set_start_position(start_position); | 4386 this->scope()->set_start_position(start_position); |
| 4393 ParserFormalParameters formals(scope); | 4387 ParserFormalParameters formals(scope); |
| 4394 ParseFormalParameterList(&formals, &formals_classifier, CHECK_OK); | 4388 ParseFormalParameterList(&formals, &formals_classifier, CHECK_OK); |
| 4395 arity = formals.Arity(); | 4389 arity = formals.Arity(); |
| 4396 Expect(Token::RPAREN, CHECK_OK); | 4390 Expect(Token::RPAREN, CHECK_OK); |
| (...skipping 701 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5098 // Note that we do not finalize this block scope because it is | 5092 // Note that we do not finalize this block scope because it is |
| 5099 // used as a sentinel value indicating an anonymous class. | 5093 // used as a sentinel value indicating an anonymous class. |
| 5100 block_state.set_end_position(end_pos); | 5094 block_state.set_end_position(end_pos); |
| 5101 | 5095 |
| 5102 if (name != nullptr) { | 5096 if (name != nullptr) { |
| 5103 DCHECK_NOT_NULL(proxy); | 5097 DCHECK_NOT_NULL(proxy); |
| 5104 proxy->var()->set_initializer_position(end_pos); | 5098 proxy->var()->set_initializer_position(end_pos); |
| 5105 } | 5099 } |
| 5106 | 5100 |
| 5107 Block* do_block = factory()->NewBlock(nullptr, 1, false, pos); | 5101 Block* do_block = factory()->NewBlock(nullptr, 1, false, pos); |
| 5108 Variable* result_var = | 5102 Variable* result_var = NewTemporary(ast_value_factory()->empty_string()); |
| 5109 scope()->NewTemporary(ast_value_factory()->empty_string()); | |
| 5110 do_block->set_scope(block_state.FinalizedBlockScope()); | 5103 do_block->set_scope(block_state.FinalizedBlockScope()); |
| 5111 DoExpression* do_expr = factory()->NewDoExpression(do_block, result_var, pos); | 5104 DoExpression* do_expr = factory()->NewDoExpression(do_block, result_var, pos); |
| 5112 | 5105 |
| 5113 ClassLiteral* class_literal = factory()->NewClassLiteral( | 5106 ClassLiteral* class_literal = factory()->NewClassLiteral( |
| 5114 proxy, extends, constructor, properties, pos, end_pos); | 5107 proxy, extends, constructor, properties, pos, end_pos); |
| 5115 | 5108 |
| 5116 do_block->statements()->Add( | 5109 do_block->statements()->Add( |
| 5117 factory()->NewExpressionStatement(class_literal, pos), zone()); | 5110 factory()->NewExpressionStatement(class_literal, pos), zone()); |
| 5118 do_expr->set_represented_function(constructor); | 5111 do_expr->set_represented_function(constructor); |
| 5119 Rewriter::Rewrite(this, GetClosureScope(), do_expr, ast_value_factory()); | 5112 Rewriter::Rewrite(this, GetClosureScope(), do_expr, ast_value_factory()); |
| (...skipping 584 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5704 return factory()->NewCallRuntime(Context::REFLECT_CONSTRUCT_INDEX, args, | 5697 return factory()->NewCallRuntime(Context::REFLECT_CONSTRUCT_INDEX, args, |
| 5705 pos); | 5698 pos); |
| 5706 } else { | 5699 } else { |
| 5707 if (function->IsProperty()) { | 5700 if (function->IsProperty()) { |
| 5708 // Method calls | 5701 // Method calls |
| 5709 if (function->AsProperty()->IsSuperAccess()) { | 5702 if (function->AsProperty()->IsSuperAccess()) { |
| 5710 Expression* home = ThisExpression(factory(), kNoSourcePosition); | 5703 Expression* home = ThisExpression(factory(), kNoSourcePosition); |
| 5711 args->InsertAt(0, function, zone()); | 5704 args->InsertAt(0, function, zone()); |
| 5712 args->InsertAt(1, home, zone()); | 5705 args->InsertAt(1, home, zone()); |
| 5713 } else { | 5706 } else { |
| 5714 Variable* temp = | 5707 Variable* temp = NewTemporary(ast_value_factory()->empty_string()); |
| 5715 scope()->NewTemporary(ast_value_factory()->empty_string()); | |
| 5716 VariableProxy* obj = factory()->NewVariableProxy(temp); | 5708 VariableProxy* obj = factory()->NewVariableProxy(temp); |
| 5717 Assignment* assign_obj = factory()->NewAssignment( | 5709 Assignment* assign_obj = factory()->NewAssignment( |
| 5718 Token::ASSIGN, obj, function->AsProperty()->obj(), | 5710 Token::ASSIGN, obj, function->AsProperty()->obj(), |
| 5719 kNoSourcePosition); | 5711 kNoSourcePosition); |
| 5720 function = factory()->NewProperty( | 5712 function = factory()->NewProperty( |
| 5721 assign_obj, function->AsProperty()->key(), kNoSourcePosition); | 5713 assign_obj, function->AsProperty()->key(), kNoSourcePosition); |
| 5722 args->InsertAt(0, function, zone()); | 5714 args->InsertAt(0, function, zone()); |
| 5723 obj = factory()->NewVariableProxy(temp); | 5715 obj = factory()->NewVariableProxy(temp); |
| 5724 args->InsertAt(1, obj, zone()); | 5716 args->InsertAt(1, obj, zone()); |
| 5725 } | 5717 } |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5810 // yield %AsyncFunctionAwait(.generator_object, <operand>) | 5802 // yield %AsyncFunctionAwait(.generator_object, <operand>) |
| 5811 Variable* generator_object_variable = | 5803 Variable* generator_object_variable = |
| 5812 parser_->function_state_->generator_object_variable(); | 5804 parser_->function_state_->generator_object_variable(); |
| 5813 | 5805 |
| 5814 // If generator_object_variable is null, | 5806 // If generator_object_variable is null, |
| 5815 if (!generator_object_variable) return value; | 5807 if (!generator_object_variable) return value; |
| 5816 | 5808 |
| 5817 auto factory = parser_->factory(); | 5809 auto factory = parser_->factory(); |
| 5818 const int nopos = kNoSourcePosition; | 5810 const int nopos = kNoSourcePosition; |
| 5819 | 5811 |
| 5820 Variable* temp_var = parser_->scope()->NewTemporary( | 5812 Variable* temp_var = |
| 5821 parser_->ast_value_factory()->empty_string()); | 5813 parser_->NewTemporary(parser_->ast_value_factory()->empty_string()); |
| 5822 VariableProxy* temp_proxy = factory->NewVariableProxy(temp_var); | 5814 VariableProxy* temp_proxy = factory->NewVariableProxy(temp_var); |
| 5823 Block* do_block = factory->NewBlock(nullptr, 2, false, nopos); | 5815 Block* do_block = factory->NewBlock(nullptr, 2, false, nopos); |
| 5824 | 5816 |
| 5825 // Wrap value evaluation to provide a break location. | 5817 // Wrap value evaluation to provide a break location. |
| 5826 Expression* value_assignment = | 5818 Expression* value_assignment = |
| 5827 factory->NewAssignment(Token::ASSIGN, temp_proxy, value, nopos); | 5819 factory->NewAssignment(Token::ASSIGN, temp_proxy, value, nopos); |
| 5828 do_block->statements()->Add( | 5820 do_block->statements()->Add( |
| 5829 factory->NewExpressionStatement(value_assignment, value->position()), | 5821 factory->NewExpressionStatement(value_assignment, value->position()), |
| 5830 zone()); | 5822 zone()); |
| 5831 | 5823 |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5954 DCHECK_NOT_NULL(lhs->raw_name()); | 5946 DCHECK_NOT_NULL(lhs->raw_name()); |
| 5955 result = this->ExpressionFromIdentifier(lhs->raw_name(), lhs->position(), | 5947 result = this->ExpressionFromIdentifier(lhs->raw_name(), lhs->position(), |
| 5956 lhs->end_position(), factory()); | 5948 lhs->end_position(), factory()); |
| 5957 args->Add(left, zone()); | 5949 args->Add(left, zone()); |
| 5958 args->Add(right, zone()); | 5950 args->Add(right, zone()); |
| 5959 Expression* call = | 5951 Expression* call = |
| 5960 factory()->NewCallRuntime(Context::MATH_POW_INDEX, args, pos); | 5952 factory()->NewCallRuntime(Context::MATH_POW_INDEX, args, pos); |
| 5961 return factory()->NewAssignment(Token::ASSIGN, result, call, pos); | 5953 return factory()->NewAssignment(Token::ASSIGN, result, call, pos); |
| 5962 } else if (left->IsProperty()) { | 5954 } else if (left->IsProperty()) { |
| 5963 Property* prop = left->AsProperty(); | 5955 Property* prop = left->AsProperty(); |
| 5964 auto temp_obj = scope()->NewTemporary(ast_value_factory()->empty_string()); | 5956 auto temp_obj = NewTemporary(ast_value_factory()->empty_string()); |
| 5965 auto temp_key = scope()->NewTemporary(ast_value_factory()->empty_string()); | 5957 auto temp_key = NewTemporary(ast_value_factory()->empty_string()); |
| 5966 Expression* assign_obj = factory()->NewAssignment( | 5958 Expression* assign_obj = factory()->NewAssignment( |
| 5967 Token::ASSIGN, factory()->NewVariableProxy(temp_obj), prop->obj(), | 5959 Token::ASSIGN, factory()->NewVariableProxy(temp_obj), prop->obj(), |
| 5968 kNoSourcePosition); | 5960 kNoSourcePosition); |
| 5969 Expression* assign_key = factory()->NewAssignment( | 5961 Expression* assign_key = factory()->NewAssignment( |
| 5970 Token::ASSIGN, factory()->NewVariableProxy(temp_key), prop->key(), | 5962 Token::ASSIGN, factory()->NewVariableProxy(temp_key), prop->key(), |
| 5971 kNoSourcePosition); | 5963 kNoSourcePosition); |
| 5972 args->Add(factory()->NewProperty(factory()->NewVariableProxy(temp_obj), | 5964 args->Add(factory()->NewProperty(factory()->NewVariableProxy(temp_obj), |
| 5973 factory()->NewVariableProxy(temp_key), | 5965 factory()->NewVariableProxy(temp_key), |
| 5974 left->position()), | 5966 left->position()), |
| 5975 zone()); | 5967 zone()); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 5998 // $R = [1, 2, 3]; | 5990 // $R = [1, 2, 3]; |
| 5999 // for ($i of x) %AppendElement($R, $i); | 5991 // for ($i of x) %AppendElement($R, $i); |
| 6000 // %AppendElement($R, 4); | 5992 // %AppendElement($R, 4); |
| 6001 // for ($j of y) %AppendElement($R, $j); | 5993 // for ($j of y) %AppendElement($R, $j); |
| 6002 // %AppendElement($R, 5); | 5994 // %AppendElement($R, 5); |
| 6003 // $R | 5995 // $R |
| 6004 // } | 5996 // } |
| 6005 // where $R, $i and $j are fresh temporary variables. | 5997 // where $R, $i and $j are fresh temporary variables. |
| 6006 ZoneList<Expression*>::iterator s = lit->FirstSpread(); | 5998 ZoneList<Expression*>::iterator s = lit->FirstSpread(); |
| 6007 if (s == lit->EndValue()) return nullptr; // no spread, no rewriting... | 5999 if (s == lit->EndValue()) return nullptr; // no spread, no rewriting... |
| 6008 Variable* result = | 6000 Variable* result = NewTemporary(ast_value_factory()->dot_result_string()); |
| 6009 scope()->NewTemporary(ast_value_factory()->dot_result_string()); | |
| 6010 // NOTE: The value assigned to R is the whole original array literal, | 6001 // NOTE: The value assigned to R is the whole original array literal, |
| 6011 // spreads included. This will be fixed before the rewritten AST is returned. | 6002 // spreads included. This will be fixed before the rewritten AST is returned. |
| 6012 // $R = lit | 6003 // $R = lit |
| 6013 Expression* init_result = factory()->NewAssignment( | 6004 Expression* init_result = factory()->NewAssignment( |
| 6014 Token::INIT, factory()->NewVariableProxy(result), lit, kNoSourcePosition); | 6005 Token::INIT, factory()->NewVariableProxy(result), lit, kNoSourcePosition); |
| 6015 Block* do_block = factory()->NewBlock(nullptr, 16, false, kNoSourcePosition); | 6006 Block* do_block = factory()->NewBlock(nullptr, 16, false, kNoSourcePosition); |
| 6016 do_block->statements()->Add( | 6007 do_block->statements()->Add( |
| 6017 factory()->NewExpressionStatement(init_result, kNoSourcePosition), | 6008 factory()->NewExpressionStatement(init_result, kNoSourcePosition), |
| 6018 zone()); | 6009 zone()); |
| 6019 // Traverse the array literal starting from the first spread. | 6010 // Traverse the array literal starting from the first spread. |
| 6020 while (s != lit->EndValue()) { | 6011 while (s != lit->EndValue()) { |
| 6021 Expression* value = *s++; | 6012 Expression* value = *s++; |
| 6022 Spread* spread = value->AsSpread(); | 6013 Spread* spread = value->AsSpread(); |
| 6023 if (spread == nullptr) { | 6014 if (spread == nullptr) { |
| 6024 // If the element is not a spread, we're adding a single: | 6015 // If the element is not a spread, we're adding a single: |
| 6025 // %AppendElement($R, value) | 6016 // %AppendElement($R, value) |
| 6026 ZoneList<Expression*>* append_element_args = NewExpressionList(2, zone()); | 6017 ZoneList<Expression*>* append_element_args = NewExpressionList(2, zone()); |
| 6027 append_element_args->Add(factory()->NewVariableProxy(result), zone()); | 6018 append_element_args->Add(factory()->NewVariableProxy(result), zone()); |
| 6028 append_element_args->Add(value, zone()); | 6019 append_element_args->Add(value, zone()); |
| 6029 do_block->statements()->Add( | 6020 do_block->statements()->Add( |
| 6030 factory()->NewExpressionStatement( | 6021 factory()->NewExpressionStatement( |
| 6031 factory()->NewCallRuntime(Runtime::kAppendElement, | 6022 factory()->NewCallRuntime(Runtime::kAppendElement, |
| 6032 append_element_args, kNoSourcePosition), | 6023 append_element_args, kNoSourcePosition), |
| 6033 kNoSourcePosition), | 6024 kNoSourcePosition), |
| 6034 zone()); | 6025 zone()); |
| 6035 } else { | 6026 } else { |
| 6036 // If it's a spread, we're adding a for/of loop iterating through it. | 6027 // If it's a spread, we're adding a for/of loop iterating through it. |
| 6037 Variable* each = | 6028 Variable* each = NewTemporary(ast_value_factory()->dot_for_string()); |
| 6038 scope()->NewTemporary(ast_value_factory()->dot_for_string()); | |
| 6039 Expression* subject = spread->expression(); | 6029 Expression* subject = spread->expression(); |
| 6040 // %AppendElement($R, each) | 6030 // %AppendElement($R, each) |
| 6041 Statement* append_body; | 6031 Statement* append_body; |
| 6042 { | 6032 { |
| 6043 ZoneList<Expression*>* append_element_args = | 6033 ZoneList<Expression*>* append_element_args = |
| 6044 NewExpressionList(2, zone()); | 6034 NewExpressionList(2, zone()); |
| 6045 append_element_args->Add(factory()->NewVariableProxy(result), zone()); | 6035 append_element_args->Add(factory()->NewVariableProxy(result), zone()); |
| 6046 append_element_args->Add(factory()->NewVariableProxy(each), zone()); | 6036 append_element_args->Add(factory()->NewVariableProxy(each), zone()); |
| 6047 append_body = factory()->NewExpressionStatement( | 6037 append_body = factory()->NewExpressionStatement( |
| 6048 factory()->NewCallRuntime(Runtime::kAppendElement, | 6038 factory()->NewCallRuntime(Runtime::kAppendElement, |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6213 // if (IS_NULL_OR_UNDEFINED(iteratorReturn)) return input; | 6203 // if (IS_NULL_OR_UNDEFINED(iteratorReturn)) return input; |
| 6214 // output = %_Call(iteratorReturn, iterator, input); | 6204 // output = %_Call(iteratorReturn, iterator, input); |
| 6215 // if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output); | 6205 // if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output); |
| 6216 | 6206 |
| 6217 Expression* ParserTraits::RewriteYieldStar( | 6207 Expression* ParserTraits::RewriteYieldStar( |
| 6218 Expression* generator, Expression* iterable, int pos) { | 6208 Expression* generator, Expression* iterable, int pos) { |
| 6219 const int nopos = kNoSourcePosition; | 6209 const int nopos = kNoSourcePosition; |
| 6220 | 6210 |
| 6221 auto factory = parser_->factory(); | 6211 auto factory = parser_->factory(); |
| 6222 auto avfactory = parser_->ast_value_factory(); | 6212 auto avfactory = parser_->ast_value_factory(); |
| 6223 auto scope = parser_->scope(); | |
| 6224 auto zone = parser_->zone(); | 6213 auto zone = parser_->zone(); |
| 6225 | 6214 |
| 6226 | 6215 |
| 6227 // Forward definition for break/continue statements. | 6216 // Forward definition for break/continue statements. |
| 6228 WhileStatement* loop = factory->NewWhileStatement(nullptr, nopos); | 6217 WhileStatement* loop = factory->NewWhileStatement(nullptr, nopos); |
| 6229 | 6218 |
| 6230 | 6219 |
| 6231 // let input = undefined; | 6220 // let input = undefined; |
| 6232 Variable* var_input = scope->NewTemporary(avfactory->empty_string()); | 6221 Variable* var_input = parser_->NewTemporary(avfactory->empty_string()); |
| 6233 Statement* initialize_input; | 6222 Statement* initialize_input; |
| 6234 { | 6223 { |
| 6235 Expression* input_proxy = factory->NewVariableProxy(var_input); | 6224 Expression* input_proxy = factory->NewVariableProxy(var_input); |
| 6236 Expression* assignment = factory->NewAssignment( | 6225 Expression* assignment = factory->NewAssignment( |
| 6237 Token::ASSIGN, input_proxy, factory->NewUndefinedLiteral(nopos), nopos); | 6226 Token::ASSIGN, input_proxy, factory->NewUndefinedLiteral(nopos), nopos); |
| 6238 initialize_input = factory->NewExpressionStatement(assignment, nopos); | 6227 initialize_input = factory->NewExpressionStatement(assignment, nopos); |
| 6239 } | 6228 } |
| 6240 | 6229 |
| 6241 | 6230 |
| 6242 // let mode = kNext; | 6231 // let mode = kNext; |
| 6243 Variable* var_mode = scope->NewTemporary(avfactory->empty_string()); | 6232 Variable* var_mode = parser_->NewTemporary(avfactory->empty_string()); |
| 6244 Statement* initialize_mode; | 6233 Statement* initialize_mode; |
| 6245 { | 6234 { |
| 6246 Expression* mode_proxy = factory->NewVariableProxy(var_mode); | 6235 Expression* mode_proxy = factory->NewVariableProxy(var_mode); |
| 6247 Expression* knext = factory->NewSmiLiteral(JSGeneratorObject::kNext, nopos); | 6236 Expression* knext = factory->NewSmiLiteral(JSGeneratorObject::kNext, nopos); |
| 6248 Expression* assignment = | 6237 Expression* assignment = |
| 6249 factory->NewAssignment(Token::ASSIGN, mode_proxy, knext, nopos); | 6238 factory->NewAssignment(Token::ASSIGN, mode_proxy, knext, nopos); |
| 6250 initialize_mode = factory->NewExpressionStatement(assignment, nopos); | 6239 initialize_mode = factory->NewExpressionStatement(assignment, nopos); |
| 6251 } | 6240 } |
| 6252 | 6241 |
| 6253 | 6242 |
| 6254 // let output = undefined; | 6243 // let output = undefined; |
| 6255 Variable* var_output = scope->NewTemporary(avfactory->empty_string()); | 6244 Variable* var_output = parser_->NewTemporary(avfactory->empty_string()); |
| 6256 Statement* initialize_output; | 6245 Statement* initialize_output; |
| 6257 { | 6246 { |
| 6258 Expression* output_proxy = factory->NewVariableProxy(var_output); | 6247 Expression* output_proxy = factory->NewVariableProxy(var_output); |
| 6259 Expression* assignment = factory->NewAssignment( | 6248 Expression* assignment = factory->NewAssignment( |
| 6260 Token::ASSIGN, output_proxy, factory->NewUndefinedLiteral(nopos), | 6249 Token::ASSIGN, output_proxy, factory->NewUndefinedLiteral(nopos), |
| 6261 nopos); | 6250 nopos); |
| 6262 initialize_output = factory->NewExpressionStatement(assignment, nopos); | 6251 initialize_output = factory->NewExpressionStatement(assignment, nopos); |
| 6263 } | 6252 } |
| 6264 | 6253 |
| 6265 | 6254 |
| 6266 // let iterator = iterable[Symbol.iterator]; | 6255 // let iterator = iterable[Symbol.iterator]; |
| 6267 Variable* var_iterator = scope->NewTemporary(avfactory->empty_string()); | 6256 Variable* var_iterator = parser_->NewTemporary(avfactory->empty_string()); |
| 6268 Statement* get_iterator; | 6257 Statement* get_iterator; |
| 6269 { | 6258 { |
| 6270 Expression* iterator = GetIterator(iterable, factory, nopos); | 6259 Expression* iterator = GetIterator(iterable, factory, nopos); |
| 6271 Expression* iterator_proxy = factory->NewVariableProxy(var_iterator); | 6260 Expression* iterator_proxy = factory->NewVariableProxy(var_iterator); |
| 6272 Expression* assignment = factory->NewAssignment( | 6261 Expression* assignment = factory->NewAssignment( |
| 6273 Token::ASSIGN, iterator_proxy, iterator, nopos); | 6262 Token::ASSIGN, iterator_proxy, iterator, nopos); |
| 6274 get_iterator = factory->NewExpressionStatement(assignment, nopos); | 6263 get_iterator = factory->NewExpressionStatement(assignment, nopos); |
| 6275 } | 6264 } |
| 6276 | 6265 |
| 6277 | 6266 |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6337 Runtime::kThrowIteratorResultNotAnObject, args, nopos); | 6326 Runtime::kThrowIteratorResultNotAnObject, args, nopos); |
| 6338 throw_call = factory->NewExpressionStatement(call, nopos); | 6327 throw_call = factory->NewExpressionStatement(call, nopos); |
| 6339 } | 6328 } |
| 6340 | 6329 |
| 6341 validate_next_output = factory->NewIfStatement( | 6330 validate_next_output = factory->NewIfStatement( |
| 6342 is_receiver_call, factory->NewEmptyStatement(nopos), throw_call, nopos); | 6331 is_receiver_call, factory->NewEmptyStatement(nopos), throw_call, nopos); |
| 6343 } | 6332 } |
| 6344 | 6333 |
| 6345 | 6334 |
| 6346 // let iteratorThrow = iterator.throw; | 6335 // let iteratorThrow = iterator.throw; |
| 6347 Variable* var_throw = scope->NewTemporary(avfactory->empty_string()); | 6336 Variable* var_throw = parser_->NewTemporary(avfactory->empty_string()); |
| 6348 Statement* get_throw; | 6337 Statement* get_throw; |
| 6349 { | 6338 { |
| 6350 Expression* iterator_proxy = factory->NewVariableProxy(var_iterator); | 6339 Expression* iterator_proxy = factory->NewVariableProxy(var_iterator); |
| 6351 Expression* literal = | 6340 Expression* literal = |
| 6352 factory->NewStringLiteral(avfactory->throw_string(), nopos); | 6341 factory->NewStringLiteral(avfactory->throw_string(), nopos); |
| 6353 Expression* property = | 6342 Expression* property = |
| 6354 factory->NewProperty(iterator_proxy, literal, nopos); | 6343 factory->NewProperty(iterator_proxy, literal, nopos); |
| 6355 Expression* throw_proxy = factory->NewVariableProxy(var_throw); | 6344 Expression* throw_proxy = factory->NewVariableProxy(var_throw); |
| 6356 Expression* assignment = factory->NewAssignment( | 6345 Expression* assignment = factory->NewAssignment( |
| 6357 Token::ASSIGN, throw_proxy, property, nopos); | 6346 Token::ASSIGN, throw_proxy, property, nopos); |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6532 // try { ... } catch(e) { ... } | 6521 // try { ... } catch(e) { ... } |
| 6533 Statement* try_catch; | 6522 Statement* try_catch; |
| 6534 { | 6523 { |
| 6535 Block* try_block = factory->NewBlock(nullptr, 2, false, nopos); | 6524 Block* try_block = factory->NewBlock(nullptr, 2, false, nopos); |
| 6536 try_block->statements()->Add(yield_output, zone); | 6525 try_block->statements()->Add(yield_output, zone); |
| 6537 try_block->statements()->Add(set_mode_next, zone); | 6526 try_block->statements()->Add(set_mode_next, zone); |
| 6538 | 6527 |
| 6539 Block* catch_block = factory->NewBlock(nullptr, 1, false, nopos); | 6528 Block* catch_block = factory->NewBlock(nullptr, 1, false, nopos); |
| 6540 catch_block->statements()->Add(set_mode_throw, zone); | 6529 catch_block->statements()->Add(set_mode_throw, zone); |
| 6541 | 6530 |
| 6542 Scope* catch_scope = NewScopeWithParent(scope, CATCH_SCOPE); | 6531 Scope* catch_scope = NewScope(CATCH_SCOPE); |
| 6543 catch_scope->set_is_hidden(); | 6532 catch_scope->set_is_hidden(); |
| 6544 const AstRawString* name = avfactory->dot_catch_string(); | 6533 const AstRawString* name = avfactory->dot_catch_string(); |
| 6545 Variable* catch_variable = | 6534 Variable* catch_variable = |
| 6546 catch_scope->DeclareLocal(name, VAR, kCreatedInitialized, | 6535 catch_scope->DeclareLocal(name, VAR, kCreatedInitialized, |
| 6547 Variable::NORMAL); | 6536 Variable::NORMAL); |
| 6548 | 6537 |
| 6549 try_catch = factory->NewTryCatchStatementForDesugaring( | 6538 try_catch = factory->NewTryCatchStatementForDesugaring( |
| 6550 try_block, catch_scope, catch_variable, catch_block, nopos); | 6539 try_block, catch_scope, catch_variable, catch_block, nopos); |
| 6551 } | 6540 } |
| 6552 | 6541 |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6624 do_block_->statements()->Add(initialize_output, zone); | 6613 do_block_->statements()->Add(initialize_output, zone); |
| 6625 do_block_->statements()->Add(get_iterator, zone); | 6614 do_block_->statements()->Add(get_iterator, zone); |
| 6626 do_block_->statements()->Add(validate_iterator, zone); | 6615 do_block_->statements()->Add(validate_iterator, zone); |
| 6627 do_block_->statements()->Add(loop, zone); | 6616 do_block_->statements()->Add(loop, zone); |
| 6628 do_block_->statements()->Add(maybe_return_value, zone); | 6617 do_block_->statements()->Add(maybe_return_value, zone); |
| 6629 | 6618 |
| 6630 Block* do_block = factory->NewBlock(nullptr, 2, false, nopos); | 6619 Block* do_block = factory->NewBlock(nullptr, 2, false, nopos); |
| 6631 do_block->statements()->Add(do_block_, zone); | 6620 do_block->statements()->Add(do_block_, zone); |
| 6632 do_block->statements()->Add(get_value, zone); | 6621 do_block->statements()->Add(get_value, zone); |
| 6633 | 6622 |
| 6634 Variable* dot_result = scope->NewTemporary(avfactory->dot_result_string()); | 6623 Variable* dot_result = |
| 6624 parser_->NewTemporary(avfactory->dot_result_string()); |
| 6635 yield_star = factory->NewDoExpression(do_block, dot_result, nopos); | 6625 yield_star = factory->NewDoExpression(do_block, dot_result, nopos); |
| 6636 Rewriter::Rewrite(parser_, scope->GetClosureScope(), yield_star, avfactory); | 6626 Rewriter::Rewrite(parser_, parser_->GetClosureScope(), yield_star, |
| 6627 avfactory); |
| 6637 } | 6628 } |
| 6638 | 6629 |
| 6639 return yield_star; | 6630 return yield_star; |
| 6640 } | 6631 } |
| 6641 | 6632 |
| 6642 Statement* ParserTraits::CheckCallable(Variable* var, Expression* error, | 6633 Statement* ParserTraits::CheckCallable(Variable* var, Expression* error, |
| 6643 int pos) { | 6634 int pos) { |
| 6644 auto factory = parser_->factory(); | 6635 auto factory = parser_->factory(); |
| 6645 auto avfactory = parser_->ast_value_factory(); | 6636 auto avfactory = parser_->ast_value_factory(); |
| 6646 const int nopos = kNoSourcePosition; | 6637 const int nopos = kNoSourcePosition; |
| (...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6897 // if (!IS_RECEIVER(output)) { | 6888 // if (!IS_RECEIVER(output)) { |
| 6898 // %ThrowIterResultNotAnObject(output); | 6889 // %ThrowIterResultNotAnObject(output); |
| 6899 // } | 6890 // } |
| 6900 // } | 6891 // } |
| 6901 // } | 6892 // } |
| 6902 // | 6893 // |
| 6903 | 6894 |
| 6904 const int nopos = kNoSourcePosition; | 6895 const int nopos = kNoSourcePosition; |
| 6905 auto factory = parser_->factory(); | 6896 auto factory = parser_->factory(); |
| 6906 auto avfactory = parser_->ast_value_factory(); | 6897 auto avfactory = parser_->ast_value_factory(); |
| 6907 auto scope = parser_->scope(); | |
| 6908 auto zone = parser_->zone(); | 6898 auto zone = parser_->zone(); |
| 6909 | 6899 |
| 6910 | 6900 |
| 6911 // let iteratorReturn = iterator.return; | 6901 // let iteratorReturn = iterator.return; |
| 6912 Variable* var_return = scope->NewTemporary(avfactory->empty_string()); | 6902 Variable* var_return = parser_->NewTemporary(avfactory->empty_string()); |
| 6913 Statement* get_return; | 6903 Statement* get_return; |
| 6914 { | 6904 { |
| 6915 Expression* iterator_proxy = factory->NewVariableProxy(iterator); | 6905 Expression* iterator_proxy = factory->NewVariableProxy(iterator); |
| 6916 Expression* literal = | 6906 Expression* literal = |
| 6917 factory->NewStringLiteral(avfactory->return_string(), nopos); | 6907 factory->NewStringLiteral(avfactory->return_string(), nopos); |
| 6918 Expression* property = | 6908 Expression* property = |
| 6919 factory->NewProperty(iterator_proxy, literal, nopos); | 6909 factory->NewProperty(iterator_proxy, literal, nopos); |
| 6920 Expression* return_proxy = factory->NewVariableProxy(var_return); | 6910 Expression* return_proxy = factory->NewVariableProxy(var_return); |
| 6921 Expression* assignment = factory->NewAssignment( | 6911 Expression* assignment = factory->NewAssignment( |
| 6922 Token::ASSIGN, return_proxy, property, nopos); | 6912 Token::ASSIGN, return_proxy, property, nopos); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 6943 | 6933 |
| 6944 Expression* call = | 6934 Expression* call = |
| 6945 factory->NewCallRuntime(Runtime::kInlineCall, args, nopos); | 6935 factory->NewCallRuntime(Runtime::kInlineCall, args, nopos); |
| 6946 | 6936 |
| 6947 Block* try_block = factory->NewBlock(nullptr, 1, false, nopos); | 6937 Block* try_block = factory->NewBlock(nullptr, 1, false, nopos); |
| 6948 try_block->statements()->Add(factory->NewExpressionStatement(call, nopos), | 6938 try_block->statements()->Add(factory->NewExpressionStatement(call, nopos), |
| 6949 zone); | 6939 zone); |
| 6950 | 6940 |
| 6951 Block* catch_block = factory->NewBlock(nullptr, 0, false, nopos); | 6941 Block* catch_block = factory->NewBlock(nullptr, 0, false, nopos); |
| 6952 | 6942 |
| 6953 Scope* catch_scope = NewScopeWithParent(scope, CATCH_SCOPE); | 6943 Scope* catch_scope = NewScope(CATCH_SCOPE); |
| 6954 Variable* catch_variable = catch_scope->DeclareLocal( | 6944 Variable* catch_variable = catch_scope->DeclareLocal( |
| 6955 avfactory->dot_catch_string(), VAR, kCreatedInitialized, | 6945 avfactory->dot_catch_string(), VAR, kCreatedInitialized, |
| 6956 Variable::NORMAL); | 6946 Variable::NORMAL); |
| 6957 catch_scope->set_is_hidden(); | 6947 catch_scope->set_is_hidden(); |
| 6958 | 6948 |
| 6959 try_call_return = factory->NewTryCatchStatement( | 6949 try_call_return = factory->NewTryCatchStatement( |
| 6960 try_block, catch_scope, catch_variable, catch_block, nopos); | 6950 try_block, catch_scope, catch_variable, catch_block, nopos); |
| 6961 } | 6951 } |
| 6962 | 6952 |
| 6963 // let output = %_Call(iteratorReturn, iterator); | 6953 // let output = %_Call(iteratorReturn, iterator); |
| 6964 // if (!IS_RECEIVER(output)) { | 6954 // if (!IS_RECEIVER(output)) { |
| 6965 // %ThrowIteratorResultNotAnObject(output); | 6955 // %ThrowIteratorResultNotAnObject(output); |
| 6966 // } | 6956 // } |
| 6967 Block* validate_return; | 6957 Block* validate_return; |
| 6968 { | 6958 { |
| 6969 Variable* var_output = scope->NewTemporary(avfactory->empty_string()); | 6959 Variable* var_output = parser_->NewTemporary(avfactory->empty_string()); |
| 6970 Statement* call_return; | 6960 Statement* call_return; |
| 6971 { | 6961 { |
| 6972 auto args = new (zone) ZoneList<Expression*>(2, zone); | 6962 auto args = new (zone) ZoneList<Expression*>(2, zone); |
| 6973 args->Add(factory->NewVariableProxy(var_return), zone); | 6963 args->Add(factory->NewVariableProxy(var_return), zone); |
| 6974 args->Add(factory->NewVariableProxy(iterator), zone); | 6964 args->Add(factory->NewVariableProxy(iterator), zone); |
| 6975 Expression* call = | 6965 Expression* call = |
| 6976 factory->NewCallRuntime(Runtime::kInlineCall, args, nopos); | 6966 factory->NewCallRuntime(Runtime::kInlineCall, args, nopos); |
| 6977 | 6967 |
| 6978 Expression* output_proxy = factory->NewVariableProxy(var_output); | 6968 Expression* output_proxy = factory->NewVariableProxy(var_output); |
| 6979 Expression* assignment = | 6969 Expression* assignment = |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7103 node->Print(Isolate::Current()); | 7093 node->Print(Isolate::Current()); |
| 7104 } | 7094 } |
| 7105 #endif // DEBUG | 7095 #endif // DEBUG |
| 7106 | 7096 |
| 7107 #undef CHECK_OK | 7097 #undef CHECK_OK |
| 7108 #undef CHECK_OK_VOID | 7098 #undef CHECK_OK_VOID |
| 7109 #undef CHECK_FAILED | 7099 #undef CHECK_FAILED |
| 7110 | 7100 |
| 7111 } // namespace internal | 7101 } // namespace internal |
| 7112 } // namespace v8 | 7102 } // namespace v8 |
| OLD | NEW |