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

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

Issue 2882973002: [coverage] Block coverage with support for IfStatements (Closed)
Patch Set: Comment nit 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 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;

Powered by Google App Engine
This is Rietveld 408576698