Index: src/interpreter/bytecode-generator.cc |
diff --git a/src/interpreter/bytecode-generator.cc b/src/interpreter/bytecode-generator.cc |
index b754897e759335c90ea8c4a94555f3d22d3e6a9f..95e1316607f636fc194cf690b9d67b1768a8e127 100644 |
--- a/src/interpreter/bytecode-generator.cc |
+++ b/src/interpreter/bytecode-generator.cc |
@@ -772,6 +772,7 @@ BytecodeGenerator::BytecodeGenerator(CompilationInfo* info) |
native_function_literals_(0, info->zone()), |
object_literals_(0, info->zone()), |
array_literals_(0, info->zone()), |
+ block_coverage_slots_(0, info->zone()), |
execution_control_(nullptr), |
execution_context_(nullptr), |
execution_result_(nullptr), |
@@ -783,6 +784,12 @@ BytecodeGenerator::BytecodeGenerator(CompilationInfo* info) |
Handle<BytecodeArray> BytecodeGenerator::FinalizeBytecode(Isolate* isolate) { |
AllocateDeferredConstants(isolate); |
+ |
+ if (is_block_coverage()) { |
+ info()->set_coverage_info( |
+ isolate->factory()->NewCoverageInfo(block_coverage_slots_)); |
+ } |
+ |
if (HasStackOverflow()) return Handle<BytecodeArray>(); |
return builder()->ToBytecodeArray(isolate); |
} |
@@ -1184,12 +1191,18 @@ void BytecodeGenerator::VisitEmptyStatement(EmptyStatement* stmt) { |
void BytecodeGenerator::VisitIfStatement(IfStatement* stmt) { |
builder()->SetStatementPosition(stmt); |
+ |
+ int then_slot = AllocateBlockCoverageSlot(stmt->then_range()); |
+ int else_slot = AllocateBlockCoverageSlot(stmt->else_range()); |
+ |
if (stmt->condition()->ToBooleanIsTrue()) { |
// Generate then block unconditionally as always true. |
+ IncBlockCounter(then_slot); |
Visit(stmt->then_statement()); |
} else if (stmt->condition()->ToBooleanIsFalse()) { |
// Generate else block unconditionally if it exists. |
if (stmt->HasElseStatement()) { |
+ IncBlockCounter(else_slot); |
Visit(stmt->else_statement()); |
} |
} else { |
@@ -1202,11 +1215,13 @@ void BytecodeGenerator::VisitIfStatement(IfStatement* stmt) { |
TestFallthrough::kThen); |
then_labels.Bind(builder()); |
+ IncBlockCounter(then_slot); |
Visit(stmt->then_statement()); |
if (stmt->HasElseStatement()) { |
builder()->Jump(&end_label); |
else_labels.Bind(builder()); |
+ IncBlockCounter(else_slot); |
Visit(stmt->else_statement()); |
} else { |
else_labels.Bind(builder()); |
@@ -3899,6 +3914,11 @@ int BytecodeGenerator::feedback_index(FeedbackSlot slot) const { |
return FeedbackVector::GetIndex(slot); |
} |
+bool BytecodeGenerator::is_block_coverage() const { |
+ DCHECK_IMPLIES(info()->is_block_coverage_enabled(), FLAG_block_coverage); |
+ return info()->is_block_coverage_enabled(); |
+} |
+ |
Runtime::FunctionId BytecodeGenerator::StoreToSuperRuntimeId() { |
return is_strict(language_mode()) ? Runtime::kStoreToSuper_Strict |
: Runtime::kStoreToSuper_Sloppy; |