Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(27)

Side by Side Diff: src/parser.cc

Issue 1375203004: Fix completion of try..finally. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix webkit test. Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/ast.h ('k') | src/pattern-rewriter.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/parser.h" 5 #include "src/parser.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 1915 matching lines...) Expand 10 before | Expand all | Expand 10 after
1926 case Token::TRY: { 1926 case Token::TRY: {
1927 // These statements must have their labels preserved in an enclosing 1927 // These statements must have their labels preserved in an enclosing
1928 // block 1928 // block
1929 if (labels == NULL) { 1929 if (labels == NULL) {
1930 return ParseStatementAsUnlabelled(labels, ok); 1930 return ParseStatementAsUnlabelled(labels, ok);
1931 } else { 1931 } else {
1932 Block* result = 1932 Block* result =
1933 factory()->NewBlock(labels, 1, false, RelocInfo::kNoPosition); 1933 factory()->NewBlock(labels, 1, false, RelocInfo::kNoPosition);
1934 Target target(&this->target_stack_, result); 1934 Target target(&this->target_stack_, result);
1935 Statement* statement = ParseStatementAsUnlabelled(labels, CHECK_OK); 1935 Statement* statement = ParseStatementAsUnlabelled(labels, CHECK_OK);
1936 if (result) result->AddStatement(statement, zone()); 1936 if (result) result->statements()->Add(statement, zone());
adamk 2015/10/05 17:39:28 Looks like these were all changed in this patch (f
1937 return result; 1937 return result;
1938 } 1938 }
1939 } 1939 }
1940 1940
1941 case Token::WITH: 1941 case Token::WITH:
1942 return ParseWithStatement(labels, ok); 1942 return ParseWithStatement(labels, ok);
1943 1943
1944 case Token::SWITCH: 1944 case Token::SWITCH:
1945 return ParseSwitchStatement(labels, ok); 1945 return ParseSwitchStatement(labels, ok);
1946 1946
(...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after
2354 // (ECMA-262, 3rd, 12.2) 2354 // (ECMA-262, 3rd, 12.2)
2355 // 2355 //
2356 // Construct block expecting 16 statements. 2356 // Construct block expecting 16 statements.
2357 Block* result = 2357 Block* result =
2358 factory()->NewBlock(labels, 16, false, RelocInfo::kNoPosition); 2358 factory()->NewBlock(labels, 16, false, RelocInfo::kNoPosition);
2359 Target target(&this->target_stack_, result); 2359 Target target(&this->target_stack_, result);
2360 Expect(Token::LBRACE, CHECK_OK); 2360 Expect(Token::LBRACE, CHECK_OK);
2361 while (peek() != Token::RBRACE) { 2361 while (peek() != Token::RBRACE) {
2362 Statement* stat = ParseStatement(NULL, CHECK_OK); 2362 Statement* stat = ParseStatement(NULL, CHECK_OK);
2363 if (stat && !stat->IsEmpty()) { 2363 if (stat && !stat->IsEmpty()) {
2364 result->AddStatement(stat, zone()); 2364 result->statements()->Add(stat, zone());
2365 } 2365 }
2366 } 2366 }
2367 Expect(Token::RBRACE, CHECK_OK); 2367 Expect(Token::RBRACE, CHECK_OK);
2368 return result; 2368 return result;
2369 } 2369 }
2370 2370
2371 2371
2372 Block* Parser::ParseScopedBlock(ZoneList<const AstRawString*>* labels, 2372 Block* Parser::ParseScopedBlock(ZoneList<const AstRawString*>* labels,
2373 bool* ok) { 2373 bool* ok) {
2374 // The harmony mode uses block elements instead of statements. 2374 // The harmony mode uses block elements instead of statements.
2375 // 2375 //
2376 // Block :: 2376 // Block ::
2377 // '{' StatementList '}' 2377 // '{' StatementList '}'
2378 2378
2379 // Construct block expecting 16 statements. 2379 // Construct block expecting 16 statements.
2380 Block* body = 2380 Block* body =
2381 factory()->NewBlock(labels, 16, false, RelocInfo::kNoPosition); 2381 factory()->NewBlock(labels, 16, false, RelocInfo::kNoPosition);
2382 Scope* block_scope = NewScope(scope_, BLOCK_SCOPE); 2382 Scope* block_scope = NewScope(scope_, BLOCK_SCOPE);
2383 2383
2384 // Parse the statements and collect escaping labels. 2384 // Parse the statements and collect escaping labels.
2385 Expect(Token::LBRACE, CHECK_OK); 2385 Expect(Token::LBRACE, CHECK_OK);
2386 block_scope->set_start_position(scanner()->location().beg_pos); 2386 block_scope->set_start_position(scanner()->location().beg_pos);
2387 { BlockState block_state(&scope_, block_scope); 2387 { BlockState block_state(&scope_, block_scope);
2388 Target target(&this->target_stack_, body); 2388 Target target(&this->target_stack_, body);
2389 2389
2390 while (peek() != Token::RBRACE) { 2390 while (peek() != Token::RBRACE) {
2391 Statement* stat = ParseStatementListItem(CHECK_OK); 2391 Statement* stat = ParseStatementListItem(CHECK_OK);
2392 if (stat && !stat->IsEmpty()) { 2392 if (stat && !stat->IsEmpty()) {
2393 body->AddStatement(stat, zone()); 2393 body->statements()->Add(stat, zone());
2394 } 2394 }
2395 } 2395 }
2396 } 2396 }
2397 Expect(Token::RBRACE, CHECK_OK); 2397 Expect(Token::RBRACE, CHECK_OK);
2398 block_scope->set_end_position(scanner()->location().end_pos); 2398 block_scope->set_end_position(scanner()->location().end_pos);
2399 block_scope = block_scope->FinalizeBlockScope(); 2399 block_scope = block_scope->FinalizeBlockScope();
2400 body->set_scope(block_scope); 2400 body->set_scope(block_scope);
2401 return body; 2401 return body;
2402 } 2402 }
2403 2403
(...skipping 618 matching lines...) Expand 10 before | Expand all | Expand 10 after
3022 Expression* tag = ParseExpression(true, CHECK_OK); 3022 Expression* tag = ParseExpression(true, CHECK_OK);
3023 Expect(Token::RPAREN, CHECK_OK); 3023 Expect(Token::RPAREN, CHECK_OK);
3024 3024
3025 Variable* tag_variable = 3025 Variable* tag_variable =
3026 scope_->NewTemporary(ast_value_factory()->dot_switch_tag_string()); 3026 scope_->NewTemporary(ast_value_factory()->dot_switch_tag_string());
3027 Assignment* tag_assign = factory()->NewAssignment( 3027 Assignment* tag_assign = factory()->NewAssignment(
3028 Token::ASSIGN, factory()->NewVariableProxy(tag_variable), tag, 3028 Token::ASSIGN, factory()->NewVariableProxy(tag_variable), tag,
3029 tag->position()); 3029 tag->position());
3030 Statement* tag_statement = 3030 Statement* tag_statement =
3031 factory()->NewExpressionStatement(tag_assign, RelocInfo::kNoPosition); 3031 factory()->NewExpressionStatement(tag_assign, RelocInfo::kNoPosition);
3032 switch_block->AddStatement(tag_statement, zone()); 3032 switch_block->statements()->Add(tag_statement, zone());
3033 3033
3034 // make statement: undefined; 3034 // make statement: undefined;
3035 // This is needed so the tag isn't returned as the value, in case the switch 3035 // This is needed so the tag isn't returned as the value, in case the switch
3036 // statements don't have a value. 3036 // statements don't have a value.
3037 switch_block->AddStatement( 3037 switch_block->statements()->Add(
3038 factory()->NewExpressionStatement( 3038 factory()->NewExpressionStatement(
3039 factory()->NewUndefinedLiteral(RelocInfo::kNoPosition), 3039 factory()->NewUndefinedLiteral(RelocInfo::kNoPosition),
3040 RelocInfo::kNoPosition), 3040 RelocInfo::kNoPosition),
3041 zone()); 3041 zone());
3042 3042
3043 Block* cases_block = 3043 Block* cases_block =
3044 factory()->NewBlock(NULL, 1, false, RelocInfo::kNoPosition); 3044 factory()->NewBlock(NULL, 1, false, RelocInfo::kNoPosition);
3045 Scope* cases_scope = NewScope(scope_, BLOCK_SCOPE); 3045 Scope* cases_scope = NewScope(scope_, BLOCK_SCOPE);
3046 cases_scope->SetNonlinear(); 3046 cases_scope->SetNonlinear();
3047 3047
3048 SwitchStatement* switch_statement = 3048 SwitchStatement* switch_statement =
3049 factory()->NewSwitchStatement(labels, switch_pos); 3049 factory()->NewSwitchStatement(labels, switch_pos);
3050 3050
3051 cases_scope->set_start_position(scanner()->location().beg_pos); 3051 cases_scope->set_start_position(scanner()->location().beg_pos);
3052 { 3052 {
3053 BlockState cases_block_state(&scope_, cases_scope); 3053 BlockState cases_block_state(&scope_, cases_scope);
3054 Target target(&this->target_stack_, switch_statement); 3054 Target target(&this->target_stack_, switch_statement);
3055 3055
3056 Expression* tag_read = factory()->NewVariableProxy(tag_variable); 3056 Expression* tag_read = factory()->NewVariableProxy(tag_variable);
3057 3057
3058 bool default_seen = false; 3058 bool default_seen = false;
3059 ZoneList<CaseClause*>* cases = 3059 ZoneList<CaseClause*>* cases =
3060 new (zone()) ZoneList<CaseClause*>(4, zone()); 3060 new (zone()) ZoneList<CaseClause*>(4, zone());
3061 Expect(Token::LBRACE, CHECK_OK); 3061 Expect(Token::LBRACE, CHECK_OK);
3062 while (peek() != Token::RBRACE) { 3062 while (peek() != Token::RBRACE) {
3063 CaseClause* clause = ParseCaseClause(&default_seen, CHECK_OK); 3063 CaseClause* clause = ParseCaseClause(&default_seen, CHECK_OK);
3064 cases->Add(clause, zone()); 3064 cases->Add(clause, zone());
3065 } 3065 }
3066 switch_statement->Initialize(tag_read, cases); 3066 switch_statement->Initialize(tag_read, cases);
3067 cases_block->AddStatement(switch_statement, zone()); 3067 cases_block->statements()->Add(switch_statement, zone());
3068 } 3068 }
3069 Expect(Token::RBRACE, CHECK_OK); 3069 Expect(Token::RBRACE, CHECK_OK);
3070 3070
3071 cases_scope->set_end_position(scanner()->location().end_pos); 3071 cases_scope->set_end_position(scanner()->location().end_pos);
3072 cases_scope = cases_scope->FinalizeBlockScope(); 3072 cases_scope = cases_scope->FinalizeBlockScope();
3073 cases_block->set_scope(cases_scope); 3073 cases_block->set_scope(cases_scope);
3074 3074
3075 switch_block->AddStatement(cases_block, zone()); 3075 switch_block->statements()->Add(cases_block, zone());
3076 3076
3077 return switch_block; 3077 return switch_block;
3078 } 3078 }
3079 3079
3080 3080
3081 Statement* Parser::ParseThrowStatement(bool* ok) { 3081 Statement* Parser::ParseThrowStatement(bool* ok) {
3082 // ThrowStatement :: 3082 // ThrowStatement ::
3083 // 'throw' Expression ';' 3083 // 'throw' Expression ';'
3084 3084
3085 Expect(Token::THROW, CHECK_OK); 3085 Expect(Token::THROW, CHECK_OK);
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
3156 // to: 3156 // to:
3157 // 'try { try B0 catch B1 } finally B2' 3157 // 'try { try B0 catch B1 } finally B2'
3158 3158
3159 if (catch_block != NULL && finally_block != NULL) { 3159 if (catch_block != NULL && finally_block != NULL) {
3160 // If we have both, create an inner try/catch. 3160 // If we have both, create an inner try/catch.
3161 DCHECK(catch_scope != NULL && catch_variable != NULL); 3161 DCHECK(catch_scope != NULL && catch_variable != NULL);
3162 TryCatchStatement* statement = 3162 TryCatchStatement* statement =
3163 factory()->NewTryCatchStatement(try_block, catch_scope, catch_variable, 3163 factory()->NewTryCatchStatement(try_block, catch_scope, catch_variable,
3164 catch_block, RelocInfo::kNoPosition); 3164 catch_block, RelocInfo::kNoPosition);
3165 try_block = factory()->NewBlock(NULL, 1, false, RelocInfo::kNoPosition); 3165 try_block = factory()->NewBlock(NULL, 1, false, RelocInfo::kNoPosition);
3166 try_block->AddStatement(statement, zone()); 3166 try_block->statements()->Add(statement, zone());
3167 catch_block = NULL; // Clear to indicate it's been handled. 3167 catch_block = NULL; // Clear to indicate it's been handled.
3168 } 3168 }
3169 3169
3170 TryStatement* result = NULL; 3170 TryStatement* result = NULL;
3171 if (catch_block != NULL) { 3171 if (catch_block != NULL) {
3172 DCHECK(finally_block == NULL); 3172 DCHECK(finally_block == NULL);
3173 DCHECK(catch_scope != NULL && catch_variable != NULL); 3173 DCHECK(catch_scope != NULL && catch_variable != NULL);
3174 result = factory()->NewTryCatchStatement(try_block, catch_scope, 3174 result = factory()->NewTryCatchStatement(try_block, catch_scope,
3175 catch_variable, catch_block, pos); 3175 catch_variable, catch_block, pos);
3176 } else { 3176 } else {
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
3377 // } 3377 // }
3378 3378
3379 DCHECK(names->length() > 0); 3379 DCHECK(names->length() > 0);
3380 Scope* for_scope = scope_; 3380 Scope* for_scope = scope_;
3381 ZoneList<Variable*> temps(names->length(), zone()); 3381 ZoneList<Variable*> temps(names->length(), zone());
3382 3382
3383 Block* outer_block = factory()->NewBlock(NULL, names->length() + 3, false, 3383 Block* outer_block = factory()->NewBlock(NULL, names->length() + 3, false,
3384 RelocInfo::kNoPosition); 3384 RelocInfo::kNoPosition);
3385 3385
3386 // Add statement: let/const x = i. 3386 // Add statement: let/const x = i.
3387 outer_block->AddStatement(init, zone()); 3387 outer_block->statements()->Add(init, zone());
3388 3388
3389 const AstRawString* temp_name = ast_value_factory()->dot_for_string(); 3389 const AstRawString* temp_name = ast_value_factory()->dot_for_string();
3390 3390
3391 // For each lexical variable x: 3391 // For each lexical variable x:
3392 // make statement: temp_x = x. 3392 // make statement: temp_x = x.
3393 for (int i = 0; i < names->length(); i++) { 3393 for (int i = 0; i < names->length(); i++) {
3394 VariableProxy* proxy = NewUnresolved(names->at(i), LET); 3394 VariableProxy* proxy = NewUnresolved(names->at(i), LET);
3395 Variable* temp = scope_->NewTemporary(temp_name); 3395 Variable* temp = scope_->NewTemporary(temp_name);
3396 VariableProxy* temp_proxy = factory()->NewVariableProxy(temp); 3396 VariableProxy* temp_proxy = factory()->NewVariableProxy(temp);
3397 Assignment* assignment = factory()->NewAssignment( 3397 Assignment* assignment = factory()->NewAssignment(
3398 Token::ASSIGN, temp_proxy, proxy, RelocInfo::kNoPosition); 3398 Token::ASSIGN, temp_proxy, proxy, RelocInfo::kNoPosition);
3399 Statement* assignment_statement = factory()->NewExpressionStatement( 3399 Statement* assignment_statement = factory()->NewExpressionStatement(
3400 assignment, RelocInfo::kNoPosition); 3400 assignment, RelocInfo::kNoPosition);
3401 outer_block->AddStatement(assignment_statement, zone()); 3401 outer_block->statements()->Add(assignment_statement, zone());
3402 temps.Add(temp, zone()); 3402 temps.Add(temp, zone());
3403 } 3403 }
3404 3404
3405 Variable* first = NULL; 3405 Variable* first = NULL;
3406 // Make statement: first = 1. 3406 // Make statement: first = 1.
3407 if (next) { 3407 if (next) {
3408 first = scope_->NewTemporary(temp_name); 3408 first = scope_->NewTemporary(temp_name);
3409 VariableProxy* first_proxy = factory()->NewVariableProxy(first); 3409 VariableProxy* first_proxy = factory()->NewVariableProxy(first);
3410 Expression* const1 = factory()->NewSmiLiteral(1, RelocInfo::kNoPosition); 3410 Expression* const1 = factory()->NewSmiLiteral(1, RelocInfo::kNoPosition);
3411 Assignment* assignment = factory()->NewAssignment( 3411 Assignment* assignment = factory()->NewAssignment(
3412 Token::ASSIGN, first_proxy, const1, RelocInfo::kNoPosition); 3412 Token::ASSIGN, first_proxy, const1, RelocInfo::kNoPosition);
3413 Statement* assignment_statement = 3413 Statement* assignment_statement =
3414 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition); 3414 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition);
3415 outer_block->AddStatement(assignment_statement, zone()); 3415 outer_block->statements()->Add(assignment_statement, zone());
3416 } 3416 }
3417 3417
3418 // make statement: undefined; 3418 // make statement: undefined;
3419 outer_block->AddStatement( 3419 outer_block->statements()->Add(
3420 factory()->NewExpressionStatement( 3420 factory()->NewExpressionStatement(
3421 factory()->NewUndefinedLiteral(RelocInfo::kNoPosition), 3421 factory()->NewUndefinedLiteral(RelocInfo::kNoPosition),
3422 RelocInfo::kNoPosition), 3422 RelocInfo::kNoPosition),
3423 zone()); 3423 zone());
3424 3424
3425 // Make statement: outer: for (;;) 3425 // Make statement: outer: for (;;)
3426 // Note that we don't actually create the label, or set this loop up as an 3426 // Note that we don't actually create the label, or set this loop up as an
3427 // explicit break target, instead handing it directly to those nodes that 3427 // explicit break target, instead handing it directly to those nodes that
3428 // need to know about it. This should be safe because we don't run any code 3428 // need to know about it. This should be safe because we don't run any code
3429 // in this function that looks up break targets. 3429 // in this function that looks up break targets.
3430 ForStatement* outer_loop = 3430 ForStatement* outer_loop =
3431 factory()->NewForStatement(NULL, RelocInfo::kNoPosition); 3431 factory()->NewForStatement(NULL, RelocInfo::kNoPosition);
3432 outer_block->AddStatement(outer_loop, zone()); 3432 outer_block->statements()->Add(outer_loop, zone());
3433 3433
3434 outer_block->set_scope(for_scope); 3434 outer_block->set_scope(for_scope);
3435 scope_ = inner_scope; 3435 scope_ = inner_scope;
3436 3436
3437 Block* inner_block = 3437 Block* inner_block =
3438 factory()->NewBlock(NULL, 3, false, RelocInfo::kNoPosition); 3438 factory()->NewBlock(NULL, 3, false, RelocInfo::kNoPosition);
3439 Block* ignore_completion_block = factory()->NewBlock( 3439 Block* ignore_completion_block = factory()->NewBlock(
3440 NULL, names->length() + 2, true, RelocInfo::kNoPosition); 3440 NULL, names->length() + 2, true, RelocInfo::kNoPosition);
3441 ZoneList<Variable*> inner_vars(names->length(), zone()); 3441 ZoneList<Variable*> inner_vars(names->length(), zone());
3442 // For each let variable x: 3442 // For each let variable x:
3443 // make statement: let/const x = temp_x. 3443 // make statement: let/const x = temp_x.
3444 VariableMode mode = is_const ? CONST : LET; 3444 VariableMode mode = is_const ? CONST : LET;
3445 for (int i = 0; i < names->length(); i++) { 3445 for (int i = 0; i < names->length(); i++) {
3446 VariableProxy* proxy = NewUnresolved(names->at(i), mode); 3446 VariableProxy* proxy = NewUnresolved(names->at(i), mode);
3447 Declaration* declaration = factory()->NewVariableDeclaration( 3447 Declaration* declaration = factory()->NewVariableDeclaration(
3448 proxy, mode, scope_, RelocInfo::kNoPosition); 3448 proxy, mode, scope_, RelocInfo::kNoPosition);
3449 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK); 3449 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK);
3450 inner_vars.Add(declaration->proxy()->var(), zone()); 3450 inner_vars.Add(declaration->proxy()->var(), zone());
3451 VariableProxy* temp_proxy = factory()->NewVariableProxy(temps.at(i)); 3451 VariableProxy* temp_proxy = factory()->NewVariableProxy(temps.at(i));
3452 Assignment* assignment = 3452 Assignment* assignment =
3453 factory()->NewAssignment(is_const ? Token::INIT_CONST : Token::INIT_LET, 3453 factory()->NewAssignment(is_const ? Token::INIT_CONST : Token::INIT_LET,
3454 proxy, temp_proxy, RelocInfo::kNoPosition); 3454 proxy, temp_proxy, RelocInfo::kNoPosition);
3455 Statement* assignment_statement = 3455 Statement* assignment_statement =
3456 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition); 3456 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition);
3457 DCHECK(init->position() != RelocInfo::kNoPosition); 3457 DCHECK(init->position() != RelocInfo::kNoPosition);
3458 proxy->var()->set_initializer_position(init->position()); 3458 proxy->var()->set_initializer_position(init->position());
3459 ignore_completion_block->AddStatement(assignment_statement, zone()); 3459 ignore_completion_block->statements()->Add(assignment_statement, zone());
3460 } 3460 }
3461 3461
3462 // Make statement: if (first == 1) { first = 0; } else { next; } 3462 // Make statement: if (first == 1) { first = 0; } else { next; }
3463 if (next) { 3463 if (next) {
3464 DCHECK(first); 3464 DCHECK(first);
3465 Expression* compare = NULL; 3465 Expression* compare = NULL;
3466 // Make compare expression: first == 1. 3466 // Make compare expression: first == 1.
3467 { 3467 {
3468 Expression* const1 = factory()->NewSmiLiteral(1, RelocInfo::kNoPosition); 3468 Expression* const1 = factory()->NewSmiLiteral(1, RelocInfo::kNoPosition);
3469 VariableProxy* first_proxy = factory()->NewVariableProxy(first); 3469 VariableProxy* first_proxy = factory()->NewVariableProxy(first);
3470 compare = factory()->NewCompareOperation(Token::EQ, first_proxy, const1, 3470 compare = factory()->NewCompareOperation(Token::EQ, first_proxy, const1,
3471 RelocInfo::kNoPosition); 3471 RelocInfo::kNoPosition);
3472 } 3472 }
3473 Statement* clear_first = NULL; 3473 Statement* clear_first = NULL;
3474 // Make statement: first = 0. 3474 // Make statement: first = 0.
3475 { 3475 {
3476 VariableProxy* first_proxy = factory()->NewVariableProxy(first); 3476 VariableProxy* first_proxy = factory()->NewVariableProxy(first);
3477 Expression* const0 = factory()->NewSmiLiteral(0, RelocInfo::kNoPosition); 3477 Expression* const0 = factory()->NewSmiLiteral(0, RelocInfo::kNoPosition);
3478 Assignment* assignment = factory()->NewAssignment( 3478 Assignment* assignment = factory()->NewAssignment(
3479 Token::ASSIGN, first_proxy, const0, RelocInfo::kNoPosition); 3479 Token::ASSIGN, first_proxy, const0, RelocInfo::kNoPosition);
3480 clear_first = 3480 clear_first =
3481 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition); 3481 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition);
3482 } 3482 }
3483 Statement* clear_first_or_next = factory()->NewIfStatement( 3483 Statement* clear_first_or_next = factory()->NewIfStatement(
3484 compare, clear_first, next, RelocInfo::kNoPosition); 3484 compare, clear_first, next, RelocInfo::kNoPosition);
3485 ignore_completion_block->AddStatement(clear_first_or_next, zone()); 3485 ignore_completion_block->statements()->Add(clear_first_or_next, zone());
3486 } 3486 }
3487 3487
3488 Variable* flag = scope_->NewTemporary(temp_name); 3488 Variable* flag = scope_->NewTemporary(temp_name);
3489 // Make statement: flag = 1. 3489 // Make statement: flag = 1.
3490 { 3490 {
3491 VariableProxy* flag_proxy = factory()->NewVariableProxy(flag); 3491 VariableProxy* flag_proxy = factory()->NewVariableProxy(flag);
3492 Expression* const1 = factory()->NewSmiLiteral(1, RelocInfo::kNoPosition); 3492 Expression* const1 = factory()->NewSmiLiteral(1, RelocInfo::kNoPosition);
3493 Assignment* assignment = factory()->NewAssignment( 3493 Assignment* assignment = factory()->NewAssignment(
3494 Token::ASSIGN, flag_proxy, const1, RelocInfo::kNoPosition); 3494 Token::ASSIGN, flag_proxy, const1, RelocInfo::kNoPosition);
3495 Statement* assignment_statement = 3495 Statement* assignment_statement =
3496 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition); 3496 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition);
3497 ignore_completion_block->AddStatement(assignment_statement, zone()); 3497 ignore_completion_block->statements()->Add(assignment_statement, zone());
3498 } 3498 }
3499 inner_block->AddStatement(ignore_completion_block, zone()); 3499 inner_block->statements()->Add(ignore_completion_block, zone());
3500 // Make cond expression for main loop: flag == 1. 3500 // Make cond expression for main loop: flag == 1.
3501 Expression* flag_cond = NULL; 3501 Expression* flag_cond = NULL;
3502 { 3502 {
3503 Expression* const1 = factory()->NewSmiLiteral(1, RelocInfo::kNoPosition); 3503 Expression* const1 = factory()->NewSmiLiteral(1, RelocInfo::kNoPosition);
3504 VariableProxy* flag_proxy = factory()->NewVariableProxy(flag); 3504 VariableProxy* flag_proxy = factory()->NewVariableProxy(flag);
3505 flag_cond = factory()->NewCompareOperation(Token::EQ, flag_proxy, const1, 3505 flag_cond = factory()->NewCompareOperation(Token::EQ, flag_proxy, const1,
3506 RelocInfo::kNoPosition); 3506 RelocInfo::kNoPosition);
3507 } 3507 }
3508 3508
3509 // Create chain of expressions "flag = 0, temp_x = x, ..." 3509 // Create chain of expressions "flag = 0, temp_x = x, ..."
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
3541 factory()->NewBreakStatement(outer_loop, RelocInfo::kNoPosition); 3541 factory()->NewBreakStatement(outer_loop, RelocInfo::kNoPosition);
3542 body_or_stop = 3542 body_or_stop =
3543 factory()->NewIfStatement(cond, body, stop, cond->position()); 3543 factory()->NewIfStatement(cond, body, stop, cond->position());
3544 } 3544 }
3545 3545
3546 // Make statement: labels: for (; flag == 1; flag = 0, temp_x = x) 3546 // Make statement: labels: for (; flag == 1; flag = 0, temp_x = x)
3547 // Note that we re-use the original loop node, which retains its labels 3547 // Note that we re-use the original loop node, which retains its labels
3548 // and ensures that any break or continue statements in body point to 3548 // and ensures that any break or continue statements in body point to
3549 // the right place. 3549 // the right place.
3550 loop->Initialize(NULL, flag_cond, compound_next_statement, body_or_stop); 3550 loop->Initialize(NULL, flag_cond, compound_next_statement, body_or_stop);
3551 inner_block->AddStatement(loop, zone()); 3551 inner_block->statements()->Add(loop, zone());
3552 3552
3553 // Make statement: if (flag == 1) { break; } 3553 // Make statement: if (flag == 1) { break; }
3554 { 3554 {
3555 Expression* compare = NULL; 3555 Expression* compare = NULL;
3556 // Make compare expresion: flag == 1. 3556 // Make compare expresion: flag == 1.
3557 { 3557 {
3558 Expression* const1 = factory()->NewSmiLiteral(1, RelocInfo::kNoPosition); 3558 Expression* const1 = factory()->NewSmiLiteral(1, RelocInfo::kNoPosition);
3559 VariableProxy* flag_proxy = factory()->NewVariableProxy(flag); 3559 VariableProxy* flag_proxy = factory()->NewVariableProxy(flag);
3560 compare = factory()->NewCompareOperation(Token::EQ, flag_proxy, const1, 3560 compare = factory()->NewCompareOperation(Token::EQ, flag_proxy, const1,
3561 RelocInfo::kNoPosition); 3561 RelocInfo::kNoPosition);
3562 } 3562 }
3563 Statement* stop = 3563 Statement* stop =
3564 factory()->NewBreakStatement(outer_loop, RelocInfo::kNoPosition); 3564 factory()->NewBreakStatement(outer_loop, RelocInfo::kNoPosition);
3565 Statement* empty = factory()->NewEmptyStatement(RelocInfo::kNoPosition); 3565 Statement* empty = factory()->NewEmptyStatement(RelocInfo::kNoPosition);
3566 Statement* if_flag_break = 3566 Statement* if_flag_break =
3567 factory()->NewIfStatement(compare, stop, empty, RelocInfo::kNoPosition); 3567 factory()->NewIfStatement(compare, stop, empty, RelocInfo::kNoPosition);
3568 inner_block->AddStatement(if_flag_break, zone()); 3568 inner_block->statements()->Add(if_flag_break, zone());
3569 } 3569 }
3570 3570
3571 inner_scope->set_end_position(scanner()->location().end_pos); 3571 inner_scope->set_end_position(scanner()->location().end_pos);
3572 inner_block->set_scope(inner_scope); 3572 inner_block->set_scope(inner_scope);
3573 scope_ = for_scope; 3573 scope_ = for_scope;
3574 3574
3575 outer_loop->Initialize(NULL, NULL, NULL, inner_block); 3575 outer_loop->Initialize(NULL, NULL, NULL, inner_block);
3576 return outer_block; 3576 return outer_block;
3577 } 3577 }
3578 3578
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
3639 Block* init_block = nullptr; 3639 Block* init_block = nullptr;
3640 3640
3641 // special case for legacy for (var/const x =.... in) 3641 // special case for legacy for (var/const x =.... in)
3642 if (!IsLexicalVariableMode(parsing_result.descriptor.mode) && 3642 if (!IsLexicalVariableMode(parsing_result.descriptor.mode) &&
3643 parsing_result.declarations[0].initializer != nullptr) { 3643 parsing_result.declarations[0].initializer != nullptr) {
3644 VariableProxy* single_var = scope_->NewUnresolved( 3644 VariableProxy* single_var = scope_->NewUnresolved(
3645 factory(), parsing_result.SingleName(), Variable::NORMAL, 3645 factory(), parsing_result.SingleName(), Variable::NORMAL,
3646 each_beg_pos, each_end_pos); 3646 each_beg_pos, each_end_pos);
3647 init_block = factory()->NewBlock( 3647 init_block = factory()->NewBlock(
3648 nullptr, 2, true, parsing_result.descriptor.declaration_pos); 3648 nullptr, 2, true, parsing_result.descriptor.declaration_pos);
3649 init_block->AddStatement( 3649 init_block->statements()->Add(
3650 factory()->NewExpressionStatement( 3650 factory()->NewExpressionStatement(
3651 factory()->NewAssignment( 3651 factory()->NewAssignment(
3652 Token::ASSIGN, single_var, 3652 Token::ASSIGN, single_var,
3653 parsing_result.declarations[0].initializer, 3653 parsing_result.declarations[0].initializer,
3654 RelocInfo::kNoPosition), 3654 RelocInfo::kNoPosition),
3655 RelocInfo::kNoPosition), 3655 RelocInfo::kNoPosition),
3656 zone()); 3656 zone());
3657 } 3657 }
3658 3658
3659 // Rewrite a for-in/of statement of the form 3659 // Rewrite a for-in/of statement of the form
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
3702 descriptor.initialization_pos = RelocInfo::kNoPosition; 3702 descriptor.initialization_pos = RelocInfo::kNoPosition;
3703 decl.initializer = factory()->NewVariableProxy(temp); 3703 decl.initializer = factory()->NewVariableProxy(temp);
3704 3704
3705 PatternRewriter::DeclareAndInitializeVariables( 3705 PatternRewriter::DeclareAndInitializeVariables(
3706 each_initialization_block, &descriptor, &decl, 3706 each_initialization_block, &descriptor, &decl,
3707 IsLexicalVariableMode(descriptor.mode) ? &lexical_bindings 3707 IsLexicalVariableMode(descriptor.mode) ? &lexical_bindings
3708 : nullptr, 3708 : nullptr,
3709 CHECK_OK); 3709 CHECK_OK);
3710 } 3710 }
3711 3711
3712 body_block->AddStatement(each_initialization_block, zone()); 3712 body_block->statements()->Add(each_initialization_block, zone());
3713 body_block->AddStatement(body, zone()); 3713 body_block->statements()->Add(body, zone());
3714 VariableProxy* temp_proxy = 3714 VariableProxy* temp_proxy =
3715 factory()->NewVariableProxy(temp, each_beg_pos, each_end_pos); 3715 factory()->NewVariableProxy(temp, each_beg_pos, each_end_pos);
3716 InitializeForEachStatement(loop, temp_proxy, enumerable, body_block); 3716 InitializeForEachStatement(loop, temp_proxy, enumerable, body_block);
3717 scope_ = for_scope; 3717 scope_ = for_scope;
3718 body_scope->set_end_position(scanner()->location().end_pos); 3718 body_scope->set_end_position(scanner()->location().end_pos);
3719 body_scope = body_scope->FinalizeBlockScope(); 3719 body_scope = body_scope->FinalizeBlockScope();
3720 if (body_scope != nullptr) { 3720 if (body_scope != nullptr) {
3721 body_block->set_scope(body_scope); 3721 body_block->set_scope(body_scope);
3722 } 3722 }
3723 3723
(...skipping 15 matching lines...) Expand all
3739 true, CHECK_OK); 3739 true, CHECK_OK);
3740 tdz_var->set_initializer_position(position()); 3740 tdz_var->set_initializer_position(position());
3741 } 3741 }
3742 } 3742 }
3743 3743
3744 scope_ = saved_scope; 3744 scope_ = saved_scope;
3745 for_scope->set_end_position(scanner()->location().end_pos); 3745 for_scope->set_end_position(scanner()->location().end_pos);
3746 for_scope = for_scope->FinalizeBlockScope(); 3746 for_scope = for_scope->FinalizeBlockScope();
3747 // Parsed for-in loop w/ variable declarations. 3747 // Parsed for-in loop w/ variable declarations.
3748 if (init_block != nullptr) { 3748 if (init_block != nullptr) {
3749 init_block->AddStatement(loop, zone()); 3749 init_block->statements()->Add(loop, zone());
3750 if (for_scope != nullptr) { 3750 if (for_scope != nullptr) {
3751 init_block->set_scope(for_scope); 3751 init_block->set_scope(for_scope);
3752 } 3752 }
3753 return init_block; 3753 return init_block;
3754 } else { 3754 } else {
3755 DCHECK_NULL(for_scope); 3755 DCHECK_NULL(for_scope);
3756 return loop; 3756 return loop;
3757 } 3757 }
3758 } else { 3758 } else {
3759 init = parsing_result.BuildInitializationBlock( 3759 init = parsing_result.BuildInitializationBlock(
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
3857 // 3857 //
3858 // into 3858 // into
3859 // 3859 //
3860 // { 3860 // {
3861 // const x = i; 3861 // const x = i;
3862 // for (; c; n) b 3862 // for (; c; n) b
3863 // } 3863 // }
3864 DCHECK(init != NULL); 3864 DCHECK(init != NULL);
3865 Block* block = 3865 Block* block =
3866 factory()->NewBlock(NULL, 2, false, RelocInfo::kNoPosition); 3866 factory()->NewBlock(NULL, 2, false, RelocInfo::kNoPosition);
3867 block->AddStatement(init, zone()); 3867 block->statements()->Add(init, zone());
3868 block->AddStatement(loop, zone()); 3868 block->statements()->Add(loop, zone());
3869 block->set_scope(for_scope); 3869 block->set_scope(for_scope);
3870 loop->Initialize(NULL, cond, next, body); 3870 loop->Initialize(NULL, cond, next, body);
3871 result = block; 3871 result = block;
3872 } else { 3872 } else {
3873 loop->Initialize(init, cond, next, body); 3873 loop->Initialize(init, cond, next, body);
3874 result = loop; 3874 result = loop;
3875 } 3875 }
3876 } 3876 }
3877 return result; 3877 return result;
3878 } 3878 }
(...skipping 658 matching lines...) Expand 10 before | Expand all | Expand 10 after
4537 zone()); 4537 zone());
4538 4538
4539 auto body = factory()->NewExpressionStatement( 4539 auto body = factory()->NewExpressionStatement(
4540 factory()->NewCallRuntime(Runtime::kAppendElement, 4540 factory()->NewCallRuntime(Runtime::kAppendElement,
4541 append_element_args, 4541 append_element_args,
4542 RelocInfo::kNoPosition), 4542 RelocInfo::kNoPosition),
4543 RelocInfo::kNoPosition); 4543 RelocInfo::kNoPosition);
4544 4544
4545 loop->Initialize(init, cond, next, body); 4545 loop->Initialize(init, cond, next, body);
4546 4546
4547 init_block->AddStatement( 4547 init_block->statements()->Add(
4548 factory()->NewExpressionStatement(init_array, RelocInfo::kNoPosition), 4548 factory()->NewExpressionStatement(init_array, RelocInfo::kNoPosition),
4549 zone()); 4549 zone());
4550 4550
4551 init_block->AddStatement(loop, zone()); 4551 init_block->statements()->Add(loop, zone());
4552 4552
4553 descriptor.initialization_pos = pos; 4553 descriptor.initialization_pos = pos;
4554 } 4554 }
4555 4555
4556 Scope* param_scope = scope_; 4556 Scope* param_scope = scope_;
4557 Block* param_block = init_block; 4557 Block* param_block = init_block;
4558 if (!parameter.is_simple() && scope_->calls_sloppy_eval()) { 4558 if (!parameter.is_simple() && scope_->calls_sloppy_eval()) {
4559 param_scope = NewScope(scope_, BLOCK_SCOPE); 4559 param_scope = NewScope(scope_, BLOCK_SCOPE);
4560 param_scope->set_is_declaration_scope(); 4560 param_scope->set_is_declaration_scope();
4561 param_scope->set_start_position(parameter.pattern->position()); 4561 param_scope->set_start_position(parameter.pattern->position());
(...skipping 10 matching lines...) Expand all
4572 parameter.pattern, parameter.pattern->position(), initial_value); 4572 parameter.pattern, parameter.pattern->position(), initial_value);
4573 PatternRewriter::DeclareAndInitializeVariables(param_block, &descriptor, 4573 PatternRewriter::DeclareAndInitializeVariables(param_block, &descriptor,
4574 &decl, nullptr, CHECK_OK); 4574 &decl, nullptr, CHECK_OK);
4575 } 4575 }
4576 4576
4577 if (!parameter.is_simple() && scope_->calls_sloppy_eval()) { 4577 if (!parameter.is_simple() && scope_->calls_sloppy_eval()) {
4578 param_scope = param_scope->FinalizeBlockScope(); 4578 param_scope = param_scope->FinalizeBlockScope();
4579 if (param_scope != nullptr) { 4579 if (param_scope != nullptr) {
4580 CheckConflictingVarDeclarations(param_scope, CHECK_OK); 4580 CheckConflictingVarDeclarations(param_scope, CHECK_OK);
4581 } 4581 }
4582 init_block->AddStatement(param_block, zone()); 4582 init_block->statements()->Add(param_block, zone());
4583 } 4583 }
4584 } 4584 }
4585 return init_block; 4585 return init_block;
4586 } 4586 }
4587 4587
4588 4588
4589 ZoneList<Statement*>* Parser::ParseEagerFunctionBody( 4589 ZoneList<Statement*>* Parser::ParseEagerFunctionBody(
4590 const AstRawString* function_name, int pos, 4590 const AstRawString* function_name, int pos,
4591 const ParserFormalParameters& parameters, FunctionKind kind, 4591 const ParserFormalParameters& parameters, FunctionKind kind,
4592 FunctionLiteral::FunctionType function_type, bool* ok) { 4592 FunctionLiteral::FunctionType function_type, bool* ok) {
(...skipping 1701 matching lines...) Expand 10 before | Expand all | Expand 10 after
6294 6294
6295 Expression* Parser::SpreadCallNew(Expression* function, 6295 Expression* Parser::SpreadCallNew(Expression* function,
6296 ZoneList<v8::internal::Expression*>* args, 6296 ZoneList<v8::internal::Expression*>* args,
6297 int pos) { 6297 int pos) {
6298 args->InsertAt(0, function, zone()); 6298 args->InsertAt(0, function, zone());
6299 6299
6300 return factory()->NewCallRuntime(Context::REFLECT_CONSTRUCT_INDEX, args, pos); 6300 return factory()->NewCallRuntime(Context::REFLECT_CONSTRUCT_INDEX, args, pos);
6301 } 6301 }
6302 } // namespace internal 6302 } // namespace internal
6303 } // namespace v8 6303 } // namespace v8
OLDNEW
« no previous file with comments | « src/ast.h ('k') | src/pattern-rewriter.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698