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); |
} |