Skip to content

Commit 30d2e35

Browse files
committed
Replace obj dtors with resources in stdlib and rustc
1 parent ae46c15 commit 30d2e35

File tree

7 files changed

+82
-69
lines changed

7 files changed

+82
-69
lines changed

src/comp/lib/llvm.rs

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -889,9 +889,13 @@ native "cdecl" mod llvm = "rustllvm" {
889889
* it's attached to.
890890
*/
891891

892-
// FIXME: Do we want to support mutable object fields?
893-
obj builder(B: BuilderRef, terminated: @mutable bool) {
892+
resource BuilderRef_res(B: BuilderRef) {
893+
llvm::LLVMDisposeBuilder(B);
894+
}
894895

896+
obj builder(B: BuilderRef, terminated: @mutable bool,
897+
// Stored twice so that we don't have to constantly deref
898+
res: @BuilderRef_res) {
895899
/* Terminators */
896900
fn RetVoid() -> ValueRef {
897901
assert (!*terminated);
@@ -1396,9 +1400,12 @@ obj builder(B: BuilderRef, terminated: @mutable bool) {
13961400
fn is_terminated() -> bool {
13971401
ret *terminated;
13981402
}
1399-
drop {
1400-
llvm::LLVMDisposeBuilder(B);
1401-
}
1403+
}
1404+
1405+
fn new_builder(llbb: BasicBlockRef) -> builder {
1406+
let llbuild: BuilderRef = llvm::LLVMCreateBuilder();
1407+
llvm::LLVMPositionBuilderAtEnd(llbuild, llbb);
1408+
ret builder(llbuild, @mutable false, @BuilderRef_res(llbuild));
14021409
}
14031410

14041411
/* Memory-managed object interface to type handles. */
@@ -1554,54 +1561,54 @@ fn fn_ty_param_tys(fn_ty: TypeRef) -> TypeRef[] {
15541561

15551562
/* Memory-managed interface to target data. */
15561563

1557-
obj target_data_dtor(TD: TargetDataRef) {
1558-
drop { llvm::LLVMDisposeTargetData(TD); }
1564+
resource target_data_res(TD: TargetDataRef) {
1565+
llvm::LLVMDisposeTargetData(TD);
15591566
}
15601567

1561-
type target_data = {lltd: TargetDataRef, dtor: target_data_dtor};
1568+
type target_data = {lltd: TargetDataRef, dtor: @target_data_res};
15621569

15631570
fn mk_target_data(string_rep: str) -> target_data {
15641571
let lltd = llvm::LLVMCreateTargetData(str::buf(string_rep));
1565-
ret {lltd: lltd, dtor: target_data_dtor(lltd)};
1572+
ret {lltd: lltd, dtor: @target_data_res(lltd)};
15661573
}
15671574

15681575
/* Memory-managed interface to pass managers. */
15691576

1570-
obj pass_manager_dtor(PM: PassManagerRef) {
1571-
drop { llvm::LLVMDisposePassManager(PM); }
1577+
resource pass_manager_res(PM: PassManagerRef) {
1578+
llvm::LLVMDisposePassManager(PM);
15721579
}
15731580

1574-
type pass_manager = {llpm: PassManagerRef, dtor: pass_manager_dtor};
1581+
type pass_manager = {llpm: PassManagerRef, dtor: @pass_manager_res};
15751582

15761583
fn mk_pass_manager() -> pass_manager {
15771584
let llpm = llvm::LLVMCreatePassManager();
1578-
ret {llpm: llpm, dtor: pass_manager_dtor(llpm)};
1585+
ret {llpm: llpm, dtor: @pass_manager_res(llpm)};
15791586
}
15801587

15811588
/* Memory-managed interface to object files. */
15821589

1583-
obj object_file_dtor(ObjectFile: ObjectFileRef) {
1584-
drop { llvm::LLVMDisposeObjectFile(ObjectFile); }
1590+
resource object_file_res(ObjectFile: ObjectFileRef) {
1591+
llvm::LLVMDisposeObjectFile(ObjectFile);
15851592
}
15861593

1587-
type object_file = {llof: ObjectFileRef, dtor: object_file_dtor};
1594+
type object_file = {llof: ObjectFileRef, dtor: @object_file_res};
15881595

15891596
fn mk_object_file(llmb: MemoryBufferRef) -> object_file {
15901597
let llof = llvm::LLVMCreateObjectFile(llmb);
1591-
ret {llof: llof, dtor: object_file_dtor(llof)};
1598+
ret {llof: llof, dtor: @object_file_res(llof)};
15921599
}
15931600

15941601
/* Memory-managed interface to section iterators. */
15951602

1596-
obj section_iter_dtor(SI: SectionIteratorRef) {
1597-
drop { llvm::LLVMDisposeSectionIterator(SI); }
1603+
resource section_iter_res(SI: SectionIteratorRef) {
1604+
llvm::LLVMDisposeSectionIterator(SI);
15981605
}
15991606

1600-
type section_iter = {llsi: SectionIteratorRef, dtor: section_iter_dtor};
1607+
type section_iter = {llsi: SectionIteratorRef, dtor: @section_iter_res};
16011608

16021609
fn mk_section_iter(llof: ObjectFileRef) -> section_iter {
16031610
let llsi = llvm::LLVMGetSections(llof);
1604-
ret {llsi: llsi, dtor: section_iter_dtor(llsi)};
1611+
ret {llsi: llsi, dtor: @section_iter_res(llsi)};
16051612
}
16061613

16071614
//

src/comp/middle/trans.rs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import std::map::new_str_hash;
4141
import syntax::codemap::span;
4242
import lib::llvm::llvm;
4343
import lib::llvm::builder;
44+
import lib::llvm::new_builder;
4445
import lib::llvm::target_data;
4546
import lib::llvm::type_names;
4647
import lib::llvm::mk_target_data;
@@ -5934,13 +5935,6 @@ fn trans_stmt(cx: &@block_ctxt, s: &ast::stmt) -> result {
59345935
ret rslt(bcx, C_nil());
59355936
}
59365937

5937-
fn new_builder(llbb: BasicBlockRef) -> builder {
5938-
let llbuild: BuilderRef = llvm::LLVMCreateBuilder();
5939-
llvm::LLVMPositionBuilderAtEnd(llbuild, llbb);
5940-
ret builder(llbuild, @mutable false);
5941-
}
5942-
5943-
59445938
// You probably don't want to use this one. See the
59455939
// next three functions instead.
59465940
fn new_block_ctxt(cx: &@fn_ctxt, parent: &block_parent, kind: block_kind,

src/lib/io.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,11 @@ obj FILE_writer(f: os::libc::FILE, res: option::t[@FILE_res]) {
255255
}
256256
}
257257

258-
obj fd_buf_writer(fd: int, must_close: bool) {
258+
resource fd_res(fd: int) {
259+
os::libc::close(fd);
260+
}
261+
262+
obj fd_buf_writer(fd: int, res: option::t[@fd_res]) {
259263
fn write(v: vec[u8]) {
260264
let len = vec::len[u8](v);
261265
let count = 0u;
@@ -279,7 +283,6 @@ obj fd_buf_writer(fd: int, must_close: bool) {
279283
log_err "need 64-bit native calls for tell, sorry";
280284
fail;
281285
}
282-
drop { if must_close { os::libc::close(fd); } }
283286
}
284287

285288
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 {
302305
log_err sys::rustrt::last_os_error();
303306
fail;
304307
}
305-
ret fd_buf_writer(fd, true);
308+
ret fd_buf_writer(fd, option::some(@fd_res(fd)));
306309
}
307310

308311
type writer =
@@ -379,9 +382,9 @@ fn buffered_file_buf_writer(path: str) -> buf_writer {
379382

380383

381384
// FIXME it would be great if this could be a const
382-
fn stdout() -> writer { ret new_writer(fd_buf_writer(1, false)); }
385+
fn stdout() -> writer { ret new_writer(fd_buf_writer(1, option::none)); }
383386

384-
fn stderr() -> writer { ret new_writer(fd_buf_writer(2, false)); }
387+
fn stderr() -> writer { ret new_writer(fd_buf_writer(2, option::none)); }
385388

386389
type str_writer =
387390
obj {

src/lib/ioivec.rs

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,11 @@ fn convert_whence(whence: seek_style) -> int {
5555
ret alt whence { seek_set. { 0 } seek_cur. { 1 } seek_end. { 2 } };
5656
}
5757

58-
obj FILE_buf_reader(f: os::libc::FILE, must_close: bool) {
58+
resource FILE_res(f: os::libc::FILE) {
59+
os::libc::fclose(f);
60+
}
61+
62+
obj FILE_buf_reader(f: os::libc::FILE, res: option::t[@FILE_res]) {
5963
fn read(len: uint) -> u8[] {
6064
let buf = ~[];
6165
ivec::reserve[u8](buf, len);
@@ -72,7 +76,6 @@ obj FILE_buf_reader(f: os::libc::FILE, must_close: bool) {
7276
fn tell() -> uint {
7377
ret os::libc::ftell(f) as uint;
7478
}
75-
drop { if must_close { os::libc::fclose(f); } }
7679
}
7780

7881

@@ -172,13 +175,13 @@ obj new_reader(rdr: buf_reader) {
172175
}
173176

174177
fn stdin() -> reader {
175-
ret new_reader(FILE_buf_reader(rustrt::rust_get_stdin(), false));
178+
ret new_reader(FILE_buf_reader(rustrt::rust_get_stdin(), option::none));
176179
}
177180

178181
fn file_reader(path: str) -> reader {
179182
let f = os::libc::fopen(str::buf(path), str::buf("r"));
180183
if f as uint == 0u { log_err "error opening " + path; fail; }
181-
ret new_reader(FILE_buf_reader(f, true));
184+
ret new_reader(FILE_buf_reader(f, option::some(@FILE_res(f))));
182185
}
183186

184187

@@ -240,7 +243,7 @@ type buf_writer =
240243
fn tell() -> uint ;
241244
};
242245

243-
obj FILE_writer(f: os::libc::FILE, must_close: bool) {
246+
obj FILE_writer(f: os::libc::FILE, res: option::t[@FILE_res]) {
244247
fn write(v: &u8[]) {
245248
let len = ivec::len[u8](v);
246249
let vbuf = ivec::to_ptr[u8](v);
@@ -253,10 +256,13 @@ obj FILE_writer(f: os::libc::FILE, must_close: bool) {
253256
fn tell() -> uint {
254257
ret os::libc::ftell(f) as uint;
255258
}
256-
drop { if must_close { os::libc::fclose(f); } }
257259
}
258260

259-
obj fd_buf_writer(fd: int, must_close: bool) {
261+
resource fd_res(fd: int) {
262+
os::libc::close(fd);
263+
}
264+
265+
obj fd_buf_writer(fd: int, res: option::t[@fd_res]) {
260266
fn write(v: &u8[]) {
261267
let len = ivec::len[u8](v);
262268
let count = 0u;
@@ -280,7 +286,6 @@ obj fd_buf_writer(fd: int, must_close: bool) {
280286
log_err "need 64-bit native calls for tell, sorry";
281287
fail;
282288
}
283-
drop { if must_close { os::libc::close(fd); } }
284289
}
285290

286291
fn file_buf_writer(path: str, flags: &fileflag[]) -> buf_writer {
@@ -303,7 +308,7 @@ fn file_buf_writer(path: str, flags: &fileflag[]) -> buf_writer {
303308
log_err sys::rustrt::last_os_error();
304309
fail;
305310
}
306-
ret fd_buf_writer(fd, true);
311+
ret fd_buf_writer(fd, option::some(@fd_res(fd)));
307312
}
308313

309314
type writer =
@@ -377,12 +382,12 @@ fn file_writer(path: str, flags: &fileflag[]) -> writer {
377382
fn buffered_file_buf_writer(path: str) -> buf_writer {
378383
let f = os::libc::fopen(str::buf(path), str::buf("w"));
379384
if f as uint == 0u { log_err "error opening " + path; fail; }
380-
ret FILE_writer(f, true);
385+
ret FILE_writer(f, option::some(@FILE_res(f)));
381386
}
382387

383388

384389
// FIXME it would be great if this could be a const
385-
fn stdout() -> writer { ret new_writer(fd_buf_writer(1, false)); }
390+
fn stdout() -> writer { ret new_writer(fd_buf_writer(1, option::none)); }
386391

387392
type str_writer =
388393
obj {

src/lib/rand.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,19 @@ native "rust" mod rustrt {
1111
fn rand_free(c: rctx);
1212
}
1313

14-
type rng =
15-
obj {
16-
fn next() -> u32 ;
17-
};
14+
type rng = obj { fn next() -> u32; };
15+
16+
resource rand_res(c: rustrt::rctx) {
17+
rustrt::rand_free(c);
18+
}
1819

1920
fn mk_rng() -> rng {
20-
obj rt_rng(c: rustrt::rctx) {
21+
obj rt_rng(c: @rand_res) {
2122
fn next() -> u32 {
22-
ret rustrt::rand_next(c);
23+
ret rustrt::rand_next(**c);
2324
}
24-
drop { rustrt::rand_free(c); }
2525
}
26-
ret rt_rng(rustrt::rand_new());
26+
ret rt_rng(@rand_res(rustrt::rand_new()));
2727
}
2828
// Local Variables:
2929
// mode: rust;

src/lib/run_program.rs

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,20 @@ fn run_program(prog: str, args: vec[str]) -> int {
3535

3636
type program =
3737
obj {
38-
fn get_id() -> int ;
39-
fn input() -> io::writer ;
40-
fn output() -> io::reader ;
41-
fn err() -> io::reader ;
42-
fn close_input() ;
43-
fn finish() -> int ;
38+
fn get_id() -> int;
39+
fn input() -> io::writer;
40+
fn output() -> io::reader;
41+
fn err() -> io::reader;
42+
fn close_input();
43+
fn finish() -> int;
44+
fn destroy();
4445
};
4546

46-
fn start_program(prog: str, args: vec[str]) -> @program {
47+
resource program_res(p: program) {
48+
p.destroy();
49+
}
50+
51+
fn start_program(prog: str, args: vec[str]) -> @program_res {
4752
let pipe_input = os::pipe();
4853
let pipe_output = os::pipe();
4954
let pipe_err = os::pipe();
@@ -61,7 +66,7 @@ fn start_program(prog: str, args: vec[str]) -> @program {
6166
mutable finished: bool) {
6267
fn get_id() -> int { ret pid; }
6368
fn input() -> io::writer {
64-
ret io::new_writer(io::fd_buf_writer(in_fd, false));
69+
ret io::new_writer(io::fd_buf_writer(in_fd, option::none));
6570
}
6671
fn output() -> io::reader {
6772
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 {
8287
self.close_input();
8388
ret os::waitpid(pid);
8489
}
85-
drop {
86-
self.close_input();
87-
if !finished { os::waitpid(pid); }
90+
fn destroy() {
91+
self.finish();
8892
os::libc::fclose(out_file);
8993
os::libc::fclose(err_file);
9094
}
9195
}
92-
ret @new_program(pid,
93-
pipe_input.out,
94-
os::fd_FILE(pipe_output.in),
95-
os::fd_FILE(pipe_err.in),
96-
false);
96+
ret @program_res(new_program(pid,
97+
pipe_input.out,
98+
os::fd_FILE(pipe_output.in),
99+
os::fd_FILE(pipe_err.in),
100+
false));
97101
}
98102

99103
fn read_all(rd: &io::reader) -> str {

src/test/compiletest/compiletest.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -668,7 +668,7 @@ mod procsrv {
668668
fn readclose(fd: int) -> str {
669669
// Copied from run::program_output
670670
let file = os::fd_FILE(fd);
671-
let reader = io::new_reader(io::FILE_buf_reader(file, false));
671+
let reader = io::new_reader(io::FILE_buf_reader(file, option::none));
672672
let buf = "";
673673
while !reader.eof() {
674674
let bytes = reader.read_bytes(4096u);

0 commit comments

Comments
 (0)