mirror of
https://github.com/dart-lang/sdk
synced 2024-10-04 18:36:29 +00:00
[windows] Make most file_win.cc functions use malloc for string conversions.
They have been using Dart_ScopeAllocate(), which makes them impossible to use outside of a scope. Also turn on inlining in the GN Debug windows build to match the gyp build and speed things up a bit. R=asiva@google.com, rmacnak@google.com Review URL: https://codereview.chromium.org/2439173002 .
This commit is contained in:
parent
ba04d1d627
commit
b6ea87c444
|
@ -732,10 +732,11 @@ config("optimize") {
|
||||||
# Turn off optimizations.
|
# Turn off optimizations.
|
||||||
config("no_optimize") {
|
config("no_optimize") {
|
||||||
if (is_win) {
|
if (is_win) {
|
||||||
|
# The only difference on windows is that the inlining is less aggressive.
|
||||||
|
# (We accept the default level). Otherwise it is very slow.
|
||||||
cflags = [
|
cflags = [
|
||||||
"/O2", # Do some optimizations.
|
"/O2", # Do some optimizations.
|
||||||
"/Oy-", # Disable omitting frame pointers, must be after /O2.
|
"/Oy-", # Disable omitting frame pointers, must be after /O2.
|
||||||
"/Ob0", # Disable all inlining (on by default).
|
|
||||||
]
|
]
|
||||||
} else if (is_android) {
|
} else if (is_android) {
|
||||||
# On Android we kind of optimize some things that don't affect debugging
|
# On Android we kind of optimize some things that don't affect debugging
|
||||||
|
|
|
@ -50,8 +50,8 @@ const char* PathBuffer::AsScopedString() const {
|
||||||
|
|
||||||
|
|
||||||
bool PathBuffer::Add(const char* name) {
|
bool PathBuffer::Add(const char* name) {
|
||||||
const wchar_t* wide_name = StringUtilsWin::Utf8ToWide(name);
|
Utf8ToWideScope wide_name(name);
|
||||||
return AddW(wide_name);
|
return AddW(wide_name.wide());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -377,8 +377,8 @@ static Directory::ExistsResult ExistsHelper(const wchar_t* dir_name) {
|
||||||
|
|
||||||
|
|
||||||
Directory::ExistsResult Directory::Exists(const char* dir_name) {
|
Directory::ExistsResult Directory::Exists(const char* dir_name) {
|
||||||
const wchar_t* system_name = StringUtilsWin::Utf8ToWide(dir_name);
|
Utf8ToWideScope system_name(dir_name);
|
||||||
return ExistsHelper(system_name);
|
return ExistsHelper(system_name.wide());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -412,19 +412,19 @@ const char* Directory::Current() {
|
||||||
|
|
||||||
|
|
||||||
bool Directory::SetCurrent(const char* path) {
|
bool Directory::SetCurrent(const char* path) {
|
||||||
const wchar_t* system_path = StringUtilsWin::Utf8ToWide(path);
|
Utf8ToWideScope system_path(path);
|
||||||
bool result = SetCurrentDirectoryW(system_path) != 0;
|
bool result = SetCurrentDirectoryW(system_path.wide()) != 0;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Directory::Create(const char* dir_name) {
|
bool Directory::Create(const char* dir_name) {
|
||||||
const wchar_t* system_name = StringUtilsWin::Utf8ToWide(dir_name);
|
Utf8ToWideScope system_name(dir_name);
|
||||||
int create_status = CreateDirectoryW(system_name, NULL);
|
int create_status = CreateDirectoryW(system_name.wide(), NULL);
|
||||||
// If the directory already existed, treat it as a success.
|
// If the directory already existed, treat it as a success.
|
||||||
if ((create_status == 0) &&
|
if ((create_status == 0) &&
|
||||||
(GetLastError() == ERROR_ALREADY_EXISTS) &&
|
(GetLastError() == ERROR_ALREADY_EXISTS) &&
|
||||||
(ExistsHelper(system_name) == EXISTS)) {
|
(ExistsHelper(system_name.wide()) == EXISTS)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return (create_status != 0);
|
return (create_status != 0);
|
||||||
|
@ -446,8 +446,8 @@ const char* Directory::CreateTemp(const char* prefix) {
|
||||||
// descriptor inherited from its parent directory.
|
// descriptor inherited from its parent directory.
|
||||||
// The return value is Dart_ScopeAllocated.
|
// The return value is Dart_ScopeAllocated.
|
||||||
PathBuffer path;
|
PathBuffer path;
|
||||||
const wchar_t* system_prefix = StringUtilsWin::Utf8ToWide(prefix);
|
Utf8ToWideScope system_prefix(prefix);
|
||||||
if (!path.AddW(system_prefix)) {
|
if (!path.AddW(system_prefix.wide())) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -481,16 +481,16 @@ const char* Directory::CreateTemp(const char* prefix) {
|
||||||
|
|
||||||
bool Directory::Delete(const char* dir_name, bool recursive) {
|
bool Directory::Delete(const char* dir_name, bool recursive) {
|
||||||
bool result = false;
|
bool result = false;
|
||||||
const wchar_t* system_dir_name = StringUtilsWin::Utf8ToWide(dir_name);
|
Utf8ToWideScope system_dir_name(dir_name);
|
||||||
if (!recursive) {
|
if (!recursive) {
|
||||||
if (File::GetType(dir_name, true) == File::kIsDirectory) {
|
if (File::GetType(dir_name, true) == File::kIsDirectory) {
|
||||||
result = (RemoveDirectoryW(system_dir_name) != 0);
|
result = (RemoveDirectoryW(system_dir_name.wide()) != 0);
|
||||||
} else {
|
} else {
|
||||||
SetLastError(ERROR_FILE_NOT_FOUND);
|
SetLastError(ERROR_FILE_NOT_FOUND);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
PathBuffer path;
|
PathBuffer path;
|
||||||
if (path.AddW(system_dir_name)) {
|
if (path.AddW(system_dir_name.wide())) {
|
||||||
result = DeleteRecursively(&path);
|
result = DeleteRecursively(&path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -499,13 +499,13 @@ bool Directory::Delete(const char* dir_name, bool recursive) {
|
||||||
|
|
||||||
|
|
||||||
bool Directory::Rename(const char* path, const char* new_path) {
|
bool Directory::Rename(const char* path, const char* new_path) {
|
||||||
const wchar_t* system_path = StringUtilsWin::Utf8ToWide(path);
|
Utf8ToWideScope system_path(path);
|
||||||
const wchar_t* system_new_path = StringUtilsWin::Utf8ToWide(new_path);
|
Utf8ToWideScope system_new_path(new_path);
|
||||||
ExistsResult exists = ExistsHelper(system_path);
|
ExistsResult exists = ExistsHelper(system_path.wide());
|
||||||
if (exists != EXISTS) {
|
if (exists != EXISTS) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
ExistsResult new_exists = ExistsHelper(system_new_path);
|
ExistsResult new_exists = ExistsHelper(system_new_path.wide());
|
||||||
// MoveFile does not allow replacing exising directories. Therefore,
|
// MoveFile does not allow replacing exising directories. Therefore,
|
||||||
// if the new_path is currently a directory we need to delete it
|
// if the new_path is currently a directory we need to delete it
|
||||||
// first.
|
// first.
|
||||||
|
@ -517,7 +517,7 @@ bool Directory::Rename(const char* path, const char* new_path) {
|
||||||
}
|
}
|
||||||
DWORD flags = MOVEFILE_WRITE_THROUGH;
|
DWORD flags = MOVEFILE_WRITE_THROUGH;
|
||||||
int move_status =
|
int move_status =
|
||||||
MoveFileExW(system_path, system_new_path, flags);
|
MoveFileExW(system_path.wide(), system_new_path.wide(), flags);
|
||||||
return (move_status != 0);
|
return (move_status != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -92,7 +92,7 @@ void FUNCTION_NAME(File_Open)(Dart_NativeArguments args) {
|
||||||
// reading. This is to prevent the opening of directories as
|
// reading. This is to prevent the opening of directories as
|
||||||
// files. Directories can be opened for reading using the posix
|
// files. Directories can be opened for reading using the posix
|
||||||
// 'open' call.
|
// 'open' call.
|
||||||
File* file = File::ScopedOpen(filename, file_mode);
|
File* file = File::Open(filename, file_mode);
|
||||||
if (file != NULL) {
|
if (file != NULL) {
|
||||||
Dart_SetReturnValue(args,
|
Dart_SetReturnValue(args,
|
||||||
Dart_NewInteger(reinterpret_cast<intptr_t>(file)));
|
Dart_NewInteger(reinterpret_cast<intptr_t>(file)));
|
||||||
|
@ -677,7 +677,7 @@ CObject* File::OpenRequest(const CObjectArray& request) {
|
||||||
File::DartFileOpenMode dart_file_mode =
|
File::DartFileOpenMode dart_file_mode =
|
||||||
static_cast<File::DartFileOpenMode>(mode.Value());
|
static_cast<File::DartFileOpenMode>(mode.Value());
|
||||||
File::FileOpenMode file_mode = File::DartModeToFileMode(dart_file_mode);
|
File::FileOpenMode file_mode = File::DartModeToFileMode(dart_file_mode);
|
||||||
file = File::ScopedOpen(filename.CString(), file_mode);
|
file = File::Open(filename.CString(), file_mode);
|
||||||
if (file != NULL) {
|
if (file != NULL) {
|
||||||
return new CObjectIntptr(
|
return new CObjectIntptr(
|
||||||
CObject::NewIntptr(reinterpret_cast<intptr_t>(file)));
|
CObject::NewIntptr(reinterpret_cast<intptr_t>(file)));
|
||||||
|
|
|
@ -157,15 +157,8 @@ class File : public ReferenceCounted<File> {
|
||||||
// reading and writing. If mode contains kWrite and the file does
|
// reading and writing. If mode contains kWrite and the file does
|
||||||
// not exist the file is created. The file is truncated to length 0 if
|
// not exist the file is created. The file is truncated to length 0 if
|
||||||
// mode contains kTruncate. Assumes we are in an API scope.
|
// mode contains kTruncate. Assumes we are in an API scope.
|
||||||
static File* ScopedOpen(const char* path, FileOpenMode mode);
|
|
||||||
|
|
||||||
// Like ScopedOpen(), but no API scope is needed.
|
|
||||||
static File* Open(const char* path, FileOpenMode mode);
|
static File* Open(const char* path, FileOpenMode mode);
|
||||||
|
|
||||||
// Caution! On Windows, the static functions below may call
|
|
||||||
// Dart_ScopeAllocate() to do string conversions! If you call these functions
|
|
||||||
// without a scope, they will fail on Windows!
|
|
||||||
|
|
||||||
// Create a file object for the specified stdio file descriptor
|
// Create a file object for the specified stdio file descriptor
|
||||||
// (stdin, stout or stderr).
|
// (stdin, stout or stderr).
|
||||||
static File* OpenStdio(int fd);
|
static File* OpenStdio(int fd);
|
||||||
|
@ -181,15 +174,17 @@ class File : public ReferenceCounted<File> {
|
||||||
static int64_t LengthFromPath(const char* path);
|
static int64_t LengthFromPath(const char* path);
|
||||||
static void Stat(const char* path, int64_t* data);
|
static void Stat(const char* path, int64_t* data);
|
||||||
static time_t LastModified(const char* path);
|
static time_t LastModified(const char* path);
|
||||||
static const char* LinkTarget(const char* pathname);
|
|
||||||
static bool IsAbsolutePath(const char* path);
|
static bool IsAbsolutePath(const char* path);
|
||||||
static const char* GetCanonicalPath(const char* path);
|
|
||||||
static const char* PathSeparator();
|
static const char* PathSeparator();
|
||||||
static const char* StringEscapedPathSeparator();
|
static const char* StringEscapedPathSeparator();
|
||||||
static Type GetType(const char* path, bool follow_links);
|
static Type GetType(const char* path, bool follow_links);
|
||||||
static Identical AreIdentical(const char* file_1, const char* file_2);
|
static Identical AreIdentical(const char* file_1, const char* file_2);
|
||||||
static StdioHandleType GetStdioHandleType(int fd);
|
static StdioHandleType GetStdioHandleType(int fd);
|
||||||
|
|
||||||
|
// LinkTarget and GetCanonicalPath may call Dart_ScopeAllocate.
|
||||||
|
static const char* LinkTarget(const char* pathname);
|
||||||
|
static const char* GetCanonicalPath(const char* path);
|
||||||
|
|
||||||
static FileOpenMode DartModeToFileMode(DartFileOpenMode mode);
|
static FileOpenMode DartModeToFileMode(DartFileOpenMode mode);
|
||||||
|
|
||||||
static CObject* ExistsRequest(const CObjectArray& request);
|
static CObject* ExistsRequest(const CObjectArray& request);
|
||||||
|
|
|
@ -183,7 +183,7 @@ File* File::FileOpenW(const wchar_t* system_name, FileOpenMode mode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
File* File::ScopedOpen(const char* name, FileOpenMode mode) {
|
File* File::Open(const char* name, FileOpenMode mode) {
|
||||||
// Report errors for non-regular files.
|
// Report errors for non-regular files.
|
||||||
struct stat st;
|
struct stat st;
|
||||||
if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
|
if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
|
||||||
|
@ -220,12 +220,6 @@ File* File::ScopedOpen(const char* name, FileOpenMode mode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
File* File::Open(const char* path, FileOpenMode mode) {
|
|
||||||
// ScopedOpen doesn't actually need a scope.
|
|
||||||
return ScopedOpen(path, mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
File* File::OpenStdio(int fd) {
|
File* File::OpenStdio(int fd) {
|
||||||
return ((fd < 0) || (2 < fd)) ? NULL : new File(new FileHandle(fd));
|
return ((fd < 0) || (2 < fd)) ? NULL : new File(new FileHandle(fd));
|
||||||
}
|
}
|
||||||
|
|
|
@ -164,7 +164,7 @@ File* File::FileOpenW(const wchar_t* system_name, FileOpenMode mode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
File* File::ScopedOpen(const char* name, FileOpenMode mode) {
|
File* File::Open(const char* name, FileOpenMode mode) {
|
||||||
// Report errors for non-regular files.
|
// Report errors for non-regular files.
|
||||||
struct stat st;
|
struct stat st;
|
||||||
if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
|
if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
|
||||||
|
@ -201,12 +201,6 @@ File* File::ScopedOpen(const char* name, FileOpenMode mode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
File* File::Open(const char* path, FileOpenMode mode) {
|
|
||||||
// ScopedOpen doesn't actually need a scope.
|
|
||||||
return ScopedOpen(path, mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
File* File::OpenStdio(int fd) {
|
File* File::OpenStdio(int fd) {
|
||||||
return ((fd < 0) || (2 < fd)) ? NULL : new File(new FileHandle(fd));
|
return ((fd < 0) || (2 < fd)) ? NULL : new File(new FileHandle(fd));
|
||||||
}
|
}
|
||||||
|
|
|
@ -182,7 +182,7 @@ File* File::FileOpenW(const wchar_t* system_name, FileOpenMode mode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
File* File::ScopedOpen(const char* name, FileOpenMode mode) {
|
File* File::Open(const char* name, FileOpenMode mode) {
|
||||||
// Report errors for non-regular files.
|
// Report errors for non-regular files.
|
||||||
struct stat64 st;
|
struct stat64 st;
|
||||||
if (TEMP_FAILURE_RETRY(stat64(name, &st)) == 0) {
|
if (TEMP_FAILURE_RETRY(stat64(name, &st)) == 0) {
|
||||||
|
@ -220,12 +220,6 @@ File* File::ScopedOpen(const char* name, FileOpenMode mode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
File* File::Open(const char* path, FileOpenMode mode) {
|
|
||||||
// ScopedOpen doesn't actually need a scope.
|
|
||||||
return ScopedOpen(path, mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
File* File::OpenStdio(int fd) {
|
File* File::OpenStdio(int fd) {
|
||||||
return ((fd < 0) || (2 < fd)) ? NULL : new File(new FileHandle(fd));
|
return ((fd < 0) || (2 < fd)) ? NULL : new File(new FileHandle(fd));
|
||||||
}
|
}
|
||||||
|
|
|
@ -185,7 +185,7 @@ File* File::FileOpenW(const wchar_t* system_name, FileOpenMode mode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
File* File::ScopedOpen(const char* name, FileOpenMode mode) {
|
File* File::Open(const char* name, FileOpenMode mode) {
|
||||||
// Report errors for non-regular files.
|
// Report errors for non-regular files.
|
||||||
struct stat st;
|
struct stat st;
|
||||||
if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
|
if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
|
||||||
|
@ -223,12 +223,6 @@ File* File::ScopedOpen(const char* name, FileOpenMode mode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
File* File::Open(const char* path, FileOpenMode mode) {
|
|
||||||
// ScopedOpen doesn't actually need a scope.
|
|
||||||
return ScopedOpen(path, mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
File* File::OpenStdio(int fd) {
|
File* File::OpenStdio(int fd) {
|
||||||
return ((fd < 0) || (2 < fd)) ? NULL : new File(new FileHandle(fd));
|
return ((fd < 0) || (2 < fd)) ? NULL : new File(new FileHandle(fd));
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,8 +40,8 @@ intptr_t FileSystemWatcher::WatchPath(intptr_t id,
|
||||||
int events,
|
int events,
|
||||||
bool recursive) {
|
bool recursive) {
|
||||||
USE(id);
|
USE(id);
|
||||||
const wchar_t* name = StringUtilsWin::Utf8ToWide(path);
|
Utf8ToWideScope name(path);
|
||||||
HANDLE dir = CreateFileW(name,
|
HANDLE dir = CreateFileW(name.wide(),
|
||||||
FILE_LIST_DIRECTORY,
|
FILE_LIST_DIRECTORY,
|
||||||
FILE_SHARE_READ |
|
FILE_SHARE_READ |
|
||||||
FILE_SHARE_WRITE |
|
FILE_SHARE_WRITE |
|
||||||
|
|
|
@ -233,21 +233,9 @@ File* File::FileOpenW(const wchar_t* system_name, FileOpenMode mode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
File* File::ScopedOpen(const char* name, FileOpenMode mode) {
|
|
||||||
const wchar_t* system_name = StringUtilsWin::Utf8ToWide(name);
|
|
||||||
return FileOpenW(system_name, mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
File* File::Open(const char* path, FileOpenMode mode) {
|
File* File::Open(const char* path, FileOpenMode mode) {
|
||||||
int path_len = MultiByteToWideChar(CP_UTF8, 0, path, -1, NULL, 0);
|
Utf8ToWideScope system_name(path);
|
||||||
wchar_t* system_name = new wchar_t[path_len];
|
File* file = FileOpenW(system_name.wide(), mode);
|
||||||
if (system_name == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
MultiByteToWideChar(CP_UTF8, 0, path, -1, system_name, path_len);
|
|
||||||
File* file = FileOpenW(system_name, mode);
|
|
||||||
delete[] system_name;
|
|
||||||
return file;
|
return file;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -270,8 +258,8 @@ File* File::OpenStdio(int fd) {
|
||||||
|
|
||||||
bool File::Exists(const char* name) {
|
bool File::Exists(const char* name) {
|
||||||
struct __stat64 st;
|
struct __stat64 st;
|
||||||
const wchar_t* system_name = StringUtilsWin::Utf8ToWide(name);
|
Utf8ToWideScope system_name(name);
|
||||||
bool stat_status = _wstat64(system_name, &st);
|
bool stat_status = _wstat64(system_name.wide(), &st);
|
||||||
if (stat_status == 0) {
|
if (stat_status == 0) {
|
||||||
return ((st.st_mode & S_IFMT) == S_IFREG);
|
return ((st.st_mode & S_IFMT) == S_IFREG);
|
||||||
} else {
|
} else {
|
||||||
|
@ -281,8 +269,8 @@ bool File::Exists(const char* name) {
|
||||||
|
|
||||||
|
|
||||||
bool File::Create(const char* name) {
|
bool File::Create(const char* name) {
|
||||||
const wchar_t* system_name = StringUtilsWin::Utf8ToWide(name);
|
Utf8ToWideScope system_name(name);
|
||||||
int fd = _wopen(system_name, O_RDONLY | O_CREAT, 0666);
|
int fd = _wopen(system_name.wide(), O_RDONLY | O_CREAT, 0666);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -326,17 +314,17 @@ static const int kMountPointHeaderSize = 4 * sizeof USHORT;
|
||||||
|
|
||||||
|
|
||||||
bool File::CreateLink(const char* utf8_name, const char* utf8_target) {
|
bool File::CreateLink(const char* utf8_name, const char* utf8_target) {
|
||||||
const wchar_t* name = StringUtilsWin::Utf8ToWide(utf8_name);
|
Utf8ToWideScope name(utf8_name);
|
||||||
int create_status = CreateDirectoryW(name, NULL);
|
int create_status = CreateDirectoryW(name.wide(), NULL);
|
||||||
// If the directory already existed, treat it as a success.
|
// If the directory already existed, treat it as a success.
|
||||||
if ((create_status == 0) &&
|
if ((create_status == 0) &&
|
||||||
((GetLastError() != ERROR_ALREADY_EXISTS) ||
|
((GetLastError() != ERROR_ALREADY_EXISTS) ||
|
||||||
((GetFileAttributesW(name) & FILE_ATTRIBUTE_DIRECTORY) != 0))) {
|
((GetFileAttributesW(name.wide()) & FILE_ATTRIBUTE_DIRECTORY) != 0))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
HANDLE dir_handle = CreateFileW(
|
HANDLE dir_handle = CreateFileW(
|
||||||
name,
|
name.wide(),
|
||||||
GENERIC_READ | GENERIC_WRITE,
|
GENERIC_READ | GENERIC_WRITE,
|
||||||
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
|
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -347,8 +335,8 @@ bool File::CreateLink(const char* utf8_name, const char* utf8_target) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const wchar_t* target = StringUtilsWin::Utf8ToWide(utf8_target);
|
Utf8ToWideScope target(utf8_target);
|
||||||
int target_len = wcslen(target);
|
int target_len = wcslen(target.wide());
|
||||||
if (target_len > MAX_PATH - 1) {
|
if (target_len > MAX_PATH - 1) {
|
||||||
CloseHandle(dir_handle);
|
CloseHandle(dir_handle);
|
||||||
return false;
|
return false;
|
||||||
|
@ -357,13 +345,13 @@ bool File::CreateLink(const char* utf8_name, const char* utf8_target) {
|
||||||
int reparse_data_buffer_size =
|
int reparse_data_buffer_size =
|
||||||
sizeof REPARSE_DATA_BUFFER + 2 * MAX_PATH * sizeof WCHAR;
|
sizeof REPARSE_DATA_BUFFER + 2 * MAX_PATH * sizeof WCHAR;
|
||||||
REPARSE_DATA_BUFFER* reparse_data_buffer =
|
REPARSE_DATA_BUFFER* reparse_data_buffer =
|
||||||
reinterpret_cast<REPARSE_DATA_BUFFER*>(Dart_ScopeAllocate(
|
reinterpret_cast<REPARSE_DATA_BUFFER*>(malloc(reparse_data_buffer_size));
|
||||||
reparse_data_buffer_size));
|
|
||||||
reparse_data_buffer->ReparseTag = IO_REPARSE_TAG_MOUNT_POINT;
|
reparse_data_buffer->ReparseTag = IO_REPARSE_TAG_MOUNT_POINT;
|
||||||
wcscpy(reparse_data_buffer->MountPointReparseBuffer.PathBuffer, target);
|
wcscpy(reparse_data_buffer->MountPointReparseBuffer.PathBuffer,
|
||||||
|
target.wide());
|
||||||
wcscpy(
|
wcscpy(
|
||||||
reparse_data_buffer->MountPointReparseBuffer.PathBuffer + target_len + 1,
|
reparse_data_buffer->MountPointReparseBuffer.PathBuffer + target_len + 1,
|
||||||
target);
|
target.wide());
|
||||||
reparse_data_buffer->MountPointReparseBuffer.SubstituteNameOffset = 0;
|
reparse_data_buffer->MountPointReparseBuffer.SubstituteNameOffset = 0;
|
||||||
reparse_data_buffer->MountPointReparseBuffer.SubstituteNameLength =
|
reparse_data_buffer->MountPointReparseBuffer.SubstituteNameLength =
|
||||||
target_len * sizeof WCHAR;
|
target_len * sizeof WCHAR;
|
||||||
|
@ -383,6 +371,7 @@ bool File::CreateLink(const char* utf8_name, const char* utf8_target) {
|
||||||
0,
|
0,
|
||||||
&dummy_received_bytes,
|
&dummy_received_bytes,
|
||||||
NULL);
|
NULL);
|
||||||
|
free(reparse_data_buffer);
|
||||||
if (CloseHandle(dir_handle) == 0) {
|
if (CloseHandle(dir_handle) == 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -391,20 +380,20 @@ bool File::CreateLink(const char* utf8_name, const char* utf8_target) {
|
||||||
|
|
||||||
|
|
||||||
bool File::Delete(const char* name) {
|
bool File::Delete(const char* name) {
|
||||||
const wchar_t* system_name = StringUtilsWin::Utf8ToWide(name);
|
Utf8ToWideScope system_name(name);
|
||||||
int status = _wremove(system_name);
|
int status = _wremove(system_name.wide());
|
||||||
return status != -1;
|
return status != -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool File::DeleteLink(const char* name) {
|
bool File::DeleteLink(const char* name) {
|
||||||
const wchar_t* system_name = StringUtilsWin::Utf8ToWide(name);
|
Utf8ToWideScope system_name(name);
|
||||||
bool result = false;
|
bool result = false;
|
||||||
DWORD attributes = GetFileAttributesW(system_name);
|
DWORD attributes = GetFileAttributesW(system_name.wide());
|
||||||
if ((attributes != INVALID_FILE_ATTRIBUTES) &&
|
if ((attributes != INVALID_FILE_ATTRIBUTES) &&
|
||||||
(attributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0) {
|
(attributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0) {
|
||||||
// It's a junction(link), delete it.
|
// It's a junction(link), delete it.
|
||||||
result = (RemoveDirectoryW(system_name) != 0);
|
result = (RemoveDirectoryW(system_name.wide()) != 0);
|
||||||
} else {
|
} else {
|
||||||
SetLastError(ERROR_NOT_A_REPARSE_POINT);
|
SetLastError(ERROR_NOT_A_REPARSE_POINT);
|
||||||
}
|
}
|
||||||
|
@ -415,11 +404,11 @@ bool File::DeleteLink(const char* name) {
|
||||||
bool File::Rename(const char* old_path, const char* new_path) {
|
bool File::Rename(const char* old_path, const char* new_path) {
|
||||||
File::Type type = GetType(old_path, false);
|
File::Type type = GetType(old_path, false);
|
||||||
if (type == kIsFile) {
|
if (type == kIsFile) {
|
||||||
const wchar_t* system_old_path = StringUtilsWin::Utf8ToWide(old_path);
|
Utf8ToWideScope system_old_path(old_path);
|
||||||
const wchar_t* system_new_path = StringUtilsWin::Utf8ToWide(new_path);
|
Utf8ToWideScope system_new_path(new_path);
|
||||||
DWORD flags = MOVEFILE_WRITE_THROUGH | MOVEFILE_REPLACE_EXISTING;
|
DWORD flags = MOVEFILE_WRITE_THROUGH | MOVEFILE_REPLACE_EXISTING;
|
||||||
int move_status =
|
int move_status =
|
||||||
MoveFileExW(system_old_path, system_new_path, flags);
|
MoveFileExW(system_old_path.wide(), system_new_path.wide(), flags);
|
||||||
return (move_status != 0);
|
return (move_status != 0);
|
||||||
} else {
|
} else {
|
||||||
SetLastError(ERROR_FILE_NOT_FOUND);
|
SetLastError(ERROR_FILE_NOT_FOUND);
|
||||||
|
@ -431,11 +420,11 @@ bool File::Rename(const char* old_path, const char* new_path) {
|
||||||
bool File::RenameLink(const char* old_path, const char* new_path) {
|
bool File::RenameLink(const char* old_path, const char* new_path) {
|
||||||
File::Type type = GetType(old_path, false);
|
File::Type type = GetType(old_path, false);
|
||||||
if (type == kIsLink) {
|
if (type == kIsLink) {
|
||||||
const wchar_t* system_old_path = StringUtilsWin::Utf8ToWide(old_path);
|
Utf8ToWideScope system_old_path(old_path);
|
||||||
const wchar_t* system_new_path = StringUtilsWin::Utf8ToWide(new_path);
|
Utf8ToWideScope system_new_path(new_path);
|
||||||
DWORD flags = MOVEFILE_WRITE_THROUGH | MOVEFILE_REPLACE_EXISTING;
|
DWORD flags = MOVEFILE_WRITE_THROUGH | MOVEFILE_REPLACE_EXISTING;
|
||||||
int move_status =
|
int move_status =
|
||||||
MoveFileExW(system_old_path, system_new_path, flags);
|
MoveFileExW(system_old_path.wide(), system_new_path.wide(), flags);
|
||||||
return (move_status != 0);
|
return (move_status != 0);
|
||||||
} else {
|
} else {
|
||||||
SetLastError(ERROR_FILE_NOT_FOUND);
|
SetLastError(ERROR_FILE_NOT_FOUND);
|
||||||
|
@ -447,10 +436,10 @@ bool File::RenameLink(const char* old_path, const char* new_path) {
|
||||||
bool File::Copy(const char* old_path, const char* new_path) {
|
bool File::Copy(const char* old_path, const char* new_path) {
|
||||||
File::Type type = GetType(old_path, false);
|
File::Type type = GetType(old_path, false);
|
||||||
if (type == kIsFile) {
|
if (type == kIsFile) {
|
||||||
const wchar_t* system_old_path = StringUtilsWin::Utf8ToWide(old_path);
|
Utf8ToWideScope system_old_path(old_path);
|
||||||
const wchar_t* system_new_path = StringUtilsWin::Utf8ToWide(new_path);
|
Utf8ToWideScope system_new_path(new_path);
|
||||||
bool success = CopyFileExW(system_old_path,
|
bool success = CopyFileExW(system_old_path.wide(),
|
||||||
system_new_path,
|
system_new_path.wide(),
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -465,8 +454,8 @@ bool File::Copy(const char* old_path, const char* new_path) {
|
||||||
|
|
||||||
int64_t File::LengthFromPath(const char* name) {
|
int64_t File::LengthFromPath(const char* name) {
|
||||||
struct __stat64 st;
|
struct __stat64 st;
|
||||||
const wchar_t* system_name = StringUtilsWin::Utf8ToWide(name);
|
Utf8ToWideScope system_name(name);
|
||||||
int stat_status = _wstat64(system_name, &st);
|
int stat_status = _wstat64(system_name.wide(), &st);
|
||||||
if (stat_status == 0) {
|
if (stat_status == 0) {
|
||||||
return st.st_size;
|
return st.st_size;
|
||||||
}
|
}
|
||||||
|
@ -565,8 +554,8 @@ void File::Stat(const char* name, int64_t* data) {
|
||||||
data[kType] = type;
|
data[kType] = type;
|
||||||
if (type != kDoesNotExist) {
|
if (type != kDoesNotExist) {
|
||||||
struct _stat64 st;
|
struct _stat64 st;
|
||||||
const wchar_t* system_name = StringUtilsWin::Utf8ToWide(name);
|
Utf8ToWideScope system_name(name);
|
||||||
int stat_status = _wstat64(system_name, &st);
|
int stat_status = _wstat64(system_name.wide(), &st);
|
||||||
if (stat_status == 0) {
|
if (stat_status == 0) {
|
||||||
data[kCreatedTime] = st.st_ctime * 1000;
|
data[kCreatedTime] = st.st_ctime * 1000;
|
||||||
data[kModifiedTime] = st.st_mtime * 1000;
|
data[kModifiedTime] = st.st_mtime * 1000;
|
||||||
|
@ -582,8 +571,8 @@ void File::Stat(const char* name, int64_t* data) {
|
||||||
|
|
||||||
time_t File::LastModified(const char* name) {
|
time_t File::LastModified(const char* name) {
|
||||||
struct __stat64 st;
|
struct __stat64 st;
|
||||||
const wchar_t* system_name = StringUtilsWin::Utf8ToWide(name);
|
Utf8ToWideScope system_name(name);
|
||||||
int stat_status = _wstat64(system_name, &st);
|
int stat_status = _wstat64(system_name.wide(), &st);
|
||||||
if (stat_status == 0) {
|
if (stat_status == 0) {
|
||||||
return st.st_mtime;
|
return st.st_mtime;
|
||||||
}
|
}
|
||||||
|
@ -603,9 +592,9 @@ bool File::IsAbsolutePath(const char* pathname) {
|
||||||
|
|
||||||
|
|
||||||
const char* File::GetCanonicalPath(const char* pathname) {
|
const char* File::GetCanonicalPath(const char* pathname) {
|
||||||
const wchar_t* system_name = StringUtilsWin::Utf8ToWide(pathname);
|
Utf8ToWideScope system_name(pathname);
|
||||||
HANDLE file_handle = CreateFileW(
|
HANDLE file_handle = CreateFileW(
|
||||||
system_name,
|
system_name.wide(),
|
||||||
0,
|
0,
|
||||||
FILE_SHARE_READ,
|
FILE_SHARE_READ,
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -639,7 +628,7 @@ const char* File::GetCanonicalPath(const char* pathname) {
|
||||||
if ((result_size < MAX_PATH - 1 + 4) &&
|
if ((result_size < MAX_PATH - 1 + 4) &&
|
||||||
(result_size > 4) &&
|
(result_size > 4) &&
|
||||||
(wcsncmp(path, L"\\\\?\\", 4) == 0) &&
|
(wcsncmp(path, L"\\\\?\\", 4) == 0) &&
|
||||||
(wcsncmp(system_name, L"\\\\?\\", 4) != 0)) {
|
(wcsncmp(system_name.wide(), L"\\\\?\\", 4) != 0)) {
|
||||||
result = StringUtilsWin::WideToUtf8(path + 4);
|
result = StringUtilsWin::WideToUtf8(path + 4);
|
||||||
} else {
|
} else {
|
||||||
result = StringUtilsWin::WideToUtf8(path);
|
result = StringUtilsWin::WideToUtf8(path);
|
||||||
|
@ -670,19 +659,15 @@ File::StdioHandleType File::GetStdioHandleType(int fd) {
|
||||||
|
|
||||||
File::Type File::GetType(const char* pathname, bool follow_links) {
|
File::Type File::GetType(const char* pathname, bool follow_links) {
|
||||||
// Convert to wchar_t string.
|
// Convert to wchar_t string.
|
||||||
int name_len = MultiByteToWideChar(CP_UTF8, 0, pathname, -1, NULL, 0);
|
Utf8ToWideScope name(pathname);
|
||||||
wchar_t* name;
|
DWORD attributes = GetFileAttributesW(name.wide());
|
||||||
name = new wchar_t[name_len];
|
|
||||||
MultiByteToWideChar(CP_UTF8, 0, pathname, -1, name, name_len);
|
|
||||||
|
|
||||||
DWORD attributes = GetFileAttributesW(name);
|
|
||||||
File::Type result = kIsFile;
|
File::Type result = kIsFile;
|
||||||
if (attributes == INVALID_FILE_ATTRIBUTES) {
|
if (attributes == INVALID_FILE_ATTRIBUTES) {
|
||||||
result = kDoesNotExist;
|
result = kDoesNotExist;
|
||||||
} else if ((attributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0) {
|
} else if ((attributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0) {
|
||||||
if (follow_links) {
|
if (follow_links) {
|
||||||
HANDLE dir_handle = CreateFileW(
|
HANDLE dir_handle = CreateFileW(
|
||||||
name,
|
name.wide(),
|
||||||
0,
|
0,
|
||||||
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
|
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -701,7 +686,6 @@ File::Type File::GetType(const char* pathname, bool follow_links) {
|
||||||
} else if ((attributes & FILE_ATTRIBUTE_DIRECTORY) != 0) {
|
} else if ((attributes & FILE_ATTRIBUTE_DIRECTORY) != 0) {
|
||||||
result = kIsDirectory;
|
result = kIsDirectory;
|
||||||
}
|
}
|
||||||
delete[] name;
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -710,9 +694,9 @@ File::Identical File::AreIdentical(const char* file_1, const char* file_2) {
|
||||||
BY_HANDLE_FILE_INFORMATION file_info[2];
|
BY_HANDLE_FILE_INFORMATION file_info[2];
|
||||||
const char* file_names[2] = { file_1, file_2 };
|
const char* file_names[2] = { file_1, file_2 };
|
||||||
for (int i = 0; i < 2; ++i) {
|
for (int i = 0; i < 2; ++i) {
|
||||||
const wchar_t* wide_name = StringUtilsWin::Utf8ToWide(file_names[i]);
|
Utf8ToWideScope wide_name(file_names[i]);
|
||||||
HANDLE file_handle = CreateFileW(
|
HANDLE file_handle = CreateFileW(
|
||||||
wide_name,
|
wide_name.wide(),
|
||||||
0,
|
0,
|
||||||
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
|
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
|
||||||
NULL,
|
NULL,
|
||||||
|
|
|
@ -370,12 +370,12 @@ bool Socket::ReverseLookup(const RawAddr& addr,
|
||||||
|
|
||||||
bool Socket::ParseAddress(int type, const char* address, RawAddr* addr) {
|
bool Socket::ParseAddress(int type, const char* address, RawAddr* addr) {
|
||||||
int result;
|
int result;
|
||||||
const wchar_t* system_address = StringUtilsWin::Utf8ToWide(address);
|
Utf8ToWideScope system_address(address);
|
||||||
if (type == SocketAddress::TYPE_IPV4) {
|
if (type == SocketAddress::TYPE_IPV4) {
|
||||||
result = InetPton(AF_INET, system_address, &addr->in.sin_addr);
|
result = InetPton(AF_INET, system_address.wide(), &addr->in.sin_addr);
|
||||||
} else {
|
} else {
|
||||||
ASSERT(type == SocketAddress::TYPE_IPV6);
|
ASSERT(type == SocketAddress::TYPE_IPV6);
|
||||||
result = InetPton(AF_INET6, system_address, &addr->in6.sin6_addr);
|
result = InetPton(AF_INET6, system_address.wide(), &addr->in6.sin6_addr);
|
||||||
}
|
}
|
||||||
return result == 1;
|
return result == 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,6 +37,61 @@ class StringUtilsWin {
|
||||||
DISALLOW_IMPLICIT_CONSTRUCTORS(StringUtilsWin);
|
DISALLOW_IMPLICIT_CONSTRUCTORS(StringUtilsWin);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// These scopes provide strings converted as indicated by the scope names.
|
||||||
|
// The provided strings are allocated with 'new' and have the same lifetime as
|
||||||
|
// the scope.
|
||||||
|
class WideToUtf8Scope {
|
||||||
|
public:
|
||||||
|
explicit WideToUtf8Scope(const wchar_t* wide) {
|
||||||
|
intptr_t utf8_len = WideCharToMultiByte(
|
||||||
|
CP_UTF8, 0, wide, -1, NULL, 0, NULL, NULL);
|
||||||
|
char* utf8 = new char[utf8_len];
|
||||||
|
WideCharToMultiByte(CP_UTF8, 0, wide, -1, utf8, utf8_len, NULL, NULL);
|
||||||
|
length_ = utf8_len;
|
||||||
|
utf8_ = utf8;
|
||||||
|
}
|
||||||
|
|
||||||
|
~WideToUtf8Scope() {
|
||||||
|
delete[] utf8_;
|
||||||
|
utf8_ = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* utf8() const { return utf8_; }
|
||||||
|
intptr_t length() const { return length_; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
intptr_t length_;
|
||||||
|
char* utf8_;
|
||||||
|
|
||||||
|
DISALLOW_ALLOCATION();
|
||||||
|
DISALLOW_IMPLICIT_CONSTRUCTORS(WideToUtf8Scope);
|
||||||
|
};
|
||||||
|
|
||||||
|
class Utf8ToWideScope {
|
||||||
|
public:
|
||||||
|
explicit Utf8ToWideScope(const char* utf8) {
|
||||||
|
int wide_len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
|
||||||
|
wchar_t* wide = new wchar_t[wide_len];
|
||||||
|
MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wide, wide_len);
|
||||||
|
length_ = wide_len;
|
||||||
|
wide_ = wide;
|
||||||
|
}
|
||||||
|
|
||||||
|
~Utf8ToWideScope() {
|
||||||
|
delete[] wide_;
|
||||||
|
}
|
||||||
|
|
||||||
|
wchar_t* wide() const { return wide_; }
|
||||||
|
intptr_t length() const { return length_; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
intptr_t length_;
|
||||||
|
wchar_t* wide_;
|
||||||
|
|
||||||
|
DISALLOW_ALLOCATION();
|
||||||
|
DISALLOW_IMPLICIT_CONSTRUCTORS(Utf8ToWideScope);
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace bin
|
} // namespace bin
|
||||||
} // namespace dart
|
} // namespace dart
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue