Replace obj dtors with resources in stdlib and rustc
This commit is contained in:
parent
ae46c154f0
commit
30d2e358be
7 changed files with 82 additions and 69 deletions
|
@ -889,9 +889,13 @@ native "cdecl" mod llvm = "rustllvm" {
|
||||||
* it's attached to.
|
* it's attached to.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// FIXME: Do we want to support mutable object fields?
|
resource BuilderRef_res(B: BuilderRef) {
|
||||||
obj builder(B: BuilderRef, terminated: @mutable bool) {
|
llvm::LLVMDisposeBuilder(B);
|
||||||
|
}
|
||||||
|
|
||||||
|
obj builder(B: BuilderRef, terminated: @mutable bool,
|
||||||
|
// Stored twice so that we don't have to constantly deref
|
||||||
|
res: @BuilderRef_res) {
|
||||||
/* Terminators */
|
/* Terminators */
|
||||||
fn RetVoid() -> ValueRef {
|
fn RetVoid() -> ValueRef {
|
||||||
assert (!*terminated);
|
assert (!*terminated);
|
||||||
|
@ -1396,9 +1400,12 @@ obj builder(B: BuilderRef, terminated: @mutable bool) {
|
||||||
fn is_terminated() -> bool {
|
fn is_terminated() -> bool {
|
||||||
ret *terminated;
|
ret *terminated;
|
||||||
}
|
}
|
||||||
drop {
|
|
||||||
llvm::LLVMDisposeBuilder(B);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn new_builder(llbb: BasicBlockRef) -> builder {
|
||||||
|
let llbuild: BuilderRef = llvm::LLVMCreateBuilder();
|
||||||
|
llvm::LLVMPositionBuilderAtEnd(llbuild, llbb);
|
||||||
|
ret builder(llbuild, @mutable false, @BuilderRef_res(llbuild));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Memory-managed object interface to type handles. */
|
/* Memory-managed object interface to type handles. */
|
||||||
|
@ -1554,54 +1561,54 @@ fn fn_ty_param_tys(fn_ty: TypeRef) -> TypeRef[] {
|
||||||
|
|
||||||
/* Memory-managed interface to target data. */
|
/* Memory-managed interface to target data. */
|
||||||
|
|
||||||
obj target_data_dtor(TD: TargetDataRef) {
|
resource target_data_res(TD: TargetDataRef) {
|
||||||
drop { llvm::LLVMDisposeTargetData(TD); }
|
llvm::LLVMDisposeTargetData(TD);
|
||||||
}
|
}
|
||||||
|
|
||||||
type target_data = {lltd: TargetDataRef, dtor: target_data_dtor};
|
type target_data = {lltd: TargetDataRef, dtor: @target_data_res};
|
||||||
|
|
||||||
fn mk_target_data(string_rep: str) -> target_data {
|
fn mk_target_data(string_rep: str) -> target_data {
|
||||||
let lltd = llvm::LLVMCreateTargetData(str::buf(string_rep));
|
let lltd = llvm::LLVMCreateTargetData(str::buf(string_rep));
|
||||||
ret {lltd: lltd, dtor: target_data_dtor(lltd)};
|
ret {lltd: lltd, dtor: @target_data_res(lltd)};
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Memory-managed interface to pass managers. */
|
/* Memory-managed interface to pass managers. */
|
||||||
|
|
||||||
obj pass_manager_dtor(PM: PassManagerRef) {
|
resource pass_manager_res(PM: PassManagerRef) {
|
||||||
drop { llvm::LLVMDisposePassManager(PM); }
|
llvm::LLVMDisposePassManager(PM);
|
||||||
}
|
}
|
||||||
|
|
||||||
type pass_manager = {llpm: PassManagerRef, dtor: pass_manager_dtor};
|
type pass_manager = {llpm: PassManagerRef, dtor: @pass_manager_res};
|
||||||
|
|
||||||
fn mk_pass_manager() -> pass_manager {
|
fn mk_pass_manager() -> pass_manager {
|
||||||
let llpm = llvm::LLVMCreatePassManager();
|
let llpm = llvm::LLVMCreatePassManager();
|
||||||
ret {llpm: llpm, dtor: pass_manager_dtor(llpm)};
|
ret {llpm: llpm, dtor: @pass_manager_res(llpm)};
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Memory-managed interface to object files. */
|
/* Memory-managed interface to object files. */
|
||||||
|
|
||||||
obj object_file_dtor(ObjectFile: ObjectFileRef) {
|
resource object_file_res(ObjectFile: ObjectFileRef) {
|
||||||
drop { llvm::LLVMDisposeObjectFile(ObjectFile); }
|
llvm::LLVMDisposeObjectFile(ObjectFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
type object_file = {llof: ObjectFileRef, dtor: object_file_dtor};
|
type object_file = {llof: ObjectFileRef, dtor: @object_file_res};
|
||||||
|
|
||||||
fn mk_object_file(llmb: MemoryBufferRef) -> object_file {
|
fn mk_object_file(llmb: MemoryBufferRef) -> object_file {
|
||||||
let llof = llvm::LLVMCreateObjectFile(llmb);
|
let llof = llvm::LLVMCreateObjectFile(llmb);
|
||||||
ret {llof: llof, dtor: object_file_dtor(llof)};
|
ret {llof: llof, dtor: @object_file_res(llof)};
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Memory-managed interface to section iterators. */
|
/* Memory-managed interface to section iterators. */
|
||||||
|
|
||||||
obj section_iter_dtor(SI: SectionIteratorRef) {
|
resource section_iter_res(SI: SectionIteratorRef) {
|
||||||
drop { llvm::LLVMDisposeSectionIterator(SI); }
|
llvm::LLVMDisposeSectionIterator(SI);
|
||||||
}
|
}
|
||||||
|
|
||||||
type section_iter = {llsi: SectionIteratorRef, dtor: section_iter_dtor};
|
type section_iter = {llsi: SectionIteratorRef, dtor: @section_iter_res};
|
||||||
|
|
||||||
fn mk_section_iter(llof: ObjectFileRef) -> section_iter {
|
fn mk_section_iter(llof: ObjectFileRef) -> section_iter {
|
||||||
let llsi = llvm::LLVMGetSections(llof);
|
let llsi = llvm::LLVMGetSections(llof);
|
||||||
ret {llsi: llsi, dtor: section_iter_dtor(llsi)};
|
ret {llsi: llsi, dtor: @section_iter_res(llsi)};
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
@ -41,6 +41,7 @@ import std::map::new_str_hash;
|
||||||
import syntax::codemap::span;
|
import syntax::codemap::span;
|
||||||
import lib::llvm::llvm;
|
import lib::llvm::llvm;
|
||||||
import lib::llvm::builder;
|
import lib::llvm::builder;
|
||||||
|
import lib::llvm::new_builder;
|
||||||
import lib::llvm::target_data;
|
import lib::llvm::target_data;
|
||||||
import lib::llvm::type_names;
|
import lib::llvm::type_names;
|
||||||
import lib::llvm::mk_target_data;
|
import lib::llvm::mk_target_data;
|
||||||
|
@ -5934,13 +5935,6 @@ fn trans_stmt(cx: &@block_ctxt, s: &ast::stmt) -> result {
|
||||||
ret rslt(bcx, C_nil());
|
ret rslt(bcx, C_nil());
|
||||||
}
|
}
|
||||||
|
|
||||||
fn new_builder(llbb: BasicBlockRef) -> builder {
|
|
||||||
let llbuild: BuilderRef = llvm::LLVMCreateBuilder();
|
|
||||||
llvm::LLVMPositionBuilderAtEnd(llbuild, llbb);
|
|
||||||
ret builder(llbuild, @mutable false);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// You probably don't want to use this one. See the
|
// You probably don't want to use this one. See the
|
||||||
// next three functions instead.
|
// next three functions instead.
|
||||||
fn new_block_ctxt(cx: &@fn_ctxt, parent: &block_parent, kind: block_kind,
|
fn new_block_ctxt(cx: &@fn_ctxt, parent: &block_parent, kind: block_kind,
|
||||||
|
|
|
@ -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]) {
|
fn write(v: vec[u8]) {
|
||||||
let len = vec::len[u8](v);
|
let len = vec::len[u8](v);
|
||||||
let count = 0u;
|
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";
|
log_err "need 64-bit native calls for tell, sorry";
|
||||||
fail;
|
fail;
|
||||||
}
|
}
|
||||||
drop { if must_close { os::libc::close(fd); } }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn file_buf_writer(path: str, flags: vec[fileflag]) -> buf_writer {
|
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();
|
log_err sys::rustrt::last_os_error();
|
||||||
fail;
|
fail;
|
||||||
}
|
}
|
||||||
ret fd_buf_writer(fd, true);
|
ret fd_buf_writer(fd, option::some(@fd_res(fd)));
|
||||||
}
|
}
|
||||||
|
|
||||||
type writer =
|
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
|
// 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 =
|
type str_writer =
|
||||||
obj {
|
obj {
|
||||||
|
|
|
@ -55,7 +55,11 @@ fn convert_whence(whence: seek_style) -> int {
|
||||||
ret alt whence { seek_set. { 0 } seek_cur. { 1 } seek_end. { 2 } };
|
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[] {
|
fn read(len: uint) -> u8[] {
|
||||||
let buf = ~[];
|
let buf = ~[];
|
||||||
ivec::reserve[u8](buf, len);
|
ivec::reserve[u8](buf, len);
|
||||||
|
@ -72,7 +76,6 @@ obj FILE_buf_reader(f: os::libc::FILE, must_close: bool) {
|
||||||
fn tell() -> uint {
|
fn tell() -> uint {
|
||||||
ret os::libc::ftell(f) as 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 {
|
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 {
|
fn file_reader(path: str) -> reader {
|
||||||
let f = os::libc::fopen(str::buf(path), str::buf("r"));
|
let f = os::libc::fopen(str::buf(path), str::buf("r"));
|
||||||
if f as uint == 0u { log_err "error opening " + path; fail; }
|
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 ;
|
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[]) {
|
fn write(v: &u8[]) {
|
||||||
let len = ivec::len[u8](v);
|
let len = ivec::len[u8](v);
|
||||||
let vbuf = ivec::to_ptr[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 {
|
fn tell() -> uint {
|
||||||
ret os::libc::ftell(f) as 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[]) {
|
fn write(v: &u8[]) {
|
||||||
let len = ivec::len[u8](v);
|
let len = ivec::len[u8](v);
|
||||||
let count = 0u;
|
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";
|
log_err "need 64-bit native calls for tell, sorry";
|
||||||
fail;
|
fail;
|
||||||
}
|
}
|
||||||
drop { if must_close { os::libc::close(fd); } }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn file_buf_writer(path: str, flags: &fileflag[]) -> buf_writer {
|
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();
|
log_err sys::rustrt::last_os_error();
|
||||||
fail;
|
fail;
|
||||||
}
|
}
|
||||||
ret fd_buf_writer(fd, true);
|
ret fd_buf_writer(fd, option::some(@fd_res(fd)));
|
||||||
}
|
}
|
||||||
|
|
||||||
type writer =
|
type writer =
|
||||||
|
@ -377,12 +382,12 @@ fn file_writer(path: str, flags: &fileflag[]) -> writer {
|
||||||
fn buffered_file_buf_writer(path: str) -> buf_writer {
|
fn buffered_file_buf_writer(path: str) -> buf_writer {
|
||||||
let f = os::libc::fopen(str::buf(path), str::buf("w"));
|
let f = os::libc::fopen(str::buf(path), str::buf("w"));
|
||||||
if f as uint == 0u { log_err "error opening " + path; fail; }
|
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
|
// 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 =
|
type str_writer =
|
||||||
obj {
|
obj {
|
||||||
|
|
|
@ -11,19 +11,19 @@ native "rust" mod rustrt {
|
||||||
fn rand_free(c: rctx);
|
fn rand_free(c: rctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
type rng =
|
type rng = obj { fn next() -> u32; };
|
||||||
obj {
|
|
||||||
fn next() -> u32 ;
|
resource rand_res(c: rustrt::rctx) {
|
||||||
};
|
rustrt::rand_free(c);
|
||||||
|
}
|
||||||
|
|
||||||
fn mk_rng() -> rng {
|
fn mk_rng() -> rng {
|
||||||
obj rt_rng(c: rustrt::rctx) {
|
obj rt_rng(c: @rand_res) {
|
||||||
fn next() -> u32 {
|
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:
|
// Local Variables:
|
||||||
// mode: rust;
|
// mode: rust;
|
||||||
|
|
|
@ -41,9 +41,14 @@ type program =
|
||||||
fn err() -> io::reader;
|
fn err() -> io::reader;
|
||||||
fn close_input();
|
fn close_input();
|
||||||
fn finish() -> int;
|
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_input = os::pipe();
|
||||||
let pipe_output = os::pipe();
|
let pipe_output = os::pipe();
|
||||||
let pipe_err = os::pipe();
|
let pipe_err = os::pipe();
|
||||||
|
@ -61,7 +66,7 @@ fn start_program(prog: str, args: vec[str]) -> @program {
|
||||||
mutable finished: bool) {
|
mutable finished: bool) {
|
||||||
fn get_id() -> int { ret pid; }
|
fn get_id() -> int { ret pid; }
|
||||||
fn input() -> io::writer {
|
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 {
|
fn output() -> io::reader {
|
||||||
ret io::new_reader(io::FILE_buf_reader(out_file, option::none));
|
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();
|
self.close_input();
|
||||||
ret os::waitpid(pid);
|
ret os::waitpid(pid);
|
||||||
}
|
}
|
||||||
drop {
|
fn destroy() {
|
||||||
self.close_input();
|
self.finish();
|
||||||
if !finished { os::waitpid(pid); }
|
|
||||||
os::libc::fclose(out_file);
|
os::libc::fclose(out_file);
|
||||||
os::libc::fclose(err_file);
|
os::libc::fclose(err_file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ret @new_program(pid,
|
ret @program_res(new_program(pid,
|
||||||
pipe_input.out,
|
pipe_input.out,
|
||||||
os::fd_FILE(pipe_output.in),
|
os::fd_FILE(pipe_output.in),
|
||||||
os::fd_FILE(pipe_err.in),
|
os::fd_FILE(pipe_err.in),
|
||||||
false);
|
false));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_all(rd: &io::reader) -> str {
|
fn read_all(rd: &io::reader) -> str {
|
||||||
|
|
|
@ -668,7 +668,7 @@ mod procsrv {
|
||||||
fn readclose(fd: int) -> str {
|
fn readclose(fd: int) -> str {
|
||||||
// Copied from run::program_output
|
// Copied from run::program_output
|
||||||
let file = os::fd_FILE(fd);
|
let file = os::fd_FILE(fd);
|
||||||
let reader = io::new_reader(io::FILE_buf_reader(file, false));
|
let reader = io::new_reader(io::FILE_buf_reader(file, option::none));
|
||||||
let buf = "";
|
let buf = "";
|
||||||
while !reader.eof() {
|
while !reader.eof() {
|
||||||
let bytes = reader.read_bytes(4096u);
|
let bytes = reader.read_bytes(4096u);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue