| Index: runtime/bin/utils_win.cc
|
| diff --git a/runtime/bin/utils_win.cc b/runtime/bin/utils_win.cc
|
| index 116ae56157a92739d8569134c04b33b4b60756aa..227cc243c19cabe103bc3ae8cbcc67465a69bd70 100644
|
| --- a/runtime/bin/utils_win.cc
|
| +++ b/runtime/bin/utils_win.cc
|
| @@ -47,9 +47,9 @@ OSError::OSError() : sub_system_(kSystem), code_(0), message_(NULL) {
|
| FormatMessageIntoBuffer(code_, message, kMaxMessageLength);
|
| char* utf8 = StringUtilsWin::WideToUtf8(message);
|
| SetMessage(utf8);
|
| - free(utf8);
|
| }
|
|
|
| +
|
| void OSError::SetCodeAndMessage(SubSystem sub_system, int code) {
|
| set_sub_system(sub_system);
|
| set_code(code);
|
| @@ -59,20 +59,22 @@ void OSError::SetCodeAndMessage(SubSystem sub_system, int code) {
|
| FormatMessageIntoBuffer(code_, message, kMaxMessageLength);
|
| char* utf8 = StringUtilsWin::WideToUtf8(message);
|
| SetMessage(utf8);
|
| - free(utf8);
|
| }
|
|
|
| +
|
| char* StringUtils::ConsoleStringToUtf8(char* str,
|
| intptr_t len,
|
| intptr_t* result_len) {
|
| int wide_len = MultiByteToWideChar(CP_ACP, 0, str, len, NULL, 0);
|
| - wchar_t* wide = new wchar_t[wide_len];
|
| + wchar_t* wide;
|
| + wide =
|
| + reinterpret_cast<wchar_t*>(Dart_ScopeAllocate(wide_len * sizeof(*wide)));
|
| MultiByteToWideChar(CP_ACP, 0, str, len, wide, wide_len);
|
| char* utf8 = StringUtilsWin::WideToUtf8(wide, wide_len, result_len);
|
| - delete[] wide;
|
| return utf8;
|
| }
|
|
|
| +
|
| char* StringUtils::Utf8ToConsoleString(char* utf8,
|
| intptr_t len,
|
| intptr_t* result_len) {
|
| @@ -80,19 +82,20 @@ char* StringUtils::Utf8ToConsoleString(char* utf8,
|
| wchar_t* wide = StringUtilsWin::Utf8ToWide(utf8, len, &wide_len);
|
| int system_len = WideCharToMultiByte(
|
| CP_ACP, 0, wide, wide_len, NULL, 0, NULL, NULL);
|
| - char* ansi = reinterpret_cast<char*>(malloc(system_len));
|
| + char* ansi;
|
| + ansi =
|
| + reinterpret_cast<char*>(Dart_ScopeAllocate(system_len * sizeof(*ansi)));
|
| if (ansi == NULL) {
|
| - free(wide);
|
| return NULL;
|
| }
|
| WideCharToMultiByte(CP_ACP, 0, wide, wide_len, ansi, system_len, NULL, NULL);
|
| - free(wide);
|
| if (result_len != NULL) {
|
| *result_len = system_len;
|
| }
|
| return ansi;
|
| }
|
|
|
| +
|
| char* StringUtilsWin::WideToUtf8(wchar_t* wide,
|
| intptr_t len,
|
| intptr_t* result_len) {
|
| @@ -100,7 +103,8 @@ char* StringUtilsWin::WideToUtf8(wchar_t* wide,
|
| // NUL byte in the length.
|
| int utf8_len = WideCharToMultiByte(
|
| CP_UTF8, 0, wide, len, NULL, 0, NULL, NULL);
|
| - char* utf8 = reinterpret_cast<char*>(malloc(utf8_len));
|
| + char* utf8;
|
| + utf8 = reinterpret_cast<char*>(Dart_ScopeAllocate(utf8_len * sizeof(*utf8)));
|
| WideCharToMultiByte(CP_UTF8, 0, wide, len, utf8, utf8_len, NULL, NULL);
|
| if (result_len != NULL) {
|
| *result_len = utf8_len;
|
| @@ -115,8 +119,9 @@ wchar_t* StringUtilsWin::Utf8ToWide(char* utf8,
|
| // If len is -1 then MultiByteToWideChar will include the terminating
|
| // NUL byte in the length.
|
| int wide_len = MultiByteToWideChar(CP_UTF8, 0, utf8, len, NULL, 0);
|
| - wchar_t* wide =
|
| - reinterpret_cast<wchar_t*>(malloc((wide_len) * sizeof(wchar_t)));
|
| + wchar_t* wide;
|
| + wide =
|
| + reinterpret_cast<wchar_t*>(Dart_ScopeAllocate(wide_len * sizeof(*wide)));
|
| MultiByteToWideChar(CP_UTF8, 0, utf8, len, wide, wide_len);
|
| if (result_len != NULL) {
|
| *result_len = wide_len;
|
| @@ -124,6 +129,7 @@ wchar_t* StringUtilsWin::Utf8ToWide(char* utf8,
|
| return wide;
|
| }
|
|
|
| +
|
| const char* StringUtils::Utf8ToConsoleString(
|
| const char* utf8, intptr_t len, intptr_t* result_len) {
|
| return const_cast<const char*>(
|
| @@ -131,6 +137,7 @@ const char* StringUtils::Utf8ToConsoleString(
|
| const_cast<char*>(utf8), len, result_len));
|
| }
|
|
|
| +
|
| const char* StringUtils::ConsoleStringToUtf8(
|
| const char* str, intptr_t len, intptr_t* result_len) {
|
| return const_cast<const char*>(
|
| @@ -138,23 +145,28 @@ const char* StringUtils::ConsoleStringToUtf8(
|
| const_cast<char*>(str), len, result_len));
|
| }
|
|
|
| +
|
| const char* StringUtilsWin::WideToUtf8(
|
| const wchar_t* wide, intptr_t len, intptr_t* result_len) {
|
| return const_cast<const char*>(
|
| StringUtilsWin::WideToUtf8(const_cast<wchar_t*>(wide), len, result_len));
|
| }
|
|
|
| +
|
| const wchar_t* StringUtilsWin::Utf8ToWide(
|
| const char* utf8, intptr_t len, intptr_t* result_len) {
|
| return const_cast<const wchar_t*>(
|
| StringUtilsWin::Utf8ToWide(const_cast<char*>(utf8), len, result_len));
|
| }
|
|
|
| +
|
| bool ShellUtils::GetUtf8Argv(int argc, char** argv) {
|
| wchar_t* command_line = GetCommandLineW();
|
| int unicode_argc;
|
| wchar_t** unicode_argv = CommandLineToArgvW(command_line, &unicode_argc);
|
| - if (unicode_argv == NULL) return false;
|
| + if (unicode_argv == NULL) {
|
| + return false;
|
| + }
|
| // The argc passed to main should have the same argc as we get here.
|
| ASSERT(argc == unicode_argc);
|
| if (argc < unicode_argc) {
|
| @@ -162,12 +174,17 @@ bool ShellUtils::GetUtf8Argv(int argc, char** argv) {
|
| }
|
| for (int i = 0; i < unicode_argc; i++) {
|
| wchar_t* arg = unicode_argv[i];
|
| - argv[i] = StringUtilsWin::WideToUtf8(arg);
|
| + int arg_len =
|
| + WideCharToMultiByte(CP_UTF8, 0, arg, -1, NULL, 0, NULL, NULL);
|
| + char* utf8_arg = reinterpret_cast<char*>(malloc(arg_len));
|
| + WideCharToMultiByte(CP_UTF8, 0, arg, -1, utf8_arg, arg_len, NULL, NULL);
|
| + argv[i] = utf8_arg;
|
| }
|
| LocalFree(unicode_argv);
|
| return true;
|
| }
|
|
|
| +
|
| static int64_t GetCurrentTimeMicros() {
|
| static const int64_t kTimeEpoc = 116444736000000000LL;
|
| static const int64_t kTimeScaler = 10; // 100 ns to us.
|
| @@ -187,6 +204,7 @@ static int64_t GetCurrentTimeMicros() {
|
| return (time.t_ - kTimeEpoc) / kTimeScaler;
|
| }
|
|
|
| +
|
| static int64_t qpc_ticks_per_second = 0;
|
|
|
| void TimerUtils::InitOnce() {
|
| @@ -198,10 +216,12 @@ void TimerUtils::InitOnce() {
|
| }
|
| }
|
|
|
| +
|
| int64_t TimerUtils::GetCurrentMonotonicMillis() {
|
| return GetCurrentMonotonicMicros() / 1000;
|
| }
|
|
|
| +
|
| int64_t TimerUtils::GetCurrentMonotonicMicros() {
|
| if (qpc_ticks_per_second == 0) {
|
| // QueryPerformanceCounter not supported, fallback.
|
| @@ -219,6 +239,7 @@ int64_t TimerUtils::GetCurrentMonotonicMicros() {
|
| return result;
|
| }
|
|
|
| +
|
| void TimerUtils::Sleep(int64_t millis) {
|
| ::Sleep(millis);
|
| }
|
|
|