Index: src/interpreter/bytecode-generator.cc |
diff --git a/src/interpreter/bytecode-generator.cc b/src/interpreter/bytecode-generator.cc |
index 1eb4fdc147ab735034968799b0b32029ec5e89cf..eb43915761cb94f569e06165620b48df9e9c97aa 100644 |
--- a/src/interpreter/bytecode-generator.cc |
+++ b/src/interpreter/bytecode-generator.cc |
@@ -646,6 +646,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), |
@@ -657,6 +658,13 @@ BytecodeGenerator::BytecodeGenerator(CompilationInfo* info) |
Handle<BytecodeArray> BytecodeGenerator::FinalizeBytecode(Isolate* isolate) { |
AllocateDeferredConstants(isolate); |
+ |
+ if (is_block_coverage()) { |
+ Handle<CoverageInfo> coverage_info = |
+ isolate->factory()->NewCoverageInfo(block_coverage_slots_); |
+ info()->shared_info()->set_coverage_info(*coverage_info); |
rmcilroy
2017/05/18 14:17:59
We don't set things in the shared_info in the byte
jgruber
2017/05/22 09:43:32
I changed this to store the CoverageInfo on Compil
|
+ } |
+ |
if (HasStackOverflow()) return Handle<BytecodeArray>(); |
return builder()->ToBytecodeArray(isolate); |
} |
@@ -1056,12 +1064,15 @@ void BytecodeGenerator::VisitEmptyStatement(EmptyStatement* stmt) { |
void BytecodeGenerator::VisitIfStatement(IfStatement* stmt) { |
builder()->SetStatementPosition(stmt); |
+ |
if (stmt->condition()->ToBooleanIsTrue()) { |
// Generate then block unconditionally as always true. |
+ IncBlockCounter(stmt->then_range()); |
Visit(stmt->then_statement()); |
} else if (stmt->condition()->ToBooleanIsFalse()) { |
// Generate else block unconditionally if it exists. |
if (stmt->HasElseStatement()) { |
+ IncBlockCounter(stmt->else_range()); |
Visit(stmt->else_statement()); |
} |
} else { |
@@ -1074,11 +1085,13 @@ void BytecodeGenerator::VisitIfStatement(IfStatement* stmt) { |
TestFallthrough::kThen); |
then_labels.Bind(builder()); |
+ IncBlockCounter(stmt->then_range()); |
Visit(stmt->then_statement()); |
if (stmt->HasElseStatement()) { |
builder()->Jump(&end_label); |
else_labels.Bind(builder()); |
+ IncBlockCounter(stmt->else_range()); |
Visit(stmt->else_statement()); |
} else { |
else_labels.Bind(builder()); |
@@ -3681,6 +3694,11 @@ int BytecodeGenerator::feedback_index(FeedbackSlot slot) const { |
return FeedbackVector::GetIndex(slot); |
} |
+bool BytecodeGenerator::is_block_coverage() const { |
+ return FLAG_block_coverage && |
+ info()->parse_info()->script()->IsUserJavaScript(); |
+} |
+ |
Runtime::FunctionId BytecodeGenerator::StoreToSuperRuntimeId() { |
return is_strict(language_mode()) ? Runtime::kStoreToSuper_Strict |
: Runtime::kStoreToSuper_Sloppy; |