Chromium Code Reviews| 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; |