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

Side by Side Diff: src/interpreter/bytecode-generator.cc

Issue 1406983010: [Interpreter] Ensure ToBoolean bytecodes are correctly emitted at the start of basic blocks (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Review comments. Created 5 years, 1 month 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
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 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/interpreter/bytecode-generator.h" 5 #include "src/interpreter/bytecode-generator.h"
6 6
7 #include "src/compiler.h" 7 #include "src/compiler.h"
8 #include "src/interpreter/control-flow-builders.h" 8 #include "src/interpreter/control-flow-builders.h"
9 #include "src/objects.h" 9 #include "src/objects.h"
10 #include "src/parser.h" 10 #include "src/parser.h"
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after
367 367
368 // Visit declarations within the function scope. 368 // Visit declarations within the function scope.
369 VisitDeclarations(scope()->declarations()); 369 VisitDeclarations(scope()->declarations());
370 370
371 // Visit statements in the function body. 371 // Visit statements in the function body.
372 VisitStatements(info()->literal()->body()); 372 VisitStatements(info()->literal()->body());
373 } 373 }
374 374
375 375
376 void BytecodeGenerator::VisitBlock(Block* stmt) { 376 void BytecodeGenerator::VisitBlock(Block* stmt) {
377 builder()->EnterBlock();
378 if (stmt->scope() == NULL) { 377 if (stmt->scope() == NULL) {
379 // Visit statements in the same scope, no declarations. 378 // Visit statements in the same scope, no declarations.
380 VisitStatements(stmt->statements()); 379 VisitStatements(stmt->statements());
381 } else { 380 } else {
382 // Visit declarations and statements in a block scope. 381 // Visit declarations and statements in a block scope.
383 if (stmt->scope()->NeedsContext()) { 382 if (stmt->scope()->NeedsContext()) {
384 VisitNewLocalBlockContext(stmt->scope()); 383 VisitNewLocalBlockContext(stmt->scope());
385 ContextScope scope(this, stmt->scope()); 384 ContextScope scope(this, stmt->scope());
386 VisitDeclarations(stmt->scope()->declarations()); 385 VisitDeclarations(stmt->scope()->declarations());
387 VisitStatements(stmt->statements()); 386 VisitStatements(stmt->statements());
388 } else { 387 } else {
389 VisitDeclarations(stmt->scope()->declarations()); 388 VisitDeclarations(stmt->scope()->declarations());
390 VisitStatements(stmt->statements()); 389 VisitStatements(stmt->statements());
391 } 390 }
392 } 391 }
393 builder()->LeaveBlock();
394 } 392 }
395 393
396 394
397 void BytecodeGenerator::VisitVariableDeclaration(VariableDeclaration* decl) { 395 void BytecodeGenerator::VisitVariableDeclaration(VariableDeclaration* decl) {
398 Variable* variable = decl->proxy()->var(); 396 Variable* variable = decl->proxy()->var();
399 VariableMode mode = decl->mode(); 397 VariableMode mode = decl->mode();
400 // Const and let variables are initialized with the hole so that we can 398 // Const and let variables are initialized with the hole so that we can
401 // check that they are only assigned once. 399 // check that they are only assigned once.
402 bool hole_init = mode == CONST || mode == CONST_LEGACY || mode == LET; 400 bool hole_init = mode == CONST || mode == CONST_LEGACY || mode == LET;
403 switch (variable->location()) { 401 switch (variable->location()) {
(...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after
775 if (stmt->subject()->IsNullLiteral() || 773 if (stmt->subject()->IsNullLiteral() ||
776 stmt->subject()->IsUndefinedLiteral(isolate())) { 774 stmt->subject()->IsUndefinedLiteral(isolate())) {
777 // ForIn generates lots of code, skip if it wouldn't produce any effects. 775 // ForIn generates lots of code, skip if it wouldn't produce any effects.
778 return; 776 return;
779 } 777 }
780 778
781 LoopBuilder loop_builder(builder()); 779 LoopBuilder loop_builder(builder());
782 ControlScopeForIteration control_scope(this, stmt, &loop_builder); 780 ControlScopeForIteration control_scope(this, stmt, &loop_builder);
783 781
784 // Prepare the state for executing ForIn. 782 // Prepare the state for executing ForIn.
785 builder()->EnterBlock();
786 VisitForAccumulatorValue(stmt->subject()); 783 VisitForAccumulatorValue(stmt->subject());
787 loop_builder.BreakIfUndefined(); 784 loop_builder.BreakIfUndefined();
788 loop_builder.BreakIfNull(); 785 loop_builder.BreakIfNull();
789 786
790 Register receiver = execution_result()->NewRegister(); 787 Register receiver = execution_result()->NewRegister();
791 builder()->CastAccumulatorToJSObject(); 788 builder()->CastAccumulatorToJSObject();
792 builder()->StoreAccumulatorInRegister(receiver); 789 builder()->StoreAccumulatorInRegister(receiver);
793 builder()->CallRuntime(Runtime::kGetPropertyNamesFast, receiver, 1); 790 builder()->CallRuntime(Runtime::kGetPropertyNamesFast, receiver, 1);
794 builder()->ForInPrepare(receiver); 791 builder()->ForInPrepare(receiver);
795 loop_builder.BreakIfUndefined(); 792 loop_builder.BreakIfUndefined();
(...skipping 25 matching lines...) Expand all
821 // even an empty body will have this assignment. 818 // even an empty body will have this assignment.
822 Visit(stmt->body()); 819 Visit(stmt->body());
823 820
824 // Increment the index and start loop again. 821 // Increment the index and start loop again.
825 builder() 822 builder()
826 ->Bind(&continue_label) 823 ->Bind(&continue_label)
827 .LoadAccumulatorWithRegister(index) 824 .LoadAccumulatorWithRegister(index)
828 .CountOperation(Token::Value::ADD, language_mode_strength()) 825 .CountOperation(Token::Value::ADD, language_mode_strength())
829 .Jump(&condition_label); 826 .Jump(&condition_label);
830 827
831 // End of loop 828 // End of the loop.
832 builder()->Bind(&break_label).LeaveBlock(); 829 builder()->Bind(&break_label);
833 830
834 loop_builder.SetBreakTarget(break_label); 831 loop_builder.SetBreakTarget(break_label);
835 loop_builder.SetContinueTarget(continue_label); 832 loop_builder.SetContinueTarget(continue_label);
836 } 833 }
837 834
838 835
839 void BytecodeGenerator::VisitForOfStatement(ForOfStatement* stmt) { 836 void BytecodeGenerator::VisitForOfStatement(ForOfStatement* stmt) {
840 UNIMPLEMENTED(); 837 UNIMPLEMENTED();
841 } 838 }
842 839
(...skipping 1320 matching lines...) Expand 10 before | Expand all | Expand 10 after
2163 } 2160 }
2164 2161
2165 2162
2166 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { 2163 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const {
2167 return info()->feedback_vector()->GetIndex(slot); 2164 return info()->feedback_vector()->GetIndex(slot);
2168 } 2165 }
2169 2166
2170 } // namespace interpreter 2167 } // namespace interpreter
2171 } // namespace internal 2168 } // namespace internal
2172 } // namespace v8 2169 } // namespace v8
OLDNEW
« no previous file with comments | « src/interpreter/bytecode-array-builder.cc ('k') | test/cctest/interpreter/test-bytecode-generator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698