Index: runtime/vm/dart_api_impl.cc |
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc |
index 5633c72e9756a485809133a2bb9a3ee642caf89e..23cf84c412c7c26319e8e78360712f50b189d547 100644 |
--- a/runtime/vm/dart_api_impl.cc |
+++ b/runtime/vm/dart_api_impl.cc |
@@ -480,6 +480,9 @@ Dart_Handle Api::NewError(const char* format, ...) { |
CHECK_API_SCOPE(T); |
HANDLESCOPE(T); |
CHECK_CALLBACK_STATE(T); |
+ // Ensure we transition safepoint state to VM if we are not already in |
+ // that state. |
+ TransitionToVM transition(T); |
va_list args; |
va_start(args, format); |
@@ -847,23 +850,20 @@ DART_EXPORT Dart_Handle Dart_NewUnhandledExceptionError(Dart_Handle exception) { |
DART_EXPORT Dart_Handle Dart_PropagateError(Dart_Handle handle) { |
Thread* thread = Thread::Current(); |
- { |
- const Object& obj = Object::Handle(thread->zone(), |
- Api::UnwrapHandle(handle)); |
- if (!obj.IsError()) { |
- return Api::NewError( |
- "%s expects argument 'handle' to be an error handle. " |
- "Did you forget to check Dart_IsError first?", |
- CURRENT_FUNC); |
- } |
+ TransitionNativeToVM transition(thread); |
+ const Object& obj = Object::Handle(thread->zone(), |
+ Api::UnwrapHandle(handle)); |
+ if (!obj.IsError()) { |
+ return Api::NewError( |
+ "%s expects argument 'handle' to be an error handle. " |
+ "Did you forget to check Dart_IsError first?", |
+ CURRENT_FUNC); |
} |
if (thread->top_exit_frame_info() == 0) { |
// There are no dart frames on the stack so it would be illegal to |
// propagate an error here. |
return Api::NewError("No Dart frames on stack, cannot propagate error."); |
} |
- |
- TransitionNativeToVM transition(thread); |
// Unwind all the API scopes till the exit frame before propagating. |
const Error* error; |
{ |
@@ -975,6 +975,7 @@ DART_EXPORT Dart_Handle Dart_HandleFromPersistent( |
Thread* thread = Thread::Current(); |
Isolate* isolate = thread->isolate(); |
CHECK_ISOLATE(isolate); |
+ NoSafepointScope no_safepoint_scope; |
ApiState* state = isolate->api_state(); |
ASSERT(state != NULL); |
PersistentHandle* ref = PersistentHandle::Cast(object); |
@@ -987,6 +988,7 @@ DART_EXPORT Dart_Handle Dart_HandleFromWeakPersistent( |
Thread* thread = Thread::Current(); |
Isolate* isolate = thread->isolate(); |
CHECK_ISOLATE(isolate); |
+ NoSafepointScope no_safepoint_scope; |
ApiState* state = isolate->api_state(); |
ASSERT(state != NULL); |
FinalizablePersistentHandle* weak_ref = |
@@ -1061,6 +1063,7 @@ DART_EXPORT Dart_WeakPersistentHandle Dart_NewWeakPersistentHandle( |
DART_EXPORT void Dart_DeletePersistentHandle(Dart_PersistentHandle object) { |
Isolate* isolate = Isolate::Current(); |
CHECK_ISOLATE(isolate); |
+ NoSafepointScope no_safepoint_scope; |
ApiState* state = isolate->api_state(); |
ASSERT(state != NULL); |
PersistentHandle* ref = PersistentHandle::Cast(object); |
@@ -1076,6 +1079,7 @@ DART_EXPORT void Dart_DeleteWeakPersistentHandle( |
Dart_WeakPersistentHandle object) { |
Isolate* isolate = reinterpret_cast<Isolate*>(current_isolate); |
CHECK_ISOLATE(isolate); |
+ NoSafepointScope no_safepoint_scope; |
ASSERT(isolate == Isolate::Current()); |
ApiState* state = isolate->api_state(); |
ASSERT(state != NULL); |
@@ -1091,8 +1095,10 @@ DART_EXPORT void Dart_DeleteWeakPersistentHandle( |
DART_EXPORT Dart_Handle Dart_SetGcCallbacks( |
Dart_GcPrologueCallback prologue_callback, |
Dart_GcEpilogueCallback epilogue_callback) { |
- Isolate* isolate = Isolate::Current(); |
+ Thread* thread = Thread::Current(); |
+ Isolate* isolate = thread->isolate(); |
CHECK_ISOLATE(isolate); |
+ DARTSCOPE(Thread::Current()); |
rmacnak
2016/05/27 20:08:29
thread
siva
2016/05/27 20:53:16
Done.
|
if (prologue_callback != NULL) { |
if (isolate->gc_prologue_callback() != NULL) { |
return Api::NewError( |
@@ -1313,6 +1319,7 @@ DART_EXPORT Dart_Isolate Dart_CurrentIsolate() { |
DART_EXPORT void* Dart_CurrentIsolateData() { |
Isolate* isolate = Isolate::Current(); |
CHECK_ISOLATE(isolate); |
+ NoSafepointScope no_safepoint_scope; |
return isolate->init_callback_data(); |
} |
@@ -1322,6 +1329,7 @@ DART_EXPORT void* Dart_IsolateData(Dart_Isolate isolate) { |
FATAL1("%s expects argument 'isolate' to be non-null.", CURRENT_FUNC); |
} |
// TODO(16615): Validate isolate parameter. |
+ NoSafepointScope no_safepoint_scope; |
Isolate* iso = reinterpret_cast<Isolate*>(isolate); |
return iso->init_callback_data(); |
} |
@@ -1375,6 +1383,7 @@ DART_EXPORT void Dart_ThreadEnableProfiling() { |
DART_EXPORT bool Dart_ShouldPauseOnStart() { |
Isolate* isolate = Isolate::Current(); |
CHECK_ISOLATE(isolate); |
+ NoSafepointScope no_safepoint_scope; |
return isolate->message_handler()->should_pause_on_start(); |
} |
@@ -1382,6 +1391,7 @@ DART_EXPORT bool Dart_ShouldPauseOnStart() { |
DART_EXPORT void Dart_SetShouldPauseOnStart(bool should_pause) { |
Isolate* isolate = Isolate::Current(); |
CHECK_ISOLATE(isolate); |
+ NoSafepointScope no_safepoint_scope; |
if (isolate->is_runnable()) { |
FATAL1("%s expects the current isolate to not be runnable yet.", |
CURRENT_FUNC); |
@@ -1393,6 +1403,7 @@ DART_EXPORT void Dart_SetShouldPauseOnStart(bool should_pause) { |
DART_EXPORT bool Dart_IsPausedOnStart() { |
Isolate* isolate = Isolate::Current(); |
CHECK_ISOLATE(isolate); |
+ NoSafepointScope no_safepoint_scope; |
return isolate->message_handler()->is_paused_on_start(); |
} |
@@ -1400,6 +1411,7 @@ DART_EXPORT bool Dart_IsPausedOnStart() { |
DART_EXPORT void Dart_SetPausedOnStart(bool paused) { |
Isolate* isolate = Isolate::Current(); |
CHECK_ISOLATE(isolate); |
+ NoSafepointScope no_safepoint_scope; |
if (isolate->message_handler()->is_paused_on_start() != paused) { |
isolate->message_handler()->PausedOnStart(paused); |
} |
@@ -1409,6 +1421,7 @@ DART_EXPORT void Dart_SetPausedOnStart(bool paused) { |
DART_EXPORT bool Dart_ShouldPauseOnExit() { |
Isolate* isolate = Isolate::Current(); |
CHECK_ISOLATE(isolate); |
+ NoSafepointScope no_safepoint_scope; |
return isolate->message_handler()->should_pause_on_exit(); |
} |
@@ -1416,6 +1429,7 @@ DART_EXPORT bool Dart_ShouldPauseOnExit() { |
DART_EXPORT void Dart_SetShouldPauseOnExit(bool should_pause) { |
Isolate* isolate = Isolate::Current(); |
CHECK_ISOLATE(isolate); |
+ NoSafepointScope no_safepoint_scope; |
return isolate->message_handler()->set_should_pause_on_exit(should_pause); |
} |
@@ -1423,6 +1437,7 @@ DART_EXPORT void Dart_SetShouldPauseOnExit(bool should_pause) { |
DART_EXPORT bool Dart_IsPausedOnExit() { |
Isolate* isolate = Isolate::Current(); |
CHECK_ISOLATE(isolate); |
+ NoSafepointScope no_safepoint_scope; |
return isolate->message_handler()->is_paused_on_exit(); |
} |
@@ -1430,6 +1445,7 @@ DART_EXPORT bool Dart_IsPausedOnExit() { |
DART_EXPORT void Dart_SetPausedOnExit(bool paused) { |
Isolate* isolate = Isolate::Current(); |
CHECK_ISOLATE(isolate); |
+ NoSafepointScope no_safepoint_scope; |
if (isolate->message_handler()->is_paused_on_exit() != paused) { |
isolate->message_handler()->PausedOnExit(paused); |
} |
@@ -1559,6 +1575,7 @@ DART_EXPORT void Dart_InterruptIsolate(Dart_Isolate isolate) { |
FATAL1("%s expects argument 'isolate' to be non-null.", CURRENT_FUNC); |
} |
// TODO(16615): Validate isolate parameter. |
+ TransitionNativeToVM transition(Thread::Current()); |
Isolate* iso = reinterpret_cast<Isolate*>(isolate); |
iso->SendInternalLibMessage(Isolate::kInterruptMsg, iso->pause_capability()); |
} |
@@ -1586,6 +1603,7 @@ DART_EXPORT void Dart_SetMessageNotifyCallback( |
Dart_MessageNotifyCallback message_notify_callback) { |
Isolate* isolate = Isolate::Current(); |
CHECK_ISOLATE(isolate); |
+ NoSafepointScope no_safepoint_scope; |
isolate->set_message_notify_callback(message_notify_callback); |
} |
@@ -1593,6 +1611,7 @@ DART_EXPORT void Dart_SetMessageNotifyCallback( |
DART_EXPORT Dart_MessageNotifyCallback Dart_GetMessageNotifyCallback() { |
Isolate* isolate = Isolate::Current(); |
CHECK_ISOLATE(isolate); |
+ NoSafepointScope no_safepoint_scope; |
return isolate->message_notify_callback(); |
} |
@@ -1702,6 +1721,7 @@ DART_EXPORT bool Dart_HandleServiceMessages() { |
DART_EXPORT bool Dart_HasServiceMessages() { |
Isolate* isolate = Isolate::Current(); |
ASSERT(isolate); |
+ NoSafepointScope no_safepoint_scope; |
return isolate->message_handler()->HasOOBMessages(); |
} |
@@ -1709,6 +1729,7 @@ DART_EXPORT bool Dart_HasServiceMessages() { |
DART_EXPORT bool Dart_HasLivePorts() { |
Isolate* isolate = Isolate::Current(); |
ASSERT(isolate); |
+ NoSafepointScope no_safepoint_scope; |
return isolate->message_handler()->HasLivePorts(); |
} |
@@ -1786,6 +1807,7 @@ DART_EXPORT void Dart_EnterScope() { |
Thread* thread = Thread::Current(); |
Isolate* isolate = thread->isolate(); |
CHECK_ISOLATE(isolate); |
+ NoSafepointScope no_safepoint_scope; |
ApiLocalScope* new_scope = thread->api_reusable_scope(); |
if (new_scope == NULL) { |
new_scope = new ApiLocalScope(thread->api_top_scope(), |
@@ -1804,6 +1826,7 @@ DART_EXPORT void Dart_EnterScope() { |
DART_EXPORT void Dart_ExitScope() { |
Thread* T = Thread::Current(); |
CHECK_API_SCOPE(T); |
+ NoSafepointScope no_safepoint_scope; |
ApiLocalScope* scope = T->api_top_scope(); |
ApiLocalScope* reusable_scope = T->api_reusable_scope(); |
T->set_api_top_scope(scope->previous()); // Reset top scope to previous. |
@@ -4579,20 +4602,16 @@ DART_EXPORT Dart_Handle Dart_ThrowException(Dart_Handle exception) { |
if (Api::IsError(exception)) { |
::Dart_PropagateError(exception); |
} |
- |
- { |
- const Instance& excp = Api::UnwrapInstanceHandle(zone, exception); |
- if (excp.IsNull()) { |
- RETURN_TYPE_ERROR(zone, exception, Instance); |
- } |
+ TransitionNativeToVM transition(thread); |
+ const Instance& excp = Api::UnwrapInstanceHandle(zone, exception); |
+ if (excp.IsNull()) { |
+ RETURN_TYPE_ERROR(zone, exception, Instance); |
} |
if (thread->top_exit_frame_info() == 0) { |
// There are no dart frames on the stack so it would be illegal to |
// throw an exception here. |
return Api::NewError("No Dart frames on stack, cannot throw exception"); |
} |
- |
- TransitionNativeToVM transition(thread); |
// Unwind all the API scopes till the exit frame before throwing an |
// exception. |
const Instance* saved_exception; |
@@ -4615,6 +4634,7 @@ DART_EXPORT Dart_Handle Dart_ReThrowException(Dart_Handle exception, |
Isolate* isolate = thread->isolate(); |
CHECK_ISOLATE(isolate); |
CHECK_CALLBACK_STATE(thread); |
+ TransitionNativeToVM transition(thread); |
{ |
const Instance& excp = Api::UnwrapInstanceHandle(zone, exception); |
if (excp.IsNull()) { |
@@ -4630,8 +4650,6 @@ DART_EXPORT Dart_Handle Dart_ReThrowException(Dart_Handle exception, |
// throw an exception here. |
return Api::NewError("No Dart frames on stack, cannot throw exception"); |
} |
- |
- TransitionNativeToVM transition(thread); |
// Unwind all the API scopes till the exit frame before throwing an |
// exception. |
const Instance* saved_exception; |
@@ -5118,6 +5136,7 @@ DART_EXPORT void Dart_SetIntegerReturnValue(Dart_NativeArguments args, |
} else { |
// Slow path for Mints and Bigints. |
ASSERT_CALLBACK_STATE(arguments->thread()); |
+ TransitionNativeToVM transition(arguments->thread()); |
Api::SetIntegerReturnValue(arguments, retval); |
} |
} |
@@ -5127,6 +5146,7 @@ DART_EXPORT void Dart_SetDoubleReturnValue(Dart_NativeArguments args, |
double retval) { |
NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
ASSERT_CALLBACK_STATE(arguments->thread()); |
+ TransitionNativeToVM transition(arguments->thread()); |
Api::SetDoubleReturnValue(arguments, retval); |
} |