tp: fix GetNonNull function for dense nullable vector

Change-Id: I375d26b286540c3878cc38ee524fb16e475d7c74
diff --git a/src/trace_processor/containers/nullable_vector.h b/src/trace_processor/containers/nullable_vector.h
index b9932d2..2a623c6 100644
--- a/src/trace_processor/containers/nullable_vector.h
+++ b/src/trace_processor/containers/nullable_vector.h
@@ -104,11 +104,12 @@
   // GetNonNull(2) = 4
   // ...
   T GetNonNull(uint32_t ordinal) const {
-    // TODO(lalitm): the semtantics of this method really doesn't make
-    // sense with dense mode. Reevaluate what we should do in that case.
-    PERFETTO_DCHECK(mode_ == Mode::kSparse);
-    PERFETTO_DCHECK(ordinal < data_.size());
-    return data_[ordinal];
+    if (mode_ == Mode::kDense) {
+      return data_[valid_.Get(ordinal)];
+    } else {
+      PERFETTO_DCHECK(ordinal < data_.size());
+      return data_[ordinal];
+    }
   }
 
   // Adds the given value to the NullableVector.
diff --git a/src/trace_processor/containers/nullable_vector_unittest.cc b/src/trace_processor/containers/nullable_vector_unittest.cc
index e9aabbe..37a8b78 100644
--- a/src/trace_processor/containers/nullable_vector_unittest.cc
+++ b/src/trace_processor/containers/nullable_vector_unittest.cc
@@ -86,9 +86,16 @@
   ASSERT_EQ(sv.Get(3), 3);
   ASSERT_EQ(sv.Get(4), base::nullopt);
 
+  ASSERT_EQ(sv.GetNonNull(0), 0);
+  ASSERT_EQ(sv.GetNonNull(1), 2);
+  ASSERT_EQ(sv.GetNonNull(2), 3);
+
   sv.Set(1, 1);
   ASSERT_EQ(sv.Get(1), 1);
   ASSERT_EQ(sv.Get(2), 2);
+
+  ASSERT_EQ(sv.GetNonNull(1), 1);
+  ASSERT_EQ(sv.GetNonNull(2), 2);
 }
 
 }  // namespace