about summary refs log tree commit diff
path: root/src/comp/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/comp/lib
parentae46c154f09deb57018579bb00fa3fcac9a93770 (diff)
downloadrust-30d2e358be6104adeabba5a7acb6d93f39b30d4b.tar.gz
rust-30d2e358be6104adeabba5a7acb6d93f39b30d4b.zip
Replace obj dtors with resources in stdlib and rustc
Diffstat (limited to 'src/comp/lib')
-rw-r--r--src/comp/lib/llvm.rs49
1 files changed, 28 insertions, 21 deletions
diff --git a/src/comp/lib/llvm.rs b/src/comp/lib/llvm.rs
index 16a3efc06b8..9f08bbb9476 100644
--- a/src/comp/lib/llvm.rs
+++ b/src/comp/lib/llvm.rs
@@ -889,9 +889,13 @@ native "cdecl" mod llvm = "rustllvm" {
  * it's attached to.
  */
 
-// FIXME: Do we want to support mutable object fields?
-obj builder(B: BuilderRef, terminated: @mutable bool) {
+resource BuilderRef_res(B: BuilderRef) {
+    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 */
     fn RetVoid() -> ValueRef {
         assert (!*terminated);
@@ -1396,9 +1400,12 @@ obj builder(B: BuilderRef, terminated: @mutable bool) {
     fn is_terminated() -> bool {
         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. */
@@ -1554,54 +1561,54 @@ fn fn_ty_param_tys(fn_ty: TypeRef) -> TypeRef[] {
 
 /* Memory-managed interface to target data. */
 
-obj target_data_dtor(TD: TargetDataRef) {
-    drop { llvm::LLVMDisposeTargetData(TD); }
+resource target_data_res(TD: TargetDataRef) {
+    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 {
     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. */
 
-obj pass_manager_dtor(PM: PassManagerRef) {
-    drop { llvm::LLVMDisposePassManager(PM); }
+resource pass_manager_res(PM: PassManagerRef) {
+    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 {
     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. */
 
-obj object_file_dtor(ObjectFile: ObjectFileRef) {
-    drop { llvm::LLVMDisposeObjectFile(ObjectFile); }
+resource object_file_res(ObjectFile: ObjectFileRef) {
+    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 {
     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. */
 
-obj section_iter_dtor(SI: SectionIteratorRef) {
-    drop { llvm::LLVMDisposeSectionIterator(SI); }
+resource section_iter_res(SI: SectionIteratorRef) {
+    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 {
     let llsi = llvm::LLVMGetSections(llof);
-    ret {llsi: llsi, dtor: section_iter_dtor(llsi)};
+    ret {llsi: llsi, dtor: @section_iter_res(llsi)};
 }
 
 //