[VM] Consistently use ValidationPolicy in frame iteration APIs

Previously there were places in the code where an API accepted a
`bool validate_frames` and call sites passed an enum value (which
implicitly got converted to a bool).

By changing the APIs to require an enum, the compiler will tell us if a
caller doesn't pass one.

Change-Id: I29fcd0b018e6cdd7e00b5bb03e83b9636d1345d4
Reviewed-on: https://dart-review.googlesource.com/57823
Commit-Queue: Martin Kustermann <kustermann@google.com>
Reviewed-by: RĂ©gis Crelier <regis@google.com>
diff --git a/runtime/lib/stacktrace.cc b/runtime/lib/stacktrace.cc
index a15b9bd..28edcf1 100644
--- a/runtime/lib/stacktrace.cc
+++ b/runtime/lib/stacktrace.cc
@@ -139,7 +139,7 @@
 static void AppendFrames(const GrowableObjectArray& code_list,
                          const GrowableObjectArray& pc_offset_list,
                          int skip_frames) {
-  StackFrameIterator frames(StackFrameIterator::kDontValidateFrames,
+  StackFrameIterator frames(ValidationPolicy::kDontValidateFrames,
                             Thread::Current(),
                             StackFrameIterator::kNoCrossThreadIteration);
   StackFrame* frame = frames.NextFrame();
diff --git a/runtime/vm/become.cc b/runtime/vm/become.cc
index 5a79324..b6512c6 100644
--- a/runtime/vm/become.cc
+++ b/runtime/vm/become.cc
@@ -286,7 +286,8 @@
   }
 
   // C++ pointers.
-  isolate->VisitObjectPointers(&pointer_visitor, true);
+  isolate->VisitObjectPointers(&pointer_visitor,
+                               ValidationPolicy::kValidateFrames);
 #ifndef PRODUCT
   if (FLAG_support_service) {
     ObjectIdRing* ring = isolate->object_id_ring();
diff --git a/runtime/vm/benchmark_test.cc b/runtime/vm/benchmark_test.cc
index ddce675..ffd9821 100644
--- a/runtime/vm/benchmark_test.cc
+++ b/runtime/vm/benchmark_test.cc
@@ -386,7 +386,7 @@
   Timer timer(true, "LookupDartCode benchmark");
   timer.Start();
   for (int i = 0; i < kNumIterations; i++) {
-    StackFrameIterator frames(StackFrameIterator::kDontValidateFrames,
+    StackFrameIterator frames(ValidationPolicy::kDontValidateFrames,
                               Thread::Current(),
                               StackFrameIterator::kNoCrossThreadIteration);
     StackFrame* frame = frames.NextFrame();
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 00cc771..f6587d6 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -674,7 +674,7 @@
   DisassembleToStdout formatter;
   code().Disassemble(&formatter);
   PcDescriptors::Handle(code().pc_descriptors()).Print();
-  StackFrameIterator frames(StackFrameIterator::kDontValidateFrames,
+  StackFrameIterator frames(ValidationPolicy::kDontValidateFrames,
                             Thread::Current(),
                             StackFrameIterator::kNoCrossThreadIteration);
   StackFrame* frame = frames.NextFrame();
@@ -1174,7 +1174,7 @@
   OS::PrintErr(
       "-------------------------\n"
       "All frames...\n\n");
-  StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames,
+  StackFrameIterator iterator(ValidationPolicy::kDontValidateFrames,
                               Thread::Current(),
                               StackFrameIterator::kNoCrossThreadIteration);
   StackFrame* frame = iterator.NextFrame();
@@ -1872,7 +1872,7 @@
   Zone* zone = thread->zone();
   Isolate* isolate = thread->isolate();
   DebuggerStackTrace* stack_trace = new DebuggerStackTrace(8);
-  StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames,
+  StackFrameIterator iterator(ValidationPolicy::kDontValidateFrames,
                               Thread::Current(),
                               StackFrameIterator::kNoCrossThreadIteration);
   Code& code = Code::Handle(zone);
@@ -1961,7 +1961,7 @@
   // asynchronous function. We truncate the remainder of the synchronous
   // stack trace because it contains activations that are part of the
   // asynchronous dispatch mechanisms.
-  StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames,
+  StackFrameIterator iterator(ValidationPolicy::kDontValidateFrames,
                               Thread::Current(),
                               StackFrameIterator::kNoCrossThreadIteration);
   StackFrame* frame = iterator.NextFrame();
@@ -2028,7 +2028,7 @@
   Isolate* isolate = thread->isolate();
   DebuggerStackTrace* stack_trace = new DebuggerStackTrace(8);
 
-  StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames,
+  StackFrameIterator iterator(ValidationPolicy::kDontValidateFrames,
                               Thread::Current(),
                               StackFrameIterator::kNoCrossThreadIteration);
 
@@ -2199,7 +2199,7 @@
 }
 
 ActivationFrame* Debugger::TopDartFrame() const {
-  StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames,
+  StackFrameIterator iterator(ValidationPolicy::kDontValidateFrames,
                               Thread::Current(),
                               StackFrameIterator::kNoCrossThreadIteration);
   StackFrame* frame = iterator.NextFrame();
@@ -3440,7 +3440,7 @@
       OS::PrintErr(
           "-------------------------\n"
           "All frames...\n\n");
-      StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames,
+      StackFrameIterator iterator(ValidationPolicy::kDontValidateFrames,
                                   Thread::Current(),
                                   StackFrameIterator::kNoCrossThreadIteration);
       StackFrame* frame = iterator.NextFrame();
@@ -3558,7 +3558,7 @@
   Function& function = Function::Handle(zone);
 
   // Find the requested frame.
-  StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames,
+  StackFrameIterator iterator(ValidationPolicy::kDontValidateFrames,
                               Thread::Current(),
                               StackFrameIterator::kNoCrossThreadIteration);
   intptr_t current_frame = 0;
@@ -3659,7 +3659,7 @@
     OS::PrintErr(
         "-------------------------\n"
         "All frames...\n\n");
-    StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames,
+    StackFrameIterator iterator(ValidationPolicy::kDontValidateFrames,
                                 Thread::Current(),
                                 StackFrameIterator::kNoCrossThreadIteration);
     StackFrame* frame = iterator.NextFrame();
@@ -3674,7 +3674,7 @@
   Zone* zone = thread->zone();
   Code& code = Code::Handle(zone);
 
-  StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames,
+  StackFrameIterator iterator(ValidationPolicy::kDontValidateFrames,
                               Thread::Current(),
                               StackFrameIterator::kNoCrossThreadIteration);
   intptr_t current_frame = 0;
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index b4bcec3..c5bfcce 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -122,7 +122,7 @@
 }
 
 static void BuildStackTrace(StackTraceBuilder* builder) {
-  StackFrameIterator frames(StackFrameIterator::kDontValidateFrames,
+  StackFrameIterator frames(ValidationPolicy::kDontValidateFrames,
                             Thread::Current(),
                             StackFrameIterator::kNoCrossThreadIteration);
   StackFrame* frame = frames.NextFrame();
@@ -163,7 +163,7 @@
   // can continue in that frame. Sets 'needs_stacktrace' if there is no
   // cath-all handler or if a stack-trace is specified in the catch.
   bool Find() {
-    StackFrameIterator frames(StackFrameIterator::kDontValidateFrames,
+    StackFrameIterator frames(ValidationPolicy::kDontValidateFrames,
                               Thread::Current(),
                               StackFrameIterator::kNoCrossThreadIteration);
     StackFrame* frame = frames.NextFrame();
@@ -342,7 +342,7 @@
 static void FindErrorHandler(uword* handler_pc,
                              uword* handler_sp,
                              uword* handler_fp) {
-  StackFrameIterator frames(StackFrameIterator::kDontValidateFrames,
+  StackFrameIterator frames(ValidationPolicy::kDontValidateFrames,
                             Thread::Current(),
                             StackFrameIterator::kNoCrossThreadIteration);
   StackFrame* frame = frames.NextFrame();
diff --git a/runtime/vm/gc_compactor.cc b/runtime/vm/gc_compactor.cc
index 4aec300..b10d0b6 100644
--- a/runtime/vm/gc_compactor.cc
+++ b/runtime/vm/gc_compactor.cc
@@ -556,7 +556,7 @@
   // N.B.: Heap pointers have already been forwarded. We forward the heap before
   // forwarding the stack to limit the number of places that need to be aware of
   // forwarding when reading stack maps.
-  isolate()->VisitObjectPointers(this, StackFrameIterator::kDontValidateFrames);
+  isolate()->VisitObjectPointers(this, ValidationPolicy::kDontValidateFrames);
 }
 
 }  // namespace dart
diff --git a/runtime/vm/gc_marker.cc b/runtime/vm/gc_marker.cc
index fd0ee4e..21aa17d 100644
--- a/runtime/vm/gc_marker.cc
+++ b/runtime/vm/gc_marker.cc
@@ -475,7 +475,7 @@
   ASSERT(0 <= slice_index && slice_index < num_slices);
   if ((slice_index == 0) || (num_slices <= 1)) {
     isolate->VisitObjectPointers(visitor,
-                                 StackFrameIterator::kDontValidateFrames);
+                                 ValidationPolicy::kDontValidateFrames);
   }
   if ((slice_index == 1) || (num_slices <= 1)) {
     heap_->new_space()->VisitObjectPointers(visitor);
diff --git a/runtime/vm/gdb_helpers.cc b/runtime/vm/gdb_helpers.cc
index a15676c..44ba132 100644
--- a/runtime/vm/gdb_helpers.cc
+++ b/runtime/vm/gdb_helpers.cc
@@ -35,7 +35,7 @@
 // in the middle of a GC or interested in stub frames.
 DART_EXPORT
 void _printStackTrace() {
-  StackFrameIterator frames(StackFrameIterator::kDontValidateFrames,
+  StackFrameIterator frames(ValidationPolicy::kDontValidateFrames,
                             Thread::Current(),
                             StackFrameIterator::kNoCrossThreadIteration);
   StackFrame* frame = frames.NextFrame();
@@ -60,7 +60,7 @@
 DART_EXPORT
 void _printStackTraceWithLocals() {
   PrintObjectPointersVisitor visitor;
-  StackFrameIterator frames(StackFrameIterator::kDontValidateFrames,
+  StackFrameIterator frames(ValidationPolicy::kDontValidateFrames,
                             Thread::Current(),
                             StackFrameIterator::kNoCrossThreadIteration);
   StackFrame* frame = frames.NextFrame();
diff --git a/runtime/vm/heap.cc b/runtime/vm/heap.cc
index a6bf50b..905ba26 100644
--- a/runtime/vm/heap.cc
+++ b/runtime/vm/heap.cc
@@ -267,13 +267,15 @@
   Dart::vm_isolate()->heap()->VisitObjects(visitor);
 }
 
-void HeapIterationScope::IterateObjectPointers(ObjectPointerVisitor* visitor,
-                                               bool validate_frames) {
+void HeapIterationScope::IterateObjectPointers(
+    ObjectPointerVisitor* visitor,
+    ValidationPolicy validate_frames) {
   isolate()->VisitObjectPointers(visitor, validate_frames);
 }
 
-void HeapIterationScope::IterateStackPointers(ObjectPointerVisitor* visitor,
-                                              bool validate_frames) {
+void HeapIterationScope::IterateStackPointers(
+    ObjectPointerVisitor* visitor,
+    ValidationPolicy validate_frames) {
   isolate()->VisitStackPointers(visitor, validate_frames);
 }
 
diff --git a/runtime/vm/heap.h b/runtime/vm/heap.h
index 79e81b2..9678e61 100644
--- a/runtime/vm/heap.h
+++ b/runtime/vm/heap.h
@@ -384,9 +384,9 @@
   void IterateVMIsolateObjects(ObjectVisitor* visitor) const;
 
   void IterateObjectPointers(ObjectPointerVisitor* visitor,
-                             bool validate_frames);
+                             ValidationPolicy validate_frames);
   void IterateStackPointers(ObjectPointerVisitor* visitor,
-                            bool validate_frames);
+                            ValidationPolicy validate_frames);
 
  private:
   Heap* heap_;
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index ae20a77..c00b259 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -1888,7 +1888,7 @@
 bool Isolate::creation_enabled_ = false;
 
 void Isolate::VisitObjectPointers(ObjectPointerVisitor* visitor,
-                                  bool validate_frames) {
+                                  ValidationPolicy validate_frames) {
   ASSERT(visitor != NULL);
 
   // Visit objects in the object store.
@@ -1966,7 +1966,7 @@
 }
 
 void Isolate::VisitStackPointers(ObjectPointerVisitor* visitor,
-                                 bool validate_frames) {
+                                 ValidationPolicy validate_frames) {
   // Visit objects in all threads (e.g., Dart stack, handles in zones).
   thread_registry()->VisitObjectPointers(visitor, validate_frames);
 }
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 6584382..2dad860 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -791,8 +791,10 @@
 
   // Visit all object pointers. Caller must ensure concurrent sweeper is not
   // running, and the visitor must not allocate.
-  void VisitObjectPointers(ObjectPointerVisitor* visitor, bool validate_frames);
-  void VisitStackPointers(ObjectPointerVisitor* visitor, bool validate_frames);
+  void VisitObjectPointers(ObjectPointerVisitor* visitor,
+                           ValidationPolicy validate_frames);
+  void VisitStackPointers(ObjectPointerVisitor* visitor,
+                          ValidationPolicy validate_frames);
 
   void set_user_tag(uword tag) { user_tag_ = tag; }
 
diff --git a/runtime/vm/isolate_reload.cc b/runtime/vm/isolate_reload.cc
index b8f24ef..4832667 100644
--- a/runtime/vm/isolate_reload.cc
+++ b/runtime/vm/isolate_reload.cc
@@ -854,7 +854,7 @@
 
 void IsolateReloadContext::EnsuredUnoptimizedCodeForStack() {
   TIMELINE_SCOPE(EnsuredUnoptimizedCodeForStack);
-  StackFrameIterator it(StackFrameIterator::kDontValidateFrames,
+  StackFrameIterator it(ValidationPolicy::kDontValidateFrames,
                         Thread::Current(),
                         StackFrameIterator::kNoCrossThreadIteration);
 
diff --git a/runtime/vm/object_graph.cc b/runtime/vm/object_graph.cc
index 727857a..6a56a57 100644
--- a/runtime/vm/object_graph.cc
+++ b/runtime/vm/object_graph.cc
@@ -207,7 +207,7 @@
 
 void ObjectGraph::IterateObjects(ObjectGraph::Visitor* visitor) {
   Stack stack(isolate());
-  isolate()->VisitObjectPointers(&stack, false);
+  isolate()->VisitObjectPointers(&stack, ValidationPolicy::kDontValidateFrames);
   stack.TraverseGraph(visitor);
   Unmarker::UnmarkAll(isolate());
 }
@@ -642,7 +642,8 @@
     // Write root "object".
     WriteHeader(kRootAddress, 0, kRootCid, stream);
     WritePointerVisitor ptr_writer(isolate(), stream, false);
-    isolate()->VisitObjectPointers(&ptr_writer, false);
+    isolate()->VisitObjectPointers(&ptr_writer,
+                                   ValidationPolicy::kDontValidateFrames);
     stream->WriteUnsigned(0);
   } else {
     {
@@ -658,7 +659,8 @@
       // Write stack "object".
       WriteHeader(kStackAddress, 0, kStackCid, stream);
       WritePointerVisitor ptr_writer(isolate(), stream, true);
-      isolate()->VisitStackPointers(&ptr_writer, false);
+      isolate()->VisitStackPointers(&ptr_writer,
+                                    ValidationPolicy::kDontValidateFrames);
       stream->WriteUnsigned(0);
     }
   }
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index 5b3ba92..7d83c25 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -539,8 +539,8 @@
       const StackFrameIterator::CrossThreadPolicy cross_thread_policy =
           StackFrameIterator::kNoCrossThreadIteration;
 #endif
-      StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames,
-                                  thread, cross_thread_policy);
+      StackFrameIterator iterator(ValidationPolicy::kDontValidateFrames, thread,
+                                  cross_thread_policy);
       pc_ = NULL;
       fp_ = NULL;
       sp_ = NULL;
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index da751b3..bc13a5b 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -2054,7 +2054,7 @@
 // Patch static call to point to valid code's entry point.
 DEFINE_RUNTIME_ENTRY(FixCallersTarget, 0) {
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames, thread,
+  StackFrameIterator iterator(ValidationPolicy::kDontValidateFrames, thread,
                               StackFrameIterator::kNoCrossThreadIteration);
   StackFrame* frame = iterator.NextFrame();
   ASSERT(frame != NULL);
@@ -2095,7 +2095,7 @@
 // stub.
 DEFINE_RUNTIME_ENTRY(FixAllocationStubTarget, 0) {
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames, thread,
+  StackFrameIterator iterator(ValidationPolicy::kDontValidateFrames, thread,
                               StackFrameIterator::kNoCrossThreadIteration);
   StackFrame* frame = iterator.NextFrame();
   ASSERT(frame != NULL);
diff --git a/runtime/vm/scavenger.cc b/runtime/vm/scavenger.cc
index 87b3b3c..9ca79a7 100644
--- a/runtime/vm/scavenger.cc
+++ b/runtime/vm/scavenger.cc
@@ -578,8 +578,7 @@
 
 void Scavenger::IterateRoots(Isolate* isolate, ScavengerVisitor* visitor) {
   int64_t start = OS::GetCurrentMonotonicMicros();
-  isolate->VisitObjectPointers(visitor,
-                               StackFrameIterator::kDontValidateFrames);
+  isolate->VisitObjectPointers(visitor, ValidationPolicy::kDontValidateFrames);
   int64_t middle = OS::GetCurrentMonotonicMicros();
   IterateStoreBuffers(isolate, visitor);
   IterateObjectIdTable(isolate, visitor);
diff --git a/runtime/vm/simulator_arm.cc b/runtime/vm/simulator_arm.cc
index 9bb3ca9..3415481 100644
--- a/runtime/vm/simulator_arm.cc
+++ b/runtime/vm/simulator_arm.cc
@@ -267,7 +267,7 @@
 void SimulatorDebugger::PrintBacktrace() {
   StackFrameIterator frames(
       sim_->get_register(FP), sim_->get_register(SP), sim_->get_pc(),
-      StackFrameIterator::kDontValidateFrames, Thread::Current(),
+      ValidationPolicy::kDontValidateFrames, Thread::Current(),
       StackFrameIterator::kNoCrossThreadIteration);
   StackFrame* frame = frames.NextFrame();
   ASSERT(frame != NULL);
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
index e482786..020321c 100644
--- a/runtime/vm/simulator_arm64.cc
+++ b/runtime/vm/simulator_arm64.cc
@@ -289,7 +289,7 @@
 void SimulatorDebugger::PrintBacktrace() {
   StackFrameIterator frames(
       sim_->get_register(FP), sim_->get_register(SP), sim_->get_pc(),
-      StackFrameIterator::kDontValidateFrames, Thread::Current(),
+      ValidationPolicy::kDontValidateFrames, Thread::Current(),
       StackFrameIterator::kNoCrossThreadIteration);
   StackFrame* frame = frames.NextFrame();
   ASSERT(frame != NULL);
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index 50105f9..578129c 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -353,7 +353,7 @@
 StackFrameIterator::StackFrameIterator(ValidationPolicy validation_policy,
                                        Thread* thread,
                                        CrossThreadPolicy cross_thread_policy)
-    : validate_(validation_policy == kValidateFrames),
+    : validate_(validation_policy == ValidationPolicy::kValidateFrames),
       entry_(thread),
       exit_(thread),
       frames_(thread),
@@ -368,7 +368,7 @@
                                        ValidationPolicy validation_policy,
                                        Thread* thread,
                                        CrossThreadPolicy cross_thread_policy)
-    : validate_(validation_policy == kValidateFrames),
+    : validate_(validation_policy == ValidationPolicy::kValidateFrames),
       entry_(thread),
       exit_(thread),
       frames_(thread),
@@ -388,7 +388,7 @@
                                        ValidationPolicy validation_policy,
                                        Thread* thread,
                                        CrossThreadPolicy cross_thread_policy)
-    : validate_(validation_policy == kValidateFrames),
+    : validate_(validation_policy == ValidationPolicy::kValidateFrames),
       entry_(thread),
       exit_(thread),
       frames_(thread),
@@ -441,7 +441,7 @@
 #endif  // !defined(TARGET_ARCH_DBC)
     return current_frame_;
   }
-  ASSERT((validate_ == kDontValidateFrames) || current_frame_->IsValid());
+  ASSERT(!validate_ || current_frame_->IsValid());
   if (current_frame_->IsEntryFrame()) {
     if (HasNextFrame()) {  // We have another chained block.
       current_frame_ = NextExitFrame();
@@ -450,7 +450,7 @@
     current_frame_ = NULL;  // No more frames.
     return current_frame_;
   }
-  ASSERT((validate_ == kDontValidateFrames) || current_frame_->IsExitFrame() ||
+  ASSERT(!validate_ || current_frame_->IsExitFrame() ||
          current_frame_->IsDartFrame(validate_) ||
          current_frame_->IsStubFrame());
 
@@ -472,7 +472,7 @@
   sp_ = frame->GetCallerSp();
   fp_ = frame->GetCallerFp();
   pc_ = frame->GetCallerPc();
-  ASSERT((validate == kDontValidateFrames) || frame->IsValid());
+  ASSERT(!validate || frame->IsValid());
   return frame;
 }
 
@@ -483,7 +483,7 @@
   frames_.sp_ = exit_.GetCallerSp();
   frames_.fp_ = exit_.GetCallerFp();
   frames_.pc_ = exit_.GetCallerPc();
-  ASSERT((validate_ == kDontValidateFrames) || exit_.IsValid());
+  ASSERT(!validate_ || exit_.IsValid());
   return &exit_;
 }
 
@@ -493,7 +493,7 @@
   entry_.fp_ = frames_.fp_;
   entry_.pc_ = frames_.pc_;
   SetupNextExitFrameData();  // Setup data for next exit frame in chain.
-  ASSERT((validate_ == kDontValidateFrames) || entry_.IsValid());
+  ASSERT(!validate_ || entry_.IsValid());
   return &entry_;
 }
 
@@ -586,7 +586,7 @@
 
 #if defined(DEBUG)
 void ValidateFrames() {
-  StackFrameIterator frames(StackFrameIterator::kValidateFrames,
+  StackFrameIterator frames(ValidationPolicy::kValidateFrames,
                             Thread::Current(),
                             StackFrameIterator::kNoCrossThreadIteration);
   StackFrame* frame = frames.NextFrame();
diff --git a/runtime/vm/stack_frame.h b/runtime/vm/stack_frame.h
index d809dbc..cfc3d71 100644
--- a/runtime/vm/stack_frame.h
+++ b/runtime/vm/stack_frame.h
@@ -201,10 +201,6 @@
 // concurrently.
 class StackFrameIterator : public ValueObject {
  public:
-  enum ValidationPolicy {
-    kValidateFrames = 0,
-    kDontValidateFrames = 1,
-  };
   enum CrossThreadPolicy {
     kNoCrossThreadIteration = 0,
     kAllowCrossThreadIteration = 1,
@@ -308,7 +304,7 @@
   explicit DartFrameIterator(
       Thread* thread,
       StackFrameIterator::CrossThreadPolicy cross_thread_policy)
-      : frames_(StackFrameIterator::kDontValidateFrames,
+      : frames_(ValidationPolicy::kDontValidateFrames,
                 thread,
                 cross_thread_policy) {}
   explicit DartFrameIterator(
@@ -316,7 +312,7 @@
       Thread* thread,
       StackFrameIterator::CrossThreadPolicy cross_thread_policy)
       : frames_(last_fp,
-                StackFrameIterator::kDontValidateFrames,
+                ValidationPolicy::kDontValidateFrames,
                 thread,
                 cross_thread_policy) {}
 
@@ -329,7 +325,7 @@
       : frames_(fp,
                 sp,
                 pc,
-                StackFrameIterator::kDontValidateFrames,
+                ValidationPolicy::kDontValidateFrames,
                 thread,
                 cross_thread_policy) {}
 #endif
diff --git a/runtime/vm/stack_frame_test.cc b/runtime/vm/stack_frame_test.cc
index eadc9bf..f5c5684 100644
--- a/runtime/vm/stack_frame_test.cc
+++ b/runtime/vm/stack_frame_test.cc
@@ -18,7 +18,7 @@
 
 // Unit test for empty stack frame iteration.
 ISOLATE_UNIT_TEST_CASE(EmptyStackFrameIteration) {
-  StackFrameIterator iterator(StackFrameIterator::kValidateFrames,
+  StackFrameIterator iterator(ValidationPolicy::kValidateFrames,
                               Thread::Current(),
                               StackFrameIterator::kNoCrossThreadIteration);
   EXPECT(!iterator.HasNextFrame());
@@ -50,7 +50,7 @@
 
 void FUNCTION_NAME(StackFrame_frameCount)(Dart_NativeArguments args) {
   int count = 0;
-  StackFrameIterator frames(StackFrameIterator::kValidateFrames,
+  StackFrameIterator frames(ValidationPolicy::kValidateFrames,
                             Thread::Current(),
                             StackFrameIterator::kNoCrossThreadIteration);
   while (frames.NextFrame() != NULL) {
diff --git a/runtime/vm/stack_trace.cc b/runtime/vm/stack_trace.cc
index 0174f5c..8f5829d 100644
--- a/runtime/vm/stack_trace.cc
+++ b/runtime/vm/stack_trace.cc
@@ -13,7 +13,7 @@
                                       const Function& async_function) {
   Zone* zone = thread->zone();
   intptr_t frame_count = 0;
-  StackFrameIterator frames(StackFrameIterator::kDontValidateFrames, thread,
+  StackFrameIterator frames(ValidationPolicy::kDontValidateFrames, thread,
                             StackFrameIterator::kNoCrossThreadIteration);
   StackFrame* frame = frames.NextFrame();
   ASSERT(frame != NULL);  // We expect to find a dart invocation frame.
@@ -48,7 +48,7 @@
                                         intptr_t count,
                                         int skip_frames) {
   Zone* zone = thread->zone();
-  StackFrameIterator frames(StackFrameIterator::kDontValidateFrames, thread,
+  StackFrameIterator frames(ValidationPolicy::kDontValidateFrames, thread,
                             StackFrameIterator::kNoCrossThreadIteration);
   StackFrame* frame = frames.NextFrame();
   ASSERT(frame != NULL);  // We expect to find a dart invocation frame.
diff --git a/runtime/vm/thread.cc b/runtime/vm/thread.cc
index 5f31782..aec2bf7 100644
--- a/runtime/vm/thread.cc
+++ b/runtime/vm/thread.cc
@@ -632,7 +632,7 @@
 }
 
 void Thread::VisitObjectPointers(ObjectPointerVisitor* visitor,
-                                 bool validate_frames) {
+                                 ValidationPolicy validation_policy) {
   ASSERT(visitor != NULL);
 
   if (zone_ != NULL) {
@@ -668,10 +668,6 @@
   const StackFrameIterator::CrossThreadPolicy cross_thread_policy =
       StackFrameIterator::kAllowCrossThreadIteration;
 
-  const StackFrameIterator::ValidationPolicy validation_policy =
-      validate_frames ? StackFrameIterator::kValidateFrames
-                      : StackFrameIterator::kDontValidateFrames;
-
   // Iterate over all the stack frames and visit objects on the stack.
   StackFrameIterator frames_iterator(top_exit_frame_info(), validation_policy,
                                      this, cross_thread_policy);
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index c90586b..063c4ef 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -15,6 +15,7 @@
 #include "vm/os_thread.h"
 #include "vm/runtime_entry_list.h"
 #include "vm/store_buffer.h"
+
 namespace dart {
 
 class AbstractType;
@@ -167,6 +168,11 @@
   CACHED_VM_OBJECTS_LIST(V)                                                    \
   CACHED_ADDRESSES_LIST(V)
 
+enum class ValidationPolicy {
+  kValidateFrames = 0,
+  kDontValidateFrames = 1,
+};
+
 // A VM thread; may be executing Dart code or performing helper tasks like
 // garbage collection or compilation. The Thread structure associated with
 // a thread is allocated by EnsureInit before entering an isolate, and destroyed
@@ -735,7 +741,8 @@
   Thread* next() const { return next_; }
 
   // Visit all object pointers.
-  void VisitObjectPointers(ObjectPointerVisitor* visitor, bool validate_frames);
+  void VisitObjectPointers(ObjectPointerVisitor* visitor,
+                           ValidationPolicy validate_frames);
 
   bool IsValidHandle(Dart_Handle object) const;
   bool IsValidLocalHandle(Dart_Handle object) const;
diff --git a/runtime/vm/thread_registry.cc b/runtime/vm/thread_registry.cc
index c388840..c7883af 100644
--- a/runtime/vm/thread_registry.cc
+++ b/runtime/vm/thread_registry.cc
@@ -60,7 +60,7 @@
 }
 
 void ThreadRegistry::VisitObjectPointers(ObjectPointerVisitor* visitor,
-                                         bool validate_frames) {
+                                         ValidationPolicy validate_frames) {
   MonitorLocker ml(threads_lock());
   bool mutator_thread_visited = false;
   Thread* thread = active_list_;
diff --git a/runtime/vm/thread_registry.h b/runtime/vm/thread_registry.h
index cefcf05..f2426d5 100644
--- a/runtime/vm/thread_registry.h
+++ b/runtime/vm/thread_registry.h
@@ -29,7 +29,8 @@
         mutator_thread_(NULL) {}
   ~ThreadRegistry();
 
-  void VisitObjectPointers(ObjectPointerVisitor* visitor, bool validate_frames);
+  void VisitObjectPointers(ObjectPointerVisitor* visitor,
+                           ValidationPolicy validate_frames);
   void PrepareForGC();
   Thread* mutator_thread() const { return mutator_thread_; }
 
diff --git a/runtime/vm/thread_test.cc b/runtime/vm/thread_test.cc
index b00cd0a..e033319 100644
--- a/runtime/vm/thread_test.cc
+++ b/runtime/vm/thread_test.cc
@@ -131,7 +131,7 @@
         ObjectCounter counter(isolate_, &smi);
         // Ensure that our particular zone is visited.
         iteration.IterateStackPointers(&counter,
-                                       StackFrameIterator::kValidateFrames);
+                                       ValidationPolicy::kValidateFrames);
         EXPECT_EQ(1, counter.count());
       }
       char* unique_chars = zone->PrintToString("unique_str_%" Pd, id_);
@@ -148,7 +148,7 @@
         ObjectCounter str_counter(isolate_, &unique_str);
         // Ensure that our particular zone is visited.
         iteration.IterateStackPointers(&str_counter,
-                                       StackFrameIterator::kValidateFrames);
+                                       ValidationPolicy::kValidateFrames);
         // We should visit the string object exactly once.
         EXPECT_EQ(1, str_counter.count());
       }
@@ -429,7 +429,7 @@
         ASSERT(thread->IsAtSafepoint());
         ObjectCounter counter(isolate_, &smi);
         iteration.IterateStackPointers(&counter,
-                                       StackFrameIterator::kValidateFrames);
+                                       ValidationPolicy::kValidateFrames);
         {
           MonitorLocker ml(monitor_);
           EXPECT_EQ(*expected_count_, counter.count());
diff --git a/runtime/vm/verifier.cc b/runtime/vm/verifier.cc
index 83f00d2..65d854b 100644
--- a/runtime/vm/verifier.cc
+++ b/runtime/vm/verifier.cc
@@ -74,8 +74,7 @@
 
   VerifyPointersVisitor visitor(isolate, allocated_set);
   // Visit all strongly reachable objects.
-  iteration.IterateObjectPointers(&visitor,
-                                  StackFrameIterator::kValidateFrames);
+  iteration.IterateObjectPointers(&visitor, ValidationPolicy::kValidateFrames);
   VerifyWeakPointersVisitor weak_visitor(&visitor);
   // Visit weak handles and prologue weak handles.
   isolate->VisitWeakPersistentHandles(&weak_visitor);