[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";