[vm] Assert callback state for all Dart_Set*ReturnValue, take 2.
Fix scoping of raw typed data access in dart:io.
Change-Id: I458b36bf655e429cc57e266550ff1ab00f328f45
Reviewed-on: https://dart-review.googlesource.com/c/89943
Reviewed-by: Ben Konyi <bkonyi@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
diff --git a/runtime/bin/file.cc b/runtime/bin/file.cc
index 0bc02c0..cdbbc95 100644
--- a/runtime/bin/file.cc
+++ b/runtime/bin/file.cc
@@ -113,12 +113,15 @@
}
void FUNCTION_NAME(File_Exists)(Dart_NativeArguments args) {
- Namespace* namespc = Namespace::GetNamespace(args, 0);
- Dart_Handle path_handle = Dart_GetNativeArgument(args, 1);
- TypedDataScope data(path_handle);
- ASSERT(data.type() == Dart_TypedData_kUint8);
- const char* filename = data.GetCString();
- bool exists = File::Exists(namespc, filename);
+ bool exists;
+ {
+ Namespace* namespc = Namespace::GetNamespace(args, 0);
+ Dart_Handle path_handle = Dart_GetNativeArgument(args, 1);
+ TypedDataScope data(path_handle);
+ ASSERT(data.type() == Dart_TypedData_kUint8);
+ const char* filename = data.GetCString();
+ exists = File::Exists(namespc, filename);
+ }
Dart_SetBooleanReturnValue(args, exists);
}
@@ -710,13 +713,16 @@
}
void FUNCTION_NAME(File_GetType)(Dart_NativeArguments args) {
- Namespace* namespc = Namespace::GetNamespace(args, 0);
- Dart_Handle path_handle = Dart_GetNativeArgument(args, 1);
- TypedDataScope data(path_handle);
- ASSERT(data.type() == Dart_TypedData_kUint8);
- const char* path = data.GetCString();
- bool follow_links = DartUtils::GetNativeBooleanArgument(args, 2);
- File::Type type = File::GetType(namespc, path, follow_links);
+ File::Type type;
+ {
+ Namespace* namespc = Namespace::GetNamespace(args, 0);
+ Dart_Handle path_handle = Dart_GetNativeArgument(args, 1);
+ TypedDataScope data(path_handle);
+ ASSERT(data.type() == Dart_TypedData_kUint8);
+ const char* path = data.GetCString();
+ bool follow_links = DartUtils::GetNativeBooleanArgument(args, 2);
+ type = File::GetType(namespc, path, follow_links);
+ }
Dart_SetIntegerReturnValue(args, static_cast<int>(type));
}
diff --git a/runtime/bin/sync_socket.cc b/runtime/bin/sync_socket.cc
index 12b1fee..4589d4a 100644
--- a/runtime/bin/sync_socket.cc
+++ b/runtime/bin/sync_socket.cc
@@ -141,13 +141,13 @@
buffer += offset;
intptr_t bytes_written =
SynchronousSocket::Write(socket->fd(), buffer, length);
+ Dart_TypedDataReleaseData(buffer_obj);
if (bytes_written >= 0) {
Dart_SetIntegerReturnValue(args, bytes_written);
} else {
OSError os_error;
Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error));
}
- Dart_TypedDataReleaseData(buffer_obj);
}
void FUNCTION_NAME(SynchronousSocket_ReadList)(Dart_NativeArguments args) {
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index b01af49..4f304d9 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -4712,6 +4712,7 @@
Dart_Handle retval) {
NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
ASSERT(arguments->thread()->isolate() == Isolate::Current());
+ ASSERT_CALLBACK_STATE(arguments->thread());
if ((retval != Api::Null()) && !Api::IsInstance(retval) &&
!Api::IsError(retval)) {
// Print the current stack trace to make the problematic caller
@@ -4832,6 +4833,8 @@
DART_EXPORT void Dart_SetBooleanReturnValue(Dart_NativeArguments args,
bool retval) {
NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
+ ASSERT(arguments->thread()->isolate() == Isolate::Current());
+ ASSERT_CALLBACK_STATE(arguments->thread());
arguments->SetReturn(Bool::Get(retval));
}
@@ -4839,6 +4842,7 @@
int64_t retval) {
NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
ASSERT(arguments->thread()->isolate() == Isolate::Current());
+ ASSERT_CALLBACK_STATE(arguments->thread());
if (Smi::IsValid(retval)) {
Api::SetSmiReturnValue(arguments, static_cast<intptr_t>(retval));
} else {
@@ -4852,6 +4856,7 @@
DART_EXPORT void Dart_SetDoubleReturnValue(Dart_NativeArguments args,
double retval) {
NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
+ ASSERT(arguments->thread()->isolate() == Isolate::Current());
ASSERT_CALLBACK_STATE(arguments->thread());
TransitionNativeToVM transition(arguments->thread());
Api::SetDoubleReturnValue(arguments, retval);