summary refs log tree commit diff
path: root/src/lib
diff options
context:
space:
mode:
authorMarijn Haverbeke <marijnh@gmail.com>2011-07-29 13:31:44 +0200
committerMarijn Haverbeke <marijnh@gmail.com>2011-07-29 14:03:24 +0200
commit30d2e358be6104adeabba5a7acb6d93f39b30d4b (patch)
treeba54cc6506d9bf85e28c84922bbcc64af87eda34 /src/lib
parentae46c154f09deb57018579bb00fa3fcac9a93770 (diff)
Replace obj dtors with resources in stdlib and rustc
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/io.rs13
-rw-r--r--src/lib/ioivec.rs27
-rw-r--r--src/lib/rand.rs16
-rw-r--r--src/lib/run_program.rs36
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 {