| 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;
|
|
|