diff options
| author | Marijn Haverbeke <marijnh@gmail.com> | 2011-07-29 13:31:44 +0200 |
|---|---|---|
| committer | Marijn Haverbeke <marijnh@gmail.com> | 2011-07-29 14:03:24 +0200 |
| commit | 30d2e358be6104adeabba5a7acb6d93f39b30d4b (patch) | |
| tree | ba54cc6506d9bf85e28c84922bbcc64af87eda34 /src/lib | |
| parent | ae46c154f09deb57018579bb00fa3fcac9a93770 (diff) | |
Replace obj dtors with resources in stdlib and rustc
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/io.rs | 13 | ||||
| -rw-r--r-- | src/lib/ioivec.rs | 27 | ||||
| -rw-r--r-- | src/lib/rand.rs | 16 | ||||
| -rw-r--r-- | src/lib/run_program.rs | 36 |
4 files changed, 52 insertions, 40 deletions
diff --git a/src/lib/io.rs b/src/lib/io.rs index 16868115aaa..a4b2891770c 100644 --- a/src/lib/io.rs +++ b/src/lib/io.rs @@ -255,7 +255,11 @@ obj FILE_writer(f: os::libc::FILE, res: option::t[@FILE_res]) { } } -obj fd_buf_writer(fd: int, must_close: bool) { +resource fd_res(fd: int) { + os::libc::close(fd); +} + +obj fd_buf_writer(fd: int, res: option::t[@fd_res]) { fn write(v: vec[u8]) { let len = vec::len[u8](v); let count = 0u; @@ -279,7 +283,6 @@ obj fd_buf_writer(fd: int, must_close: bool) { log_err "need 64-bit native calls for tell, sorry"; fail; } - drop { if must_close { os::libc::close(fd); } } } fn file_buf_writer(path: str, flags: vec[fileflag]) -> buf_writer { @@ -302,7 +305,7 @@ fn file_buf_writer(path: str, flags: vec[fileflag]) -> buf_writer { log_err sys::rustrt::last_os_error(); fail; } - ret fd_buf_writer(fd, true); + ret fd_buf_writer(fd, option::some(@fd_res(fd))); } type writer = @@ -379,9 +382,9 @@ fn buffered_file_buf_writer(path: str) -> buf_writer { // FIXME it would be great if this could be a const -fn stdout() -> writer { ret new_writer(fd_buf_writer(1, false)); } +fn stdout() -> writer { ret new_writer(fd_buf_writer(1, option::none)); } -fn stderr() -> writer { ret new_writer(fd_buf_writer(2, false)); } +fn stderr() -> writer { ret new_writer(fd_buf_writer(2, option::none)); } type str_writer = obj { diff --git a/src/lib/ioivec.rs b/src/lib/ioivec.rs index 9269607b5dd..cae0c27787c 100644 --- a/src/lib/ioivec.rs +++ b/src/lib/ioivec.rs @@ -55,7 +55,11 @@ fn convert_whence(whence: seek_style) -> int { ret alt whence { seek_set. { 0 } seek_cur. { 1 } seek_end. { 2 } }; } -obj FILE_buf_reader(f: os::libc::FILE, must_close: bool) { +resource FILE_res(f: os::libc::FILE) { + os::libc::fclose(f); +} + +obj FILE_buf_reader(f: os::libc::FILE, res: option::t[@FILE_res]) { fn read(len: uint) -> u8[] { let buf = ~[]; ivec::reserve[u8](buf, len); @@ -72,7 +76,6 @@ obj FILE_buf_reader(f: os::libc::FILE, must_close: bool) { fn tell() -> uint { ret os::libc::ftell(f) as uint; } - drop { if must_close { os::libc::fclose(f); } } } @@ -172,13 +175,13 @@ obj new_reader(rdr: buf_reader) { } fn stdin() -> reader { - ret new_reader(FILE_buf_reader(rustrt::rust_get_stdin(), false)); + ret new_reader(FILE_buf_reader(rustrt::rust_get_stdin(), option::none)); } fn file_reader(path: str) -> reader { let f = os::libc::fopen(str::buf(path), str::buf("r")); if f as uint == 0u { log_err "error opening " + path; fail; } - ret new_reader(FILE_buf_reader(f, true)); + ret new_reader(FILE_buf_reader(f, option::some(@FILE_res(f)))); } @@ -240,7 +243,7 @@ type buf_writer = fn tell() -> uint ; }; -obj FILE_writer(f: os::libc::FILE, must_close: bool) { +obj FILE_writer(f: os::libc::FILE, res: option::t[@FILE_res]) { fn write(v: &u8[]) { let len = ivec::len[u8](v); let vbuf = ivec::to_ptr[u8](v); @@ -253,10 +256,13 @@ obj FILE_writer(f: os::libc::FILE, must_close: bool) { fn tell() -> uint { ret os::libc::ftell(f) as uint; } - drop { if must_close { os::libc::fclose(f); } } } -obj fd_buf_writer(fd: int, must_close: bool) { +resource fd_res(fd: int) { + os::libc::close(fd); +} + +obj fd_buf_writer(fd: int, res: option::t[@fd_res]) { fn write(v: &u8[]) { let len = ivec::len[u8](v); let count = 0u; @@ -280,7 +286,6 @@ obj fd_buf_writer(fd: int, must_close: bool) { log_err "need 64-bit native calls for tell, sorry"; fail; } - drop { if must_close { os::libc::close(fd); } } } fn file_buf_writer(path: str, flags: &fileflag[]) -> buf_writer { @@ -303,7 +308,7 @@ fn file_buf_writer(path: str, flags: &fileflag[]) -> buf_writer { log_err sys::rustrt::last_os_error(); fail; } - ret fd_buf_writer(fd, true); + ret fd_buf_writer(fd, option::some(@fd_res(fd))); } type writer = @@ -377,12 +382,12 @@ fn file_writer(path: str, flags: &fileflag[]) -> writer { fn buffered_file_buf_writer(path: str) -> buf_writer { let f = os::libc::fopen(str::buf(path), str::buf("w")); if f as uint == 0u { log_err "error opening " + path; fail; } - ret FILE_writer(f, true); + ret FILE_writer(f, option::some(@FILE_res(f))); } // FIXME it would be great if this could be a const -fn stdout() -> writer { ret new_writer(fd_buf_writer(1, false)); } +fn stdout() -> writer { ret new_writer(fd_buf_writer(1, option::none)); } type str_writer = obj { diff --git a/src/lib/rand.rs b/src/lib/rand.rs index 77d62aaaea5..7b47311b04b 100644 --- a/src/lib/rand.rs +++ b/src/lib/rand.rs @@ -11,19 +11,19 @@ native "rust" mod rustrt { fn rand_free(c: rctx); } -type rng = - obj { - fn next() -> u32 ; - }; +type rng = obj { fn next() -> u32; }; + +resource rand_res(c: rustrt::rctx) { + rustrt::rand_free(c); +} fn mk_rng() -> rng { - obj rt_rng(c: rustrt::rctx) { + obj rt_rng(c: @rand_res) { fn next() -> u32 { - ret rustrt::rand_next(c); + ret rustrt::rand_next(**c); } - drop { rustrt::rand_free(c); } } - ret rt_rng(rustrt::rand_new()); + ret rt_rng(@rand_res(rustrt::rand_new())); } // Local Variables: // mode: rust; diff --git a/src/lib/run_program.rs b/src/lib/run_program.rs index da5c1409e22..f2dd1280059 100644 --- a/src/lib/run_program.rs +++ b/src/lib/run_program.rs @@ -35,15 +35,20 @@ fn run_program(prog: str, args: vec[str]) -> int { type program = obj { - fn get_id() -> int ; - fn input() -> io::writer ; - fn output() -> io::reader ; - fn err() -> io::reader ; - fn close_input() ; - fn finish() -> int ; + fn get_id() -> int; + fn input() -> io::writer; + fn output() -> io::reader; + fn err() -> io::reader; + fn close_input(); + fn finish() -> int; + fn destroy(); }; -fn start_program(prog: str, args: vec[str]) -> @program { +resource program_res(p: program) { + p.destroy(); +} + +fn start_program(prog: str, args: vec[str]) -> @program_res { let pipe_input = os::pipe(); let pipe_output = os::pipe(); let pipe_err = os::pipe(); @@ -61,7 +66,7 @@ fn start_program(prog: str, args: vec[str]) -> @program { mutable finished: bool) { fn get_id() -> int { ret pid; } fn input() -> io::writer { - ret io::new_writer(io::fd_buf_writer(in_fd, false)); + ret io::new_writer(io::fd_buf_writer(in_fd, option::none)); } fn output() -> io::reader { ret io::new_reader(io::FILE_buf_reader(out_file, option::none)); @@ -82,18 +87,17 @@ fn start_program(prog: str, args: vec[str]) -> @program { self.close_input(); ret os::waitpid(pid); } - drop { - self.close_input(); - if !finished { os::waitpid(pid); } + fn destroy() { + self.finish(); os::libc::fclose(out_file); os::libc::fclose(err_file); } } - ret @new_program(pid, - pipe_input.out, - os::fd_FILE(pipe_output.in), - os::fd_FILE(pipe_err.in), - false); + ret @program_res(new_program(pid, + pipe_input.out, + os::fd_FILE(pipe_output.in), + os::fd_FILE(pipe_err.in), + false)); } fn read_all(rd: &io::reader) -> str { |
