| 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/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/api.h" | 7 #include "src/api.h" |
| 8 #include "src/ast.h" | 8 #include "src/ast.h" |
| 9 #include "src/ast-literal-reindexer.h" | 9 #include "src/ast-literal-reindexer.h" |
| 10 #include "src/bailout-reason.h" | 10 #include "src/bailout-reason.h" |
| (...skipping 2809 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2820 if (IsSubclassConstructor(function_state_->kind())) { | 2820 if (IsSubclassConstructor(function_state_->kind())) { |
| 2821 // For subclass constructors we need to return this in case of undefined | 2821 // For subclass constructors we need to return this in case of undefined |
| 2822 // and throw an exception in case of a non object. | 2822 // and throw an exception in case of a non object. |
| 2823 // | 2823 // |
| 2824 // return expr; | 2824 // return expr; |
| 2825 // | 2825 // |
| 2826 // Is rewritten as: | 2826 // Is rewritten as: |
| 2827 // | 2827 // |
| 2828 // return (temp = expr) === undefined ? this : | 2828 // return (temp = expr) === undefined ? this : |
| 2829 // %_IsSpecObject(temp) ? temp : throw new TypeError(...); | 2829 // %_IsSpecObject(temp) ? temp : throw new TypeError(...); |
| 2830 Variable* temp = scope_->DeclarationScope()->NewTemporary( | 2830 Variable* temp = scope_->NewTemporary( |
| 2831 ast_value_factory()->empty_string()); | 2831 ast_value_factory()->empty_string()); |
| 2832 Assignment* assign = factory()->NewAssignment( | 2832 Assignment* assign = factory()->NewAssignment( |
| 2833 Token::ASSIGN, factory()->NewVariableProxy(temp), return_value, pos); | 2833 Token::ASSIGN, factory()->NewVariableProxy(temp), return_value, pos); |
| 2834 | 2834 |
| 2835 Expression* throw_expression = | 2835 Expression* throw_expression = |
| 2836 NewThrowTypeError(MessageTemplate::kDerivedConstructorReturn, | 2836 NewThrowTypeError(MessageTemplate::kDerivedConstructorReturn, |
| 2837 ast_value_factory()->empty_string(), pos); | 2837 ast_value_factory()->empty_string(), pos); |
| 2838 | 2838 |
| 2839 // %_IsSpecObject(temp) | 2839 // %_IsSpecObject(temp) |
| 2840 ZoneList<Expression*>* is_spec_object_args = | 2840 ZoneList<Expression*>* is_spec_object_args = |
| (...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3174 } | 3174 } |
| 3175 | 3175 |
| 3176 | 3176 |
| 3177 void Parser::InitializeForEachStatement(ForEachStatement* stmt, | 3177 void Parser::InitializeForEachStatement(ForEachStatement* stmt, |
| 3178 Expression* each, | 3178 Expression* each, |
| 3179 Expression* subject, | 3179 Expression* subject, |
| 3180 Statement* body) { | 3180 Statement* body) { |
| 3181 ForOfStatement* for_of = stmt->AsForOfStatement(); | 3181 ForOfStatement* for_of = stmt->AsForOfStatement(); |
| 3182 | 3182 |
| 3183 if (for_of != NULL) { | 3183 if (for_of != NULL) { |
| 3184 Variable* iterator = scope_->DeclarationScope()->NewTemporary( | 3184 Variable* iterator = scope_->NewTemporary( |
| 3185 ast_value_factory()->dot_iterator_string()); | 3185 ast_value_factory()->dot_iterator_string()); |
| 3186 Variable* result = scope_->DeclarationScope()->NewTemporary( | 3186 Variable* result = scope_->NewTemporary( |
| 3187 ast_value_factory()->dot_result_string()); | 3187 ast_value_factory()->dot_result_string()); |
| 3188 | 3188 |
| 3189 Expression* assign_iterator; | 3189 Expression* assign_iterator; |
| 3190 Expression* next_result; | 3190 Expression* next_result; |
| 3191 Expression* result_done; | 3191 Expression* result_done; |
| 3192 Expression* assign_each; | 3192 Expression* assign_each; |
| 3193 | 3193 |
| 3194 // iterator = subject[Symbol.iterator]() | 3194 // iterator = subject[Symbol.iterator]() |
| 3195 assign_iterator = factory()->NewAssignment( | 3195 assign_iterator = factory()->NewAssignment( |
| 3196 Token::ASSIGN, factory()->NewVariableProxy(iterator), | 3196 Token::ASSIGN, factory()->NewVariableProxy(iterator), |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3292 | 3292 |
| 3293 // Add statement: let/const x = i. | 3293 // Add statement: let/const x = i. |
| 3294 outer_block->AddStatement(init, zone()); | 3294 outer_block->AddStatement(init, zone()); |
| 3295 | 3295 |
| 3296 const AstRawString* temp_name = ast_value_factory()->dot_for_string(); | 3296 const AstRawString* temp_name = ast_value_factory()->dot_for_string(); |
| 3297 | 3297 |
| 3298 // For each lexical variable x: | 3298 // For each lexical variable x: |
| 3299 // make statement: temp_x = x. | 3299 // make statement: temp_x = x. |
| 3300 for (int i = 0; i < names->length(); i++) { | 3300 for (int i = 0; i < names->length(); i++) { |
| 3301 VariableProxy* proxy = NewUnresolved(names->at(i), LET); | 3301 VariableProxy* proxy = NewUnresolved(names->at(i), LET); |
| 3302 Variable* temp = scope_->DeclarationScope()->NewTemporary(temp_name); | 3302 Variable* temp = scope_->NewTemporary(temp_name); |
| 3303 VariableProxy* temp_proxy = factory()->NewVariableProxy(temp); | 3303 VariableProxy* temp_proxy = factory()->NewVariableProxy(temp); |
| 3304 Assignment* assignment = factory()->NewAssignment( | 3304 Assignment* assignment = factory()->NewAssignment( |
| 3305 Token::ASSIGN, temp_proxy, proxy, RelocInfo::kNoPosition); | 3305 Token::ASSIGN, temp_proxy, proxy, RelocInfo::kNoPosition); |
| 3306 Statement* assignment_statement = factory()->NewExpressionStatement( | 3306 Statement* assignment_statement = factory()->NewExpressionStatement( |
| 3307 assignment, RelocInfo::kNoPosition); | 3307 assignment, RelocInfo::kNoPosition); |
| 3308 outer_block->AddStatement(assignment_statement, zone()); | 3308 outer_block->AddStatement(assignment_statement, zone()); |
| 3309 temps.Add(temp, zone()); | 3309 temps.Add(temp, zone()); |
| 3310 } | 3310 } |
| 3311 | 3311 |
| 3312 Variable* first = NULL; | 3312 Variable* first = NULL; |
| 3313 // Make statement: first = 1. | 3313 // Make statement: first = 1. |
| 3314 if (next) { | 3314 if (next) { |
| 3315 first = scope_->DeclarationScope()->NewTemporary(temp_name); | 3315 first = scope_->NewTemporary(temp_name); |
| 3316 VariableProxy* first_proxy = factory()->NewVariableProxy(first); | 3316 VariableProxy* first_proxy = factory()->NewVariableProxy(first); |
| 3317 Expression* const1 = factory()->NewSmiLiteral(1, RelocInfo::kNoPosition); | 3317 Expression* const1 = factory()->NewSmiLiteral(1, RelocInfo::kNoPosition); |
| 3318 Assignment* assignment = factory()->NewAssignment( | 3318 Assignment* assignment = factory()->NewAssignment( |
| 3319 Token::ASSIGN, first_proxy, const1, RelocInfo::kNoPosition); | 3319 Token::ASSIGN, first_proxy, const1, RelocInfo::kNoPosition); |
| 3320 Statement* assignment_statement = | 3320 Statement* assignment_statement = |
| 3321 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition); | 3321 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition); |
| 3322 outer_block->AddStatement(assignment_statement, zone()); | 3322 outer_block->AddStatement(assignment_statement, zone()); |
| 3323 } | 3323 } |
| 3324 | 3324 |
| 3325 // make statement: undefined; | 3325 // make statement: undefined; |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3385 Assignment* assignment = factory()->NewAssignment( | 3385 Assignment* assignment = factory()->NewAssignment( |
| 3386 Token::ASSIGN, first_proxy, const0, RelocInfo::kNoPosition); | 3386 Token::ASSIGN, first_proxy, const0, RelocInfo::kNoPosition); |
| 3387 clear_first = | 3387 clear_first = |
| 3388 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition); | 3388 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition); |
| 3389 } | 3389 } |
| 3390 Statement* clear_first_or_next = factory()->NewIfStatement( | 3390 Statement* clear_first_or_next = factory()->NewIfStatement( |
| 3391 compare, clear_first, next, RelocInfo::kNoPosition); | 3391 compare, clear_first, next, RelocInfo::kNoPosition); |
| 3392 ignore_completion_block->AddStatement(clear_first_or_next, zone()); | 3392 ignore_completion_block->AddStatement(clear_first_or_next, zone()); |
| 3393 } | 3393 } |
| 3394 | 3394 |
| 3395 Variable* flag = scope_->DeclarationScope()->NewTemporary(temp_name); | 3395 Variable* flag = scope_->NewTemporary(temp_name); |
| 3396 // Make statement: flag = 1. | 3396 // Make statement: flag = 1. |
| 3397 { | 3397 { |
| 3398 VariableProxy* flag_proxy = factory()->NewVariableProxy(flag); | 3398 VariableProxy* flag_proxy = factory()->NewVariableProxy(flag); |
| 3399 Expression* const1 = factory()->NewSmiLiteral(1, RelocInfo::kNoPosition); | 3399 Expression* const1 = factory()->NewSmiLiteral(1, RelocInfo::kNoPosition); |
| 3400 Assignment* assignment = factory()->NewAssignment( | 3400 Assignment* assignment = factory()->NewAssignment( |
| 3401 Token::ASSIGN, flag_proxy, const1, RelocInfo::kNoPosition); | 3401 Token::ASSIGN, flag_proxy, const1, RelocInfo::kNoPosition); |
| 3402 Statement* assignment_statement = | 3402 Statement* assignment_statement = |
| 3403 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition); | 3403 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition); |
| 3404 ignore_completion_block->AddStatement(assignment_statement, zone()); | 3404 ignore_completion_block->AddStatement(assignment_statement, zone()); |
| 3405 } | 3405 } |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3571 // { | 3571 // { |
| 3572 // <let x' be a temporary variable> | 3572 // <let x' be a temporary variable> |
| 3573 // for (x' in/of e) { | 3573 // for (x' in/of e) { |
| 3574 // let/const/var x; | 3574 // let/const/var x; |
| 3575 // x = x'; | 3575 // x = x'; |
| 3576 // b; | 3576 // b; |
| 3577 // } | 3577 // } |
| 3578 // let x; // for TDZ | 3578 // let x; // for TDZ |
| 3579 // } | 3579 // } |
| 3580 | 3580 |
| 3581 Variable* temp = scope_->DeclarationScope()->NewTemporary( | 3581 Variable* temp = scope_->NewTemporary( |
| 3582 ast_value_factory()->dot_for_string()); | 3582 ast_value_factory()->dot_for_string()); |
| 3583 ForEachStatement* loop = | 3583 ForEachStatement* loop = |
| 3584 factory()->NewForEachStatement(mode, labels, stmt_pos); | 3584 factory()->NewForEachStatement(mode, labels, stmt_pos); |
| 3585 Target target(&this->target_stack_, loop); | 3585 Target target(&this->target_stack_, loop); |
| 3586 | 3586 |
| 3587 Expression* enumerable = ParseExpression(true, CHECK_OK); | 3587 Expression* enumerable = ParseExpression(true, CHECK_OK); |
| 3588 | 3588 |
| 3589 Expect(Token::RPAREN, CHECK_OK); | 3589 Expect(Token::RPAREN, CHECK_OK); |
| 3590 | 3590 |
| 3591 Scope* body_scope = NewScope(scope_, BLOCK_SCOPE); | 3591 Scope* body_scope = NewScope(scope_, BLOCK_SCOPE); |
| (...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4000 | 4000 |
| 4001 if (is_generator) { | 4001 if (is_generator) { |
| 4002 // For generators, allocating variables in contexts is currently a win | 4002 // For generators, allocating variables in contexts is currently a win |
| 4003 // because it minimizes the work needed to suspend and resume an | 4003 // because it minimizes the work needed to suspend and resume an |
| 4004 // activation. | 4004 // activation. |
| 4005 scope_->ForceContextAllocation(); | 4005 scope_->ForceContextAllocation(); |
| 4006 | 4006 |
| 4007 // Calling a generator returns a generator object. That object is stored | 4007 // Calling a generator returns a generator object. That object is stored |
| 4008 // in a temporary variable, a definition that is used by "yield" | 4008 // in a temporary variable, a definition that is used by "yield" |
| 4009 // expressions. This also marks the FunctionState as a generator. | 4009 // expressions. This also marks the FunctionState as a generator. |
| 4010 Variable* temp = scope_->DeclarationScope()->NewTemporary( | 4010 Variable* temp = scope_->NewTemporary( |
| 4011 ast_value_factory()->dot_generator_object_string()); | 4011 ast_value_factory()->dot_generator_object_string()); |
| 4012 function_state.set_generator_object_variable(temp); | 4012 function_state.set_generator_object_variable(temp); |
| 4013 } | 4013 } |
| 4014 | 4014 |
| 4015 Expect(Token::LPAREN, CHECK_OK); | 4015 Expect(Token::LPAREN, CHECK_OK); |
| 4016 int start_position = scanner()->location().beg_pos; | 4016 int start_position = scanner()->location().beg_pos; |
| 4017 scope_->set_start_position(start_position); | 4017 scope_->set_start_position(start_position); |
| 4018 ParserFormalParameters formals(scope); | 4018 ParserFormalParameters formals(scope); |
| 4019 arity = ParseFormalParameterList(&formals, &formals_classifier, CHECK_OK); | 4019 arity = ParseFormalParameterList(&formals, &formals_classifier, CHECK_OK); |
| 4020 Expect(Token::RPAREN, CHECK_OK); | 4020 Expect(Token::RPAREN, CHECK_OK); |
| (...skipping 1962 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5983 Expression* Parser::SpreadCallNew(Expression* function, | 5983 Expression* Parser::SpreadCallNew(Expression* function, |
| 5984 ZoneList<v8::internal::Expression*>* args, | 5984 ZoneList<v8::internal::Expression*>* args, |
| 5985 int pos) { | 5985 int pos) { |
| 5986 args->InsertAt(0, function, zone()); | 5986 args->InsertAt(0, function, zone()); |
| 5987 | 5987 |
| 5988 return factory()->NewCallRuntime( | 5988 return factory()->NewCallRuntime( |
| 5989 ast_value_factory()->reflect_construct_string(), NULL, args, pos); | 5989 ast_value_factory()->reflect_construct_string(), NULL, args, pos); |
| 5990 } | 5990 } |
| 5991 } // namespace internal | 5991 } // namespace internal |
| 5992 } // namespace v8 | 5992 } // namespace v8 |
| OLD | NEW |