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

Unified Diff: src/interpreter/bytecode-generator.cc

Issue 2882973002: [coverage] Block coverage with support for IfStatements (Closed)
Patch Set: Remove coverage infos Created 3 years, 7 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 side-by-side diff with in-line comments
Download patch
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;

Powered by Google App Engine
This is Rietveld 408576698