[vm] Assert Object::Allocate has the correct safepoint state.

Add missing transitions to tests.

Change-Id: Ib0f820b4c32c13f7caf2149280b124b505856837
Reviewed-on: https://dart-review.googlesource.com/72553
Reviewed-by: Zach Anderson <zra@google.com>
Reviewed-by: Ben Konyi <bkonyi@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 1280942..e2862c4 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -4939,6 +4939,7 @@
 static Dart_Handle PrivateLibName(Dart_Handle lib, const char* str) {
   EXPECT(Dart_IsLibrary(lib));
   Thread* thread = Thread::Current();
+  TransitionNativeToVM transition(thread);
   const Library& library_obj = Api::UnwrapLibraryHandle(thread->zone(), lib);
   const String& name = String::Handle(String::New(str));
   return Api::NewHandle(thread, library_obj.PrivateName(name));
diff --git a/runtime/vm/guard_field_test.cc b/runtime/vm/guard_field_test.cc
index 0feabcc..4170370 100644
--- a/runtime/vm/guard_field_test.cc
+++ b/runtime/vm/guard_field_test.cc
@@ -63,6 +63,7 @@
   Dart_Handle lib = TestCase::LoadTestScript(script_chars, NULL);
   Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
+  TransitionNativeToVM transition(thread);
   Field& f1 = Field::ZoneHandle(LookupField(lib, "A", "f1"));
   Field& f2 = Field::ZoneHandle(LookupField(lib, "A", "f2"));
   Field& f3 = Field::ZoneHandle(LookupField(lib, "A", "f3"));
@@ -113,6 +114,7 @@
   Dart_Handle lib = TestCase::LoadTestScript(script_chars, NULL);
   Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
+  TransitionNativeToVM transition(thread);
   Field& f1 = Field::ZoneHandle(LookupField(lib, "A", "f1"));
   Field& f2 = Field::ZoneHandle(LookupField(lib, "A", "f2"));
   Field& f3 = Field::ZoneHandle(LookupField(lib, "A", "f3"));
@@ -165,6 +167,7 @@
   Dart_Handle lib = TestCase::LoadTestScript(script_chars, NULL);
   Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
+  TransitionNativeToVM transition(thread);
   Field& f1 = Field::ZoneHandle(LookupField(lib, "A", "f1"));
   Field& f2 = Field::ZoneHandle(LookupField(lib, "A", "f2"));
   Field& f3 = Field::ZoneHandle(LookupField(lib, "A", "f3"));
@@ -220,6 +223,7 @@
       "}\n";
   Dart_Handle lib = TestCase::LoadTestScript(script_chars, NULL);
   Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+  TransitionNativeToVM transition(thread);
   EXPECT_VALID(result);
   Field& f1 = Field::ZoneHandle(LookupField(lib, "A", "f1"));
   Field& f2 = Field::ZoneHandle(LookupField(lib, "A", "f2"));
@@ -269,6 +273,7 @@
   Dart_Handle lib = TestCase::LoadTestScript(script_chars, NULL);
   Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
+  TransitionNativeToVM transition(thread);
   Field& f3 = Field::ZoneHandle(LookupField(lib, "A", "f3"));
   const intptr_t no_length = Field::kNoFixedLength;
   EXPECT_EQ(no_length, f3.guarded_list_length());
diff --git a/runtime/vm/isolate_reload_test.cc b/runtime/vm/isolate_reload_test.cc
index 9f56a44..171292f 100644
--- a/runtime/vm/isolate_reload_test.cc
+++ b/runtime/vm/isolate_reload_test.cc
@@ -2301,7 +2301,7 @@
                SimpleInvokeStr(lib, "main"));
 }
 
-TEST_CASE(IsolateReload_DirectSubclasses_Success) {
+ISOLATE_UNIT_TEST_CASE(IsolateReload_DirectSubclasses_Success) {
   Object& new_subclass = Object::Handle();
   String& name = String::Handle();
 
@@ -2323,9 +2323,12 @@
       "  return 1;\n"
       "}\n";
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
-  EXPECT_EQ(1, SimpleInvoke(lib, "main"));
+  {
+    TransitionVMToNative transition(thread);
+    Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+    EXPECT_VALID(lib);
+    EXPECT_EQ(1, SimpleInvoke(lib, "main"));
+  }
 
   // Iterator has one non-core subclass.
   subclasses = iterator_cls.direct_subclasses();
@@ -2345,9 +2348,12 @@
       "  return 2;\n"
       "}\n";
 
-  lib = TestCase::ReloadTestScript(kReloadScript);
-  EXPECT_VALID(lib);
-  EXPECT_EQ(2, SimpleInvoke(lib, "main"));
+  {
+    TransitionVMToNative transition(thread);
+    Dart_Handle lib = TestCase::ReloadTestScript(kReloadScript);
+    EXPECT_VALID(lib);
+    EXPECT_EQ(2, SimpleInvoke(lib, "main"));
+  }
 
   // Iterator still has only one non-core subclass (AIterator is gone).
   subclasses = iterator_cls.direct_subclasses();
@@ -2359,7 +2365,7 @@
   EXPECT_STREQ("BIterator", name.ToCString());
 }
 
-TEST_CASE(IsolateReload_DirectSubclasses_GhostSubclass) {
+ISOLATE_UNIT_TEST_CASE(IsolateReload_DirectSubclasses_GhostSubclass) {
   Object& new_subclass = Object::Handle();
   String& name = String::Handle();
 
@@ -2381,9 +2387,12 @@
       "  return 1;\n"
       "}\n";
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
-  EXPECT_EQ(1, SimpleInvoke(lib, "main"));
+  {
+    TransitionVMToNative transition(thread);
+    Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+    EXPECT_VALID(lib);
+    EXPECT_EQ(1, SimpleInvoke(lib, "main"));
+  }
 
   // Iterator has one new subclass.
   subclasses = iterator_cls.direct_subclasses();
@@ -2401,9 +2410,12 @@
       "  return 2;\n"
       "}\n";
 
-  lib = TestCase::ReloadTestScript(kReloadScript);
-  EXPECT_VALID(lib);
-  EXPECT_EQ(2, SimpleInvoke(lib, "main"));
+  {
+    TransitionVMToNative transition(thread);
+    Dart_Handle lib = TestCase::ReloadTestScript(kReloadScript);
+    EXPECT_VALID(lib);
+    EXPECT_EQ(2, SimpleInvoke(lib, "main"));
+  }
 
   // Iterator has two non-core subclasses.
   subclasses = iterator_cls.direct_subclasses();
@@ -2420,7 +2432,7 @@
 }
 
 // Make sure that we restore the direct subclass info when we revert.
-TEST_CASE(IsolateReload_DirectSubclasses_Failure) {
+ISOLATE_UNIT_TEST_CASE(IsolateReload_DirectSubclasses_Failure) {
   Object& new_subclass = Object::Handle();
   String& name = String::Handle();
 
@@ -2447,9 +2459,12 @@
       "  return 1;\n"
       "}\n";
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
-  EXPECT_EQ(1, SimpleInvoke(lib, "main"));
+  {
+    TransitionVMToNative transition(thread);
+    Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+    EXPECT_VALID(lib);
+    EXPECT_EQ(1, SimpleInvoke(lib, "main"));
+  }
 
   // Iterator has one non-core subclass...
   EXPECT_EQ(saved_subclass_count + 1, subclasses.Length());
@@ -2473,11 +2488,14 @@
       "  return 2;\n"
       "}\n";
 
-  lib = TestCase::ReloadTestScript(kReloadScript);
-  if (TestCase::UsingDartFrontend()) {
-    EXPECT_ERROR(lib, "Expected ';' after this");
-  } else {
-    EXPECT_ERROR(lib, "unexpected token");
+  {
+    TransitionVMToNative transition(thread);
+    Dart_Handle lib = TestCase::ReloadTestScript(kReloadScript);
+    if (TestCase::UsingDartFrontend()) {
+      EXPECT_ERROR(lib, "Expected ';' after this");
+    } else {
+      EXPECT_ERROR(lib, "unexpected token");
+    }
   }
 
   // If we don't clean up the subclasses, we would find BIterator in
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index af57957..c7cdf97 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -2016,10 +2016,11 @@
 RawObject* Object::Allocate(intptr_t cls_id, intptr_t size, Heap::Space space) {
   ASSERT(Utils::IsAligned(size, kObjectAlignment));
   Thread* thread = Thread::Current();
-  Isolate* isolate = thread->isolate();
   // New space allocation allowed only in mutator thread (Dart thread);
   ASSERT(thread->IsMutatorThread() || (space != Heap::kNew));
+  ASSERT(thread->execution_state() == Thread::kThreadInVM);
   ASSERT(thread->no_callback_scope_depth() == 0);
+  Isolate* isolate = thread->isolate();
   Heap* heap = isolate->heap();
 
   uword address = heap->Allocate(size, space);
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 1caf9ec..9af09d4 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -2272,7 +2272,7 @@
   }
 }
 
-TEST_CASE(Script) {
+ISOLATE_UNIT_TEST_CASE(Script) {
   const char* url_chars = "builtin:test-case";
   const char* source_chars = "This will not compile.";
   const String& url = String::Handle(String::New(url_chars));
@@ -2292,6 +2292,7 @@
   EXPECT_EQ('n', str.CharAt(10));
   EXPECT_EQ('.', str.CharAt(21));
 
+  TransitionVMToNative transition(thread);
   const char* kScript = "main() {}";
   Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
   EXPECT_VALID(h_lib);
@@ -3918,6 +3919,7 @@
       "  }\n"
       "}";
   TestCase::LoadTestScript(kScriptChars, NULL);
+  TransitionNativeToVM transition(thread);
   EXPECT(ClassFinalizer::ProcessPendingClasses());
   const String& name = String::Handle(String::New(TestCase::url()));
   const Library& lib = Library::Handle(Library::LookupLibrary(thread, name));
@@ -3979,13 +3981,19 @@
   Dart_Handle result = Dart_Invoke(lib, NewString("test"), 0, NULL);
   EXPECT_VALID(result);
 
+  Function& func_b = Function::Handle();
+  {
+    TransitionNativeToVM transition(thread);
+    const String& name = String::Handle(String::New(TestCase::url()));
+    const Library& vmlib =
+        Library::Handle(Library::LookupLibrary(thread, name));
+    EXPECT(!vmlib.IsNull());
+    const Class& class_a = Class::Handle(
+        vmlib.LookupClass(String::Handle(Symbols::New(thread, "A"))));
+    func_b = GetFunction(class_a, "b");
+  }
+
   // With no breakpoint, function A.b is inlineable.
-  const String& name = String::Handle(String::New(TestCase::url()));
-  const Library& vmlib = Library::Handle(Library::LookupLibrary(thread, name));
-  EXPECT(!vmlib.IsNull());
-  const Class& class_a = Class::Handle(
-      vmlib.LookupClass(String::Handle(Symbols::New(thread, "A"))));
-  const Function& func_b = Function::Handle(GetFunction(class_a, "b"));
   EXPECT(func_b.CanBeInlined());
 
   // After setting a breakpoint in a function A.b, it is no longer inlineable.
@@ -4350,6 +4358,8 @@
   EXPECT(!lib.IsNull());
   Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
+
+  TransitionNativeToVM transition(thread);
   const Class& clazz = Class::Handle(GetClass(lib, "A"));
   EXPECT(!clazz.IsNull());
   const Instance& a0 = Instance::Handle(Instance::New(clazz));
@@ -4377,6 +4387,8 @@
   EXPECT_VALID(h_result);
   Integer& result = Integer::Handle();
   result ^= Api::UnwrapHandle(h_result);
+
+  TransitionNativeToVM transition(thread);
   String& foo = String::Handle(String::New("foo"));
   Integer& expected = Integer::Handle();
   expected ^= foo.HashCode();
diff --git a/runtime/vm/parser_test.cc b/runtime/vm/parser_test.cc
index c7daf5f..58c0125 100644
--- a/runtime/vm/parser_test.cc
+++ b/runtime/vm/parser_test.cc
@@ -206,6 +206,7 @@
 static void SaveVars(Dart_IsolateId isolate_id,
                      intptr_t bp_id,
                      const Dart_CodeLocation& loc) {
+  TransitionNativeToVM transition(Thread::Current());
   DebuggerStackTrace* stack = Isolate::Current()->debugger()->StackTrace();
   intptr_t num_frames = stack->Length();
   const int kBufferLen = 2048;
diff --git a/runtime/vm/profiler_test.cc b/runtime/vm/profiler_test.cc
index 5d3d00b0..f69e319 100644
--- a/runtime/vm/profiler_test.cc
+++ b/runtime/vm/profiler_test.cc
@@ -148,15 +148,19 @@
 }
 
 static RawClass* GetClass(const Library& lib, const char* name) {
-  const Class& cls = Class::Handle(lib.LookupClassAllowPrivate(
-      String::Handle(Symbols::New(Thread::Current(), name))));
+  Thread* thread = Thread::Current();
+  TransitionNativeToVM transition(thread);
+  const Class& cls = Class::Handle(
+      lib.LookupClassAllowPrivate(String::Handle(Symbols::New(thread, name))));
   EXPECT(!cls.IsNull());  // No ambiguity error expected.
   return cls.raw();
 }
 
 static RawFunction* GetFunction(const Library& lib, const char* name) {
+  Thread* thread = Thread::Current();
+  TransitionNativeToVM transition(thread);
   const Function& func = Function::Handle(lib.LookupFunctionAllowPrivate(
-      String::Handle(Symbols::New(Thread::Current(), name))));
+      String::Handle(Symbols::New(thread, name))));
   EXPECT(!func.IsNull());  // No ambiguity error expected.
   return func.raw();
 }
diff --git a/runtime/vm/scanner_test.cc b/runtime/vm/scanner_test.cc
index 93fa232..f7546cb 100644
--- a/runtime/vm/scanner_test.cc
+++ b/runtime/vm/scanner_test.cc
@@ -378,7 +378,7 @@
   EXPECT_EQ('\n', litchars[3]);
 }
 
-TEST_CASE(Scanner_Test) {
+ISOLATE_UNIT_TEST_CASE(Scanner_Test) {
   ScanLargeText();
 
   BoringTest();
diff --git a/runtime/vm/service_test.cc b/runtime/vm/service_test.cc
index a8c6b2f..d132892 100644
--- a/runtime/vm/service_test.cc
+++ b/runtime/vm/service_test.cc
@@ -76,8 +76,12 @@
 
 static RawArray* Eval(Dart_Handle lib, const char* expr) {
   const String& dummy_isolate_id = String::Handle(String::New("isolateId"));
-  Dart_Handle expr_val = Dart_EvaluateStaticExpr(lib, NewString(expr));
-  EXPECT_VALID(expr_val);
+  Dart_Handle expr_val;
+  {
+    TransitionVMToNative transiton(Thread::Current());
+    expr_val = Dart_EvaluateStaticExpr(lib, NewString(expr));
+    EXPECT_VALID(expr_val);
+  }
   Zone* zone = Thread::Current()->zone();
   const GrowableObjectArray& value =
       Api::UnwrapGrowableObjectArrayHandle(zone, expr_val);
@@ -126,33 +130,30 @@
 }
 
 static void HandleIsolateMessage(Isolate* isolate, const Array& msg) {
-  TransitionNativeToVM transition(Thread::Current());
   Service::HandleIsolateMessage(isolate, msg);
 }
 
 static void HandleRootMessage(const Array& message) {
-  TransitionNativeToVM transition(Thread::Current());
   Service::HandleRootMessage(message);
 }
 
-TEST_CASE(Service_IsolateStickyError) {
+ISOLATE_UNIT_TEST_CASE(Service_IsolateStickyError) {
   const char* kScript = "main() => throw 'HI THERE STICKY';\n";
 
   Isolate* isolate = thread->isolate();
   isolate->set_is_runnable(true);
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
-  Library& vmlib = Library::Handle();
-  vmlib ^= Api::UnwrapHandle(lib);
-  EXPECT(!vmlib.IsNull());
-  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT(Dart_IsUnhandledExceptionError(result));
-  EXPECT(!Dart_HasStickyError());
+  Dart_Handle result;
+  {
+    TransitionVMToNative transition(thread);
+    Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+    EXPECT_VALID(lib);
+    result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+    EXPECT(Dart_IsUnhandledExceptionError(result));
+    EXPECT(!Dart_HasStickyError());
+  }
   EXPECT(Thread::Current()->sticky_error() == Error::null());
 
   {
-    TransitionNativeToVM transition(thread);
-
     JSONStream js;
     isolate->PrintJSON(&js, false);
     // No error property and no PauseExit state.
@@ -161,14 +162,15 @@
     EXPECT_NOTSUBSTRING("PauseExit", js.ToCString());
   }
 
-  // Set the sticky error.
-  Dart_SetStickyError(result);
-  Dart_SetPausedOnExit(true);
-  EXPECT(Dart_HasStickyError());
+  {
+    // Set the sticky error.
+    TransitionVMToNative transition(thread);
+    Dart_SetStickyError(result);
+    Dart_SetPausedOnExit(true);
+    EXPECT(Dart_HasStickyError());
+  }
 
   {
-    TransitionNativeToVM transition(thread);
-
     JSONStream js;
     isolate->PrintJSON(&js, false);
     // Error and PauseExit set.
@@ -212,7 +214,7 @@
   EXPECT_STREQ("objects/5", reuse_zone.GetServiceId(test_d));
 }
 
-TEST_CASE(Service_Code) {
+ISOLATE_UNIT_TEST_CASE(Service_Code) {
   const char* kScript =
       "var port;\n"  // Set to our mock port by C++.
       "\n"
@@ -232,13 +234,17 @@
 
   Isolate* isolate = thread->isolate();
   isolate->set_is_runnable(true);
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
+  Dart_Handle lib;
   Library& vmlib = Library::Handle();
-  vmlib ^= Api::UnwrapHandle(lib);
-  EXPECT(!vmlib.IsNull());
-  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT_VALID(result);
+  {
+    TransitionVMToNative transition(thread);
+    lib = TestCase::LoadTestScript(kScript, NULL);
+    EXPECT_VALID(lib);
+    vmlib ^= Api::UnwrapHandle(lib);
+    EXPECT(!vmlib.IsNull());
+    Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+    EXPECT_VALID(result);
+  }
   const Class& class_a = Class::Handle(GetClass(vmlib, "A"));
   EXPECT(!class_a.IsNull());
   const Function& function_c = Function::Handle(GetFunction(class_a, "c"));
@@ -256,7 +262,10 @@
   Dart_Port port_id = PortMap::CreatePort(&handler);
   Dart_Handle port = Api::NewHandle(thread, SendPort::New(port_id));
   EXPECT_VALID(port);
-  EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
+  {
+    TransitionVMToNative transition(thread);
+    EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
+  }
 
   Array& service_msg = Array::Handle();
 
@@ -329,7 +338,7 @@
   EXPECT_SUBSTRING("\"error\"", handler.msg());
 }
 
-TEST_CASE(Service_TokenStream) {
+ISOLATE_UNIT_TEST_CASE(Service_TokenStream) {
   const char* kScript =
       "var port;\n"  // Set to our mock port by C++.
       "\n"
@@ -338,11 +347,15 @@
 
   Isolate* isolate = thread->isolate();
   isolate->set_is_runnable(true);
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
+  Dart_Handle lib;
   Library& vmlib = Library::Handle();
-  vmlib ^= Api::UnwrapHandle(lib);
-  EXPECT(!vmlib.IsNull());
+  {
+    TransitionVMToNative transition(thread);
+    lib = TestCase::LoadTestScript(kScript, NULL);
+    EXPECT_VALID(lib);
+    vmlib ^= Api::UnwrapHandle(lib);
+    EXPECT(!vmlib.IsNull());
+  }
 
   const String& script_name = String::Handle(String::New("test-lib"));
   EXPECT(!script_name.IsNull());
@@ -359,7 +372,10 @@
   Dart_Port port_id = PortMap::CreatePort(&handler);
   Dart_Handle port = Api::NewHandle(thread, SendPort::New(port_id));
   EXPECT_VALID(port);
-  EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
+  {
+    TransitionVMToNative transition(thread);
+    EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
+  }
 
   Array& service_msg = Array::Handle();
 
@@ -378,7 +394,7 @@
   EXPECT_SUBSTRING("\"members\":[", handler.msg());
 }
 
-TEST_CASE(Service_PcDescriptors) {
+ISOLATE_UNIT_TEST_CASE(Service_PcDescriptors) {
   const char* kScript =
       "var port;\n"  // Set to our mock port by C++.
       "\n"
@@ -398,13 +414,17 @@
 
   Isolate* isolate = thread->isolate();
   isolate->set_is_runnable(true);
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
+  Dart_Handle lib;
   Library& vmlib = Library::Handle();
-  vmlib ^= Api::UnwrapHandle(lib);
-  EXPECT(!vmlib.IsNull());
-  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT_VALID(result);
+  {
+    TransitionVMToNative transition(thread);
+    lib = TestCase::LoadTestScript(kScript, NULL);
+    EXPECT_VALID(lib);
+    vmlib ^= Api::UnwrapHandle(lib);
+    EXPECT(!vmlib.IsNull());
+    Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+    EXPECT_VALID(result);
+  }
   const Class& class_a = Class::Handle(GetClass(vmlib, "A"));
   EXPECT(!class_a.IsNull());
   const Function& function_c = Function::Handle(GetFunction(class_a, "c"));
@@ -423,7 +443,10 @@
   Dart_Port port_id = PortMap::CreatePort(&handler);
   Dart_Handle port = Api::NewHandle(thread, SendPort::New(port_id));
   EXPECT_VALID(port);
-  EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
+  {
+    TransitionVMToNative transition(thread);
+    EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
+  }
 
   Array& service_msg = Array::Handle();
 
@@ -441,7 +464,7 @@
   EXPECT_SUBSTRING("\"members\":[", handler.msg());
 }
 
-TEST_CASE(Service_LocalVarDescriptors) {
+ISOLATE_UNIT_TEST_CASE(Service_LocalVarDescriptors) {
   const char* kScript =
       "var port;\n"  // Set to our mock port by C++.
       "\n"
@@ -461,13 +484,17 @@
 
   Isolate* isolate = thread->isolate();
   isolate->set_is_runnable(true);
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
+  Dart_Handle lib;
   Library& vmlib = Library::Handle();
-  vmlib ^= Api::UnwrapHandle(lib);
-  EXPECT(!vmlib.IsNull());
-  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT_VALID(result);
+  {
+    TransitionVMToNative transition(thread);
+    lib = TestCase::LoadTestScript(kScript, NULL);
+    EXPECT_VALID(lib);
+    vmlib ^= Api::UnwrapHandle(lib);
+    EXPECT(!vmlib.IsNull());
+    Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+    EXPECT_VALID(result);
+  }
   const Class& class_a = Class::Handle(GetClass(vmlib, "A"));
   EXPECT(!class_a.IsNull());
   const Function& function_c = Function::Handle(GetFunction(class_a, "c"));
@@ -486,7 +513,10 @@
   Dart_Port port_id = PortMap::CreatePort(&handler);
   Dart_Handle port = Api::NewHandle(thread, SendPort::New(port_id));
   EXPECT_VALID(port);
-  EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
+  {
+    TransitionVMToNative transition(thread);
+    EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
+  }
 
   Array& service_msg = Array::Handle();
 
@@ -508,7 +538,7 @@
                                 Dart_WeakPersistentHandle handle,
                                 void* peer) {}
 
-TEST_CASE(Service_PersistentHandles) {
+ISOLATE_UNIT_TEST_CASE(Service_PersistentHandles) {
   const char* kScript =
       "var port;\n"  // Set to our mock port by C++.
       "\n"
@@ -522,28 +552,34 @@
 
   Isolate* isolate = thread->isolate();
   isolate->set_is_runnable(true);
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
-  Library& vmlib = Library::Handle();
-  vmlib ^= Api::UnwrapHandle(lib);
-  EXPECT(!vmlib.IsNull());
-  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT_VALID(result);
 
-  // Create a persistent handle to global.
-  Dart_PersistentHandle persistent_handle = Dart_NewPersistentHandle(result);
+  Dart_Handle lib;
+  Dart_PersistentHandle persistent_handle;
+  Dart_WeakPersistentHandle weak_persistent_handle;
+  {
+    TransitionVMToNative transition(thread);
+    lib = TestCase::LoadTestScript(kScript, NULL);
+    EXPECT_VALID(lib);
+    Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+    EXPECT_VALID(result);
 
-  // Create a weak persistent handle to global.
-  Dart_WeakPersistentHandle weak_persistent_handle =
-      Dart_NewWeakPersistentHandle(result, reinterpret_cast<void*>(0xdeadbeef),
-                                   128, WeakHandleFinalizer);
+    // Create a persistent handle to global.
+    persistent_handle = Dart_NewPersistentHandle(result);
+
+    // Create a weak persistent handle to global.
+    weak_persistent_handle = Dart_NewWeakPersistentHandle(
+        result, reinterpret_cast<void*>(0xdeadbeef), 128, WeakHandleFinalizer);
+  }
 
   // Build a mock message handler and wrap it in a dart port.
   ServiceTestMessageHandler handler;
   Dart_Port port_id = PortMap::CreatePort(&handler);
   Dart_Handle port = Api::NewHandle(thread, SendPort::New(port_id));
   EXPECT_VALID(port);
-  EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
+  {
+    TransitionVMToNative transition(thread);
+    EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
+  }
 
   Array& service_msg = Array::Handle();
 
@@ -558,9 +594,12 @@
   EXPECT_SUBSTRING("\"externalSize\":\"128\"", handler.msg());
 
   // Delete persistent handles.
-  Dart_DeletePersistentHandle(persistent_handle);
-  Dart_DeleteWeakPersistentHandle(Dart_CurrentIsolate(),
-                                  weak_persistent_handle);
+  {
+    TransitionVMToNative transition(thread);
+    Dart_DeletePersistentHandle(persistent_handle);
+    Dart_DeleteWeakPersistentHandle(Dart_CurrentIsolate(),
+                                    weak_persistent_handle);
+  }
 
   // Get persistent handles (again).
   service_msg = Eval(lib, "[0, port, '0', '_getPersistentHandles', [], []]");
@@ -573,7 +612,7 @@
   EXPECT_NOTSUBSTRING("\"externalSize\":\"128\"", handler.msg());
 }
 
-TEST_CASE(Service_Address) {
+ISOLATE_UNIT_TEST_CASE(Service_Address) {
   const char* kScript =
       "var port;\n"  // Set to our mock port by C++.
       "\n"
@@ -582,15 +621,22 @@
 
   Isolate* isolate = thread->isolate();
   isolate->set_is_runnable(true);
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
+  Dart_Handle lib;
+  {
+    TransitionVMToNative transition(thread);
+    lib = TestCase::LoadTestScript(kScript, NULL);
+    EXPECT_VALID(lib);
+  }
 
   // Build a mock message handler and wrap it in a dart port.
   ServiceTestMessageHandler handler;
   Dart_Port port_id = PortMap::CreatePort(&handler);
   Dart_Handle port = Api::NewHandle(thread, SendPort::New(port_id));
   EXPECT_VALID(port);
-  EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
+  {
+    TransitionVMToNative transition(thread);
+    EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
+  }
 
   const String& str = String::Handle(String::New("foobar", Heap::kOld));
   Array& service_msg = Array::Handle();
@@ -648,7 +694,7 @@
   return false;
 }
 
-TEST_CASE(Service_EmbedderRootHandler) {
+ISOLATE_UNIT_TEST_CASE(Service_EmbedderRootHandler) {
   const char* kScript =
       "var port;\n"  // Set to our mock port by C++.
       "\n"
@@ -658,20 +704,28 @@
       "  x = (x / 13).floor();\n"
       "}";
 
-  Dart_RegisterRootServiceRequestCallback("alpha", alpha_callback, NULL);
-  Dart_RegisterRootServiceRequestCallback("beta", beta_callback, NULL);
+  Dart_Handle lib;
+  {
+    TransitionVMToNative transition(thread);
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
-  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT_VALID(result);
+    Dart_RegisterRootServiceRequestCallback("alpha", alpha_callback, NULL);
+    Dart_RegisterRootServiceRequestCallback("beta", beta_callback, NULL);
+
+    lib = TestCase::LoadTestScript(kScript, NULL);
+    EXPECT_VALID(lib);
+    Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+    EXPECT_VALID(result);
+  }
 
   // Build a mock message handler and wrap it in a dart port.
   ServiceTestMessageHandler handler;
   Dart_Port port_id = PortMap::CreatePort(&handler);
   Dart_Handle port = Api::NewHandle(thread, SendPort::New(port_id));
   EXPECT_VALID(port);
-  EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
+  {
+    TransitionVMToNative transition(thread);
+    EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
+  }
 
   Array& service_msg = Array::Handle();
   service_msg = Eval(lib, "[0, port, '\"', 'alpha', [], []]");
@@ -685,7 +739,7 @@
   EXPECT_STREQ("{\"jsonrpc\":\"2.0\", \"error\":beta,\"id\":1}", handler.msg());
 }
 
-TEST_CASE(Service_EmbedderIsolateHandler) {
+ISOLATE_UNIT_TEST_CASE(Service_EmbedderIsolateHandler) {
   const char* kScript =
       "var port;\n"  // Set to our mock port by C++.
       "\n"
@@ -695,22 +749,30 @@
       "  x = (x / 13).floor();\n"
       "}";
 
-  Dart_RegisterIsolateServiceRequestCallback("alpha", alpha_callback, NULL);
-  Dart_RegisterIsolateServiceRequestCallback("beta", beta_callback, NULL);
+  Dart_Handle lib;
+  {
+    TransitionVMToNative transition(thread);
 
-  Isolate* isolate = thread->isolate();
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
-  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT_VALID(result);
+    Dart_RegisterIsolateServiceRequestCallback("alpha", alpha_callback, NULL);
+    Dart_RegisterIsolateServiceRequestCallback("beta", beta_callback, NULL);
+
+    lib = TestCase::LoadTestScript(kScript, NULL);
+    EXPECT_VALID(lib);
+    Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+    EXPECT_VALID(result);
+  }
 
   // Build a mock message handler and wrap it in a dart port.
   ServiceTestMessageHandler handler;
   Dart_Port port_id = PortMap::CreatePort(&handler);
   Dart_Handle port = Api::NewHandle(thread, SendPort::New(port_id));
   EXPECT_VALID(port);
-  EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
+  {
+    TransitionVMToNative transition(thread);
+    EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
+  }
 
+  Isolate* isolate = thread->isolate();
   Array& service_msg = Array::Handle();
   service_msg = Eval(lib, "[0, port, '0', 'alpha', [], []]");
   HandleIsolateMessage(isolate, service_msg);
@@ -734,7 +796,7 @@
   }
 }
 
-TEST_CASE(Service_Profile) {
+ISOLATE_UNIT_TEST_CASE(Service_Profile) {
   EnableProfiler();
   const char* kScript =
       "var port;\n"  // Set to our mock port by C++.
@@ -747,17 +809,25 @@
 
   Isolate* isolate = thread->isolate();
   isolate->set_is_runnable(true);
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
-  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT_VALID(result);
+  Dart_Handle lib;
+  {
+    TransitionVMToNative transition(thread);
+
+    lib = TestCase::LoadTestScript(kScript, NULL);
+    EXPECT_VALID(lib);
+    Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+    EXPECT_VALID(result);
+  }
 
   // Build a mock message handler and wrap it in a dart port.
   ServiceTestMessageHandler handler;
   Dart_Port port_id = PortMap::CreatePort(&handler);
   Dart_Handle port = Api::NewHandle(thread, SendPort::New(port_id));
   EXPECT_VALID(port);
-  EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
+  {
+    TransitionVMToNative transition(thread);
+    EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
+  }
 
   Array& service_msg = Array::Handle();
   service_msg = Eval(lib, "[0, port, '0', '_getCpuProfile', [], []]");
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
index f61020e..10b4715 100644
--- a/runtime/vm/snapshot_test.cc
+++ b/runtime/vm/snapshot_test.cc
@@ -672,7 +672,7 @@
     delete message;                                                            \
   }
 
-TEST_CASE(SerializeTypedArray) {
+ISOLATE_UNIT_TEST_CASE(SerializeTypedArray) {
   TEST_TYPED_ARRAY(Int8, int8_t);
   TEST_TYPED_ARRAY(Uint8, uint8_t);
   TEST_TYPED_ARRAY(Int16, int16_t);
@@ -685,7 +685,7 @@
   TEST_TYPED_ARRAY(Float64, double);
 }
 
-TEST_CASE(SerializeExternalTypedArray) {
+ISOLATE_UNIT_TEST_CASE(SerializeExternalTypedArray) {
   TEST_EXTERNAL_TYPED_ARRAY(Int8, int8_t);
   TEST_EXTERNAL_TYPED_ARRAY(Uint8, uint8_t);
   TEST_EXTERNAL_TYPED_ARRAY(Int16, int16_t);
@@ -698,7 +698,7 @@
   TEST_EXTERNAL_TYPED_ARRAY(Float64, double);
 }
 
-TEST_CASE(SerializeEmptyByteArray) {
+ISOLATE_UNIT_TEST_CASE(SerializeEmptyByteArray) {
   // Write snapshot with object content.
   const int kTypedDataLength = 0;
   TypedData& typed_data = TypedData::Handle(
diff --git a/runtime/vm/stub_code_arm64_test.cc b/runtime/vm/stub_code_arm64_test.cc
index 091cb42..a194b7c 100644
--- a/runtime/vm/stub_code_arm64_test.cc
+++ b/runtime/vm/stub_code_arm64_test.cc
@@ -50,7 +50,7 @@
   __ ret();
 }
 
-TEST_CASE(CallRuntimeStubCode) {
+ISOLATE_UNIT_TEST_CASE(CallRuntimeStubCode) {
   extern const Function& RegisterFakeFunction(const char* name,
                                               const Code& code);
   const int length = 10;
@@ -87,7 +87,7 @@
   __ ret();  // Return value is in R0.
 }
 
-TEST_CASE(CallLeafRuntimeStubCode) {
+ISOLATE_UNIT_TEST_CASE(CallLeafRuntimeStubCode) {
   extern const Function& RegisterFakeFunction(const char* name,
                                               const Code& code);
   const char* str_value = "abAB";
diff --git a/runtime/vm/stub_code_arm_test.cc b/runtime/vm/stub_code_arm_test.cc
index a006d7a..2741204 100644
--- a/runtime/vm/stub_code_arm_test.cc
+++ b/runtime/vm/stub_code_arm_test.cc
@@ -49,7 +49,7 @@
   __ LeaveDartFrameAndReturn();
 }
 
-TEST_CASE(CallRuntimeStubCode) {
+ISOLATE_UNIT_TEST_CASE(CallRuntimeStubCode) {
   extern const Function& RegisterFakeFunction(const char* name,
                                               const Code& code);
   const int length = 10;
@@ -85,7 +85,7 @@
   __ LeaveDartFrameAndReturn();  // Return value is in R0.
 }
 
-TEST_CASE(CallLeafRuntimeStubCode) {
+ISOLATE_UNIT_TEST_CASE(CallLeafRuntimeStubCode) {
   extern const Function& RegisterFakeFunction(const char* name,
                                               const Code& code);
   const char* str_value = "abAB";
diff --git a/runtime/vm/stub_code_ia32_test.cc b/runtime/vm/stub_code_ia32_test.cc
index e00932a..a4b5d5e 100644
--- a/runtime/vm/stub_code_ia32_test.cc
+++ b/runtime/vm/stub_code_ia32_test.cc
@@ -50,7 +50,7 @@
   __ ret();
 }
 
-TEST_CASE(CallRuntimeStubCode) {
+ISOLATE_UNIT_TEST_CASE(CallRuntimeStubCode) {
   extern const Function& RegisterFakeFunction(const char* name,
                                               const Code& code);
   const int length = 10;
@@ -90,7 +90,7 @@
   __ ret();  // Return value is in EAX.
 }
 
-TEST_CASE(CallLeafRuntimeStubCode) {
+ISOLATE_UNIT_TEST_CASE(CallLeafRuntimeStubCode) {
   extern const Function& RegisterFakeFunction(const char* name,
                                               const Code& code);
   const char* str_value = "abAB";
diff --git a/runtime/vm/stub_code_x64_test.cc b/runtime/vm/stub_code_x64_test.cc
index b460282..c9d9474 100644
--- a/runtime/vm/stub_code_x64_test.cc
+++ b/runtime/vm/stub_code_x64_test.cc
@@ -50,7 +50,7 @@
   __ ret();
 }
 
-TEST_CASE(CallRuntimeStubCode) {
+ISOLATE_UNIT_TEST_CASE(CallRuntimeStubCode) {
   extern const Function& RegisterFakeFunction(const char* name,
                                               const Code& code);
   const int length = 10;
@@ -87,7 +87,7 @@
   __ ret();  // Return value is in RAX.
 }
 
-TEST_CASE(CallLeafRuntimeStubCode) {
+ISOLATE_UNIT_TEST_CASE(CallLeafRuntimeStubCode) {
   extern const Function& RegisterFakeFunction(const char* name,
                                               const Code& code);
   const char* str_value = "abAB";
diff --git a/runtime/vm/thread_test.cc b/runtime/vm/thread_test.cc
index 07200fb..561db06 100644
--- a/runtime/vm/thread_test.cc
+++ b/runtime/vm/thread_test.cc
@@ -287,7 +287,7 @@
   bool* wait_;
 };
 
-TEST_CASE(ManySimpleTasksWithZones) {
+ISOLATE_UNIT_TEST_CASE(ManySimpleTasksWithZones) {
   const int kTaskCount = 10;
   Monitor monitor;
   Monitor sync;
diff --git a/runtime/vm/unicode_test.cc b/runtime/vm/unicode_test.cc
index 0af271c..b8807f1 100644
--- a/runtime/vm/unicode_test.cc
+++ b/runtime/vm/unicode_test.cc
@@ -8,7 +8,7 @@
 
 namespace dart {
 
-TEST_CASE(Utf8Encode) {
+ISOLATE_UNIT_TEST_CASE(Utf8Encode) {
   const intptr_t kInputLen = 3;
   const uint16_t kInput[kInputLen] = {0xe6, 0xe7, 0xe8};  // æøå
   const String& input = String::Handle(String::FromUTF16(kInput, kInputLen));
@@ -27,7 +27,7 @@
   }
 }
 
-TEST_CASE(Utf8Decode) {
+ISOLATE_UNIT_TEST_CASE(Utf8Decode) {
   // Examples from the Unicode specification, chapter 3
   {
     const char* src = "\x41\xC3\xB1\x42";