Index: runtime/bin/process.cc |
diff --git a/runtime/bin/process.cc b/runtime/bin/process.cc |
index 242ef1c055db971bcc41d2a26b25bd32bd1a0267..3c345b724ca1949168aef7f5d70593b72207f4ab 100644 |
--- a/runtime/bin/process.cc |
+++ b/runtime/bin/process.cc |
@@ -6,6 +6,7 @@ |
#include "bin/dbg_connection.h" |
#include "bin/eventhandler.h" |
#include "bin/io_buffer.h" |
+#include "bin/log.h" |
#include "bin/platform.h" |
#include "bin/process.h" |
#include "bin/socket.h" |
@@ -16,6 +17,10 @@ |
namespace dart { |
namespace bin { |
+// Global flag that is used to indicate that the VM should do a clean |
+// shutdown. |
+bool do_vm_shutdown = true; |
+ |
static const int kProcessIdNativeField = 0; |
int Process::global_exit_code_ = 0; |
@@ -36,9 +41,15 @@ static char** ExtractCStringList(Dart_Handle strings, |
// Protect against user-defined list implementations that can have |
// arbitrary length. |
if (len < 0 || len > kMaxArgumentListLength) { |
- DartUtils::SetIntegerField(status_handle, "_errorCode", 0); |
- DartUtils::SetStringField( |
+ result = DartUtils::SetIntegerField(status_handle, "_errorCode", 0); |
+ if (Dart_IsError(result)) { |
+ Dart_PropagateError(result); |
+ } |
+ result = DartUtils::SetStringField( |
status_handle, "_errorMessage", "Max argument list length exceeded"); |
+ if (Dart_IsError(result)) { |
+ Dart_PropagateError(result); |
+ } |
return NULL; |
} |
*length = len; |
@@ -50,9 +61,15 @@ static char** ExtractCStringList(Dart_Handle strings, |
Dart_PropagateError(arg); |
} |
if (!Dart_IsString(arg)) { |
- DartUtils::SetIntegerField(status_handle, "_errorCode", 0); |
- DartUtils::SetStringField( |
+ result = DartUtils::SetIntegerField(status_handle, "_errorCode", 0); |
+ if (Dart_IsError(result)) { |
+ Dart_PropagateError(result); |
+ } |
+ result = DartUtils::SetStringField( |
status_handle, "_errorMessage", error_msg); |
+ if (Dart_IsError(result)) { |
+ Dart_PropagateError(result); |
+ } |
delete[] string_args; |
return NULL; |
} |
@@ -67,15 +84,22 @@ void FUNCTION_NAME(Process_Start)(Dart_NativeArguments args) { |
intptr_t process_stdout; |
intptr_t process_stderr; |
intptr_t exit_event; |
+ Dart_Handle result; |
Dart_Handle status_handle = Dart_GetNativeArgument(args, 10); |
Dart_Handle path_handle = Dart_GetNativeArgument(args, 1); |
// The Dart code verifies that the path implements the String |
// interface. However, only builtin Strings are handled by |
// GetStringValue. |
if (!Dart_IsString(path_handle)) { |
- DartUtils::SetIntegerField(status_handle, "_errorCode", 0); |
- DartUtils::SetStringField( |
+ result = DartUtils::SetIntegerField(status_handle, "_errorCode", 0); |
+ if (Dart_IsError(result)) { |
+ Dart_PropagateError(result); |
+ } |
+ result = DartUtils::SetStringField( |
status_handle, "_errorMessage", "Path must be a builtin string"); |
+ if (Dart_IsError(result)) { |
+ Dart_PropagateError(result); |
+ } |
Dart_SetReturnValue(args, Dart_NewBoolean(false)); |
return; |
} |
@@ -98,10 +122,16 @@ void FUNCTION_NAME(Process_Start)(Dart_NativeArguments args) { |
working_directory = DartUtils::GetStringValue(working_directory_handle); |
} else if (!Dart_IsNull(working_directory_handle)) { |
delete[] string_args; |
- DartUtils::SetIntegerField(status_handle, "_errorCode", 0); |
- DartUtils::SetStringField( |
+ result = DartUtils::SetIntegerField(status_handle, "_errorCode", 0); |
+ if (Dart_IsError(result)) { |
+ Dart_PropagateError(result); |
+ } |
+ result = DartUtils::SetStringField( |
status_handle, "_errorMessage", |
"WorkingDirectory must be a builtin string"); |
+ if (Dart_IsError(result)) { |
+ Dart_PropagateError(result); |
+ } |
Dart_SetReturnValue(args, Dart_NewBoolean(false)); |
return; |
} |
@@ -153,13 +183,19 @@ void FUNCTION_NAME(Process_Start)(Dart_NativeArguments args) { |
} |
Process::SetProcessIdNativeField(process, pid); |
} else { |
- DartUtils::SetIntegerField( |
+ result = DartUtils::SetIntegerField( |
status_handle, "_errorCode", error_code); |
- DartUtils::SetStringField( |
+ if (Dart_IsError(result)) { |
+ Dart_PropagateError(result); |
+ } |
+ result = DartUtils::SetStringField( |
status_handle, |
"_errorMessage", |
os_error_message != NULL ? os_error_message |
: "Cannot get error message"); |
+ if (Dart_IsError(result)) { |
+ Dart_PropagateError(result); |
+ } |
} |
delete[] string_args; |
delete[] string_environment; |
@@ -218,11 +254,17 @@ void FUNCTION_NAME(Process_Exit)(Dart_NativeArguments args) { |
int64_t status = 0; |
// Ignore result if passing invalid argument and just exit 0. |
DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 0), &status); |
- Dart_ExitIsolate(); |
- Dart_Cleanup(); |
- DebuggerConnectionHandler::StopHandler(); |
- // TODO(zra): Stop the EventHandler once thread shutdown is enabled. |
- // EventHandler::Stop(); |
+ Dart_ShutdownIsolate(); |
+ Process::TerminateExitCodeHandler(); |
+ char* error = Dart_Cleanup(); |
+ if (error != NULL) { |
+ Log::PrintErr("VM cleanup failed: %s\n", error); |
+ free(error); |
+ } |
+ if (do_vm_shutdown) { |
+ DebuggerConnectionHandler::StopHandler(); |
+ EventHandler::Stop(); |
+ } |
exit(static_cast<int>(status)); |
} |