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

Side by Side Diff: src/parsing/parser.cc

Issue 2533803002: [parser] removed undefined check of for-of iterator (Closed)
Patch Set: regolden Created 4 years 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 | « no previous file | test/cctest/interpreter/bytecode_expectations/ForOf.golden » ('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/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-expression-rewriter.h" 10 #include "src/ast/ast-expression-rewriter.h"
(...skipping 5413 matching lines...) Expand 10 before | Expand all | Expand 10 after
5424 // 5424 //
5425 // completion = kNormalCompletion; 5425 // completion = kNormalCompletion;
5426 // try { 5426 // try {
5427 // try { 5427 // try {
5428 // #loop; 5428 // #loop;
5429 // } catch(e) { 5429 // } catch(e) {
5430 // if (completion === kAbruptCompletion) completion = kThrowCompletion; 5430 // if (completion === kAbruptCompletion) completion = kThrowCompletion;
5431 // %ReThrow(e); 5431 // %ReThrow(e);
5432 // } 5432 // }
5433 // } finally { 5433 // } finally {
5434 // if (!(completion === kNormalCompletion || IS_UNDEFINED(#iterator))) { 5434 // if (!(completion === kNormalCompletion)) {
neis 2016/11/28 14:52:51 See below.
5435 // #BuildIteratorCloseForCompletion(#iterator, completion) 5435 // #BuildIteratorCloseForCompletion(#iterator, completion)
5436 // } 5436 // }
5437 // } 5437 // }
5438 // 5438 //
5439 // Note that the loop's body and its assign_each already contain appropriate 5439 // Note that the loop's body and its assign_each already contain appropriate
5440 // assignments to completion (see InitializeForOfStatement). 5440 // assignments to completion (see InitializeForOfStatement).
5441 // 5441 //
5442 5442
5443 const int nopos = kNoSourcePosition; 5443 const int nopos = kNoSourcePosition;
5444 5444
5445 // !(completion === kNormalCompletion || IS_UNDEFINED(#iterator)) 5445 // !(completion === kNormalCompletion)
5446 Expression* closing_condition; 5446 Expression* closing_condition;
5447 { 5447 {
5448 Expression* lhs = factory()->NewCompareOperation( 5448 Expression* cmp = factory()->NewCompareOperation(
5449 Token::EQ_STRICT, factory()->NewVariableProxy(var_completion), 5449 Token::EQ_STRICT, factory()->NewVariableProxy(var_completion),
5450 factory()->NewSmiLiteral(Parser::kNormalCompletion, nopos), nopos); 5450 factory()->NewSmiLiteral(Parser::kNormalCompletion, nopos), nopos);
5451 Expression* rhs = factory()->NewCompareOperation( 5451 closing_condition = factory()->NewUnaryOperation(Token::NOT, cmp, nopos);
neis 2016/11/28 14:52:51 You can use NE_STRICT (!==) instead of negating EQ
5452 Token::EQ_STRICT, factory()->NewVariableProxy(loop->iterator()),
5453 factory()->NewUndefinedLiteral(nopos), nopos);
5454 closing_condition = factory()->NewUnaryOperation(
5455 Token::NOT, factory()->NewBinaryOperation(Token::OR, lhs, rhs, nopos),
5456 nopos);
5457 } 5452 }
5458 5453
5459 Block* final_loop = factory()->NewBlock(nullptr, 2, false, nopos); 5454 Block* final_loop = factory()->NewBlock(nullptr, 2, false, nopos);
5460 { 5455 {
5461 Block* try_block = factory()->NewBlock(nullptr, 1, false, nopos); 5456 Block* try_block = factory()->NewBlock(nullptr, 1, false, nopos);
5462 try_block->statements()->Add(loop, zone()); 5457 try_block->statements()->Add(loop, zone());
5463 5458
5464 // The scope in which the parser creates this loop. 5459 // The scope in which the parser creates this loop.
5465 Scope* loop_scope = scope()->outer_scope(); 5460 Scope* loop_scope = scope()->outer_scope();
5466 DCHECK_EQ(loop_scope->scope_type(), BLOCK_SCOPE); 5461 DCHECK_EQ(loop_scope->scope_type(), BLOCK_SCOPE);
5467 DCHECK_EQ(scope()->scope_type(), BLOCK_SCOPE); 5462 DCHECK_EQ(scope()->scope_type(), BLOCK_SCOPE);
5468 5463
5469 FinalizeIteratorUse(loop_scope, var_completion, closing_condition, 5464 FinalizeIteratorUse(loop_scope, var_completion, closing_condition,
5470 loop->iterator(), try_block, final_loop); 5465 loop->iterator(), try_block, final_loop);
5471 } 5466 }
5472 5467
5473 return final_loop; 5468 return final_loop;
5474 } 5469 }
5475 5470
5476 #undef CHECK_OK 5471 #undef CHECK_OK
5477 #undef CHECK_OK_VOID 5472 #undef CHECK_OK_VOID
5478 #undef CHECK_FAILED 5473 #undef CHECK_FAILED
5479 5474
5480 } // namespace internal 5475 } // namespace internal
5481 } // namespace v8 5476 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | test/cctest/interpreter/bytecode_expectations/ForOf.golden » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698