<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -83,7 +83,7 @@ VALUE
 llvm_builder_return(VALUE self, VALUE rv) {
   //CHECK_TYPE(rv, cLLVMValue);
   DATA_GET_BUILDER
-  return llvm_value_wrap(builder-&gt;CreateRet(LLVM_VAL(rv)));
+  return Data_Wrap_Struct(cLLVMReturnInst, NULL, NULL, builder-&gt;CreateRet(LLVM_VAL(rv)));
 }
 
 VALUE </diff>
      <filename>ext/llvm_basicblock.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -26,6 +26,32 @@ llvm_instruction_get_opcode_name(VALUE self) {
   return rb_str_new2(name.c_str());
 }
 
+#define DATA_GET_TERMINATOR_INST TerminatorInst *ti; Data_Get_Struct(self, TerminatorInst, ti);
+
+VALUE
+llvm_terminator_inst_num_successors(VALUE self) {
+  DATA_GET_TERMINATOR_INST
+  return INT2FIX(ti-&gt;getNumSuccessors());
+}
+
+VALUE
+llvm_terminator_inst_get_successor(VALUE self, VALUE ridx) {
+  DATA_GET_TERMINATOR_INST
+  BasicBlock *bb = ti-&gt;getSuccessor(FIX2INT(ridx));
+  return llvm_basic_block_wrap(bb);
+}
+
+VALUE
+llvm_terminator_inst_set_successor(VALUE self, VALUE ridx, VALUE rbb) {
+  DATA_GET_TERMINATOR_INST
+ 
+  BasicBlock *bb;
+  Data_Get_Struct(rbb, BasicBlock, bb);
+
+  ti-&gt;setSuccessor(FIX2INT(ridx), bb);
+  return rbb;
+}
+
 #define DATA_GET_BRANCH_INST BranchInst *bi; Data_Get_Struct(self, BranchInst, bi);
 
 VALUE</diff>
      <filename>ext/llvm_instruction.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -13,6 +13,8 @@ VALUE cLLVMArrayType = Qnil;
 VALUE cLLVMVectorType = Qnil;
 VALUE cLLVMFunctionType = Qnil;
 VALUE cLLVMInstruction = Qnil;
+VALUE cLLVMTerminatorInst = Qnil;
+VALUE cLLVMReturnInst = Qnil;
 VALUE cLLVMBranchInst = Qnil;
 VALUE cLLVMSwitchInst = Qnil;
 VALUE cLLVMPhi = Qnil;
@@ -54,6 +56,10 @@ VALUE llvm_basic_block_get_instruction_list(VALUE);
 VALUE llvm_instruction_inspect(VALUE);
 VALUE llvm_instruction_get_opcode_name(VALUE);
 
+VALUE llvm_terminator_inst_num_successors(VALUE);
+VALUE llvm_terminator_inst_get_successor(VALUE, VALUE);
+VALUE llvm_terminator_inst_set_successor(VALUE, VALUE, VALUE);
+
 VALUE llvm_branch_inst_is_conditional(VALUE);
 VALUE llvm_branch_inst_is_unconditional(VALUE);
 VALUE llvm_branch_inst_get_condition(VALUE);
@@ -123,8 +129,10 @@ void Init_llvmruby() {
   cLLVMBuilder = rb_define_class_under(cLLVMRuby, &quot;Builder&quot;, rb_cObject);
 
   cLLVMInstruction = rb_define_class_under(cLLVMRuby, &quot;Instruction&quot;, rb_cObject);
-  cLLVMBranchInst = rb_define_class_under(cLLVMRuby, &quot;BranchInst&quot;, cLLVMInstruction);
-  cLLVMSwitchInst = rb_define_class_under(cLLVMRuby, &quot;SwitchInst&quot;, cLLVMInstruction);
+  cLLVMTerminatorInst = rb_define_class_under(cLLVMRuby, &quot;TerminatorInst&quot;, cLLVMInstruction);
+  cLLVMReturnInst = rb_define_class_under(cLLVMRuby, &quot;ReturnInst&quot;, cLLVMTerminatorInst);
+  cLLVMBranchInst = rb_define_class_under(cLLVMRuby, &quot;BranchInst&quot;, cLLVMTerminatorInst);
+  cLLVMSwitchInst = rb_define_class_under(cLLVMRuby, &quot;SwitchInst&quot;, cLLVMTerminatorInst);
   cLLVMBinaryOps = rb_define_class_under(cLLVMInstruction, &quot;BinaryOps&quot;, rb_cObject);
   cLLVMPhi = rb_define_class_under(cLLVMRuby, &quot;Phi&quot;, cLLVMValue);
 
@@ -170,6 +178,10 @@ void Init_llvmruby() {
   rb_define_method(cLLVMInstruction, &quot;inspect&quot;, llvm_instruction_inspect, 0);
   rb_define_method(cLLVMInstruction, &quot;get_opcode_name&quot;, llvm_instruction_get_opcode_name, 0);
 
+  rb_define_method(cLLVMTerminatorInst, &quot;num_successors&quot;, llvm_terminator_inst_num_successors, 0);
+  rb_define_method(cLLVMTerminatorInst, &quot;get_successor&quot;, llvm_terminator_inst_get_successor, 1);
+  rb_define_method(cLLVMTerminatorInst, &quot;set_successor&quot;, llvm_terminator_inst_set_successor, 2);
+
   rb_define_method(cLLVMBranchInst, &quot;conditional?&quot;, llvm_branch_inst_is_conditional, 0);
   rb_define_method(cLLVMBranchInst, &quot;unconditional?&quot;, llvm_branch_inst_is_unconditional, 0);
   rb_define_method(cLLVMBranchInst, &quot;condition&quot;, llvm_branch_inst_get_condition, 0);</diff>
      <filename>ext/llvmruby.c</filename>
    </modified>
    <modified>
      <diff>@@ -32,6 +32,8 @@ extern VALUE cLLVMArrayType;
 extern VALUE cLLVMVectorType;
 extern VALUE cLLVMFunctionType;
 extern VALUE cLLVMInstruction;
+extern VALUE cLLVMTerminatorInst;
+extern VALUE cLLVMReturnInst;
 extern VALUE cLLVMBranchInst;
 extern VALUE cLLVMSwitchInst;
 extern VALUE cLLVMBinaryOps;</diff>
      <filename>ext/llvmruby.h</filename>
    </modified>
    <modified>
      <diff>@@ -53,6 +53,7 @@ class InstructionTests &lt; Test::Unit::TestCase
     b2 = f.create_block
     b3 = f.create_block
     b4 = f.create_block
+    b5 = f.create_block
 
     b = b1.builder
     br_inst = b.br(b2)
@@ -68,16 +69,27 @@ class InstructionTests &lt; Test::Unit::TestCase
     b = b4.builder
     b.return(5.llvm)
 
+    b = b5.builder
+    ret_inst = b.return(1999.llvm)
+
     assert_kind_of(BranchInst, br_inst)
     assert(br_inst.unconditional?)
     assert(!br_inst.conditional?)
+    assert_equal(1, br_inst.num_successors)
+    assert_kind_of(BasicBlock, br_inst.get_successor(0))
 
     assert_kind_of(BranchInst, cond_br_inst)
     assert(cond_br_inst.conditional?)
     assert(!cond_br_inst.unconditional?)
     assert_kind_of(Value, cond_br_inst.condition)
-    cond_br_inst.condition = cmp2
+    assert_equal(2, cond_br_inst.num_successors)
+    assert_kind_of(BasicBlock, cond_br_inst.get_successor(1))
 
-    assert_equal(23, ExecutionEngine.run_autoconvert(f))
+    assert_kind_of(ReturnInst, ret_inst)
+    assert_equal(0, ret_inst.num_successors)
+
+    cond_br_inst.condition = cmp2
+    cond_br_inst.set_successor(0, b5)
+    assert_equal(1999, ExecutionEngine.run_autoconvert(f))
   end
 end</diff>
      <filename>test/test_instructions.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>da0d2abff09f6f722bddc4dd9ba43045174e275c</id>
    </parent>
  </parents>
  <author>
    <name>Tom Bagby</name>
    <email>tomatobagby@gmail.com</email>
  </author>
  <url>http://github.com/tombagby/llvmruby/commit/f26df3f0f9db776e33e04ee129d1a754b72e3bb1</url>
  <id>f26df3f0f9db776e33e04ee129d1a754b72e3bb1</id>
  <committed-date>2008-10-19T13:32:34-07:00</committed-date>
  <authored-date>2008-10-19T13:32:34-07:00</authored-date>
  <message>terminator instructions</message>
  <tree>b672d413cec8498058334960fa8708242b2baa1e</tree>
  <committer>
    <name>Tom Bagby</name>
    <email>tomatobagby@gmail.com</email>
  </committer>
</commit>
