From f07a328c165b9d6fc8438a5ce54666ed1afad7ad Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Thu, 1 Sep 2011 15:51:27 -0700 Subject: [PATCH] Convert rust_list_files to istrs. Issue #855 --- src/lib/fs.rs | 3 +-- src/lib/posix_fs.rs | 7 +++---- src/lib/win32_fs.rs | 7 +++++-- src/rt/rust_builtin.cpp | 39 ++++++++++++++++++++------------------- src/test/stdtest/fs.rs | 11 +++++++++++ 5 files changed, 40 insertions(+), 27 deletions(-) diff --git a/src/lib/fs.rs b/src/lib/fs.rs index 922d01e841b..abc8c14ea3a 100644 --- a/src/lib/fs.rs +++ b/src/lib/fs.rs @@ -53,8 +53,7 @@ fn list_dir(p: &path) -> [istr] { let pl = istr::byte_len(p); if pl == 0u || p[pl - 1u] as char != os_fs::path_sep { p += path_sep(); } let full_paths: [istr] = []; - for filename: str in os_fs::list_dir(istr::to_estr(p)) { - let filename = istr::from_estr(filename); + for filename: istr in os_fs::list_dir(p) { if !istr::eq(filename, ~".") { if !istr::eq(filename, ~"..") { full_paths += [p + filename]; } } diff --git a/src/lib/posix_fs.rs b/src/lib/posix_fs.rs index 1c82b64a3e0..1a346ed661a 100644 --- a/src/lib/posix_fs.rs +++ b/src/lib/posix_fs.rs @@ -1,12 +1,11 @@ native "rust" mod rustrt { - fn rust_list_files(path: str) -> @[str]; + fn rust_list_files(path: &istr) -> [istr]; fn rust_dirent_filename(ent: os::libc::dirent) -> str; } -fn list_dir(path: str) -> [str] { - ret *rustrt::rust_list_files(path); - // TODO ensure this is always closed +fn list_dir(path: &istr) -> [istr] { + ret rustrt::rust_list_files(path); // FIXME: No idea why, but this appears to corrupt memory on OSX. I // suspect it has to do with the tasking primitives somehow, or perhaps diff --git a/src/lib/win32_fs.rs b/src/lib/win32_fs.rs index 679a440da05..228773ef6db 100644 --- a/src/lib/win32_fs.rs +++ b/src/lib/win32_fs.rs @@ -1,11 +1,14 @@ native "rust" mod rustrt { - fn rust_list_files(path: str) -> @[str]; + fn rust_list_files(path: &istr) -> [istr]; fn rust_file_is_dir(path: str) -> int; } -fn list_dir(path: str) -> [str] { ret *rustrt::rust_list_files(path + "*"); } +fn list_dir(path: &istr) -> [istr] { + let path = path + ~"*"; + ret rustrt::rust_list_files(path); +} fn path_is_absolute(p: &istr) -> bool { ret istr::char_at(p, 0u) == '/' || diff --git a/src/rt/rust_builtin.cpp b/src/rt/rust_builtin.cpp index 91169eb9a7e..b864ade6911 100644 --- a/src/rt/rust_builtin.cpp +++ b/src/rt/rust_builtin.cpp @@ -383,41 +383,42 @@ rust_str* c_str_to_rust(rust_task *task, char const *str) { return vec_alloc_with_data(task, len, len, 1, (void*)str); } -extern "C" CDECL rust_box* -rust_list_files(rust_task *task, rust_str *path) { - array_list strings; +extern "C" CDECL rust_vec* +rust_list_files(rust_task *task, rust_vec **path) { + array_list strings; #if defined(__WIN32__) WIN32_FIND_DATA FindFileData; - HANDLE hFind = FindFirstFile((char*)path->data, &FindFileData); + HANDLE hFind = FindFirstFile((char*)(*path)->data, &FindFileData); if (hFind != INVALID_HANDLE_VALUE) { do { - strings.push(c_str_to_rust(task, FindFileData.cFileName)); + rust_vec *str = make_istr(task->kernel, FindFileData.cFileName, + strlen(FindFileData.cFileName), + "list_files_str"); + strings.push(str); } while (FindNextFile(hFind, &FindFileData)); FindClose(hFind); } #else - DIR *dirp = opendir((char*)path->data); + DIR *dirp = opendir((char*)(*path)->data); if (dirp) { struct dirent *dp; - while ((dp = readdir(dirp))) - strings.push(c_str_to_rust(task, dp->d_name)); + while ((dp = readdir(dirp))) { + rust_vec *str = make_istr(task->kernel, dp->d_name, + strlen(dp->d_name), + "list_files_str"); + strings.push(str); + } closedir(dirp); } #endif - rust_box *box = - (rust_box *)task->malloc(sizeof(rust_box) + sizeof(rust_vec*), - "rust_box(list_files_vec)"); - rust_vec* vec = - (rust_vec*)task->kernel->malloc(vec_size(strings.size()), - "list_files_vec"); - box->ref_count = 1; - rust_vec** box_content = (rust_vec**)&box->data[0]; - *box_content = vec; - size_t alloc_sz = sizeof(rust_str*) * strings.size(); + rust_vec *vec = (rust_vec *) + task->kernel->malloc(vec_size(strings.size()), + "list_files_vec"); + size_t alloc_sz = sizeof(rust_vec*) * strings.size(); vec->fill = vec->alloc = alloc_sz; memcpy(&vec->data[0], strings.data(), alloc_sz); - return box; + return vec; } #if defined(__WIN32__) diff --git a/src/test/stdtest/fs.rs b/src/test/stdtest/fs.rs index a3711b23954..f2e49232800 100644 --- a/src/test/stdtest/fs.rs +++ b/src/test/stdtest/fs.rs @@ -14,6 +14,17 @@ fn test_connect() { #[test] fn test_list_dir_no_invalid_memory_access() { fs::list_dir(~"."); } +#[test] +fn list_dir() { + let dirs = fs::list_dir(~"."); + // Just assuming that we've got some contents in the current directory + assert std::vec::len(dirs) > 0u; + + for dir in dirs { + log dir; + } +} + #[test] fn file_is_dir() { assert fs::file_is_dir(~".");