<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -49,8 +49,6 @@ llvm_builder_set_insert_point(VALUE self, VALUE rbb) {
 VALUE 
 llvm_builder_bin_op(VALUE self, VALUE rbin_op, VALUE rv1, VALUE rv2) {
   Check_Type(rbin_op, T_FIXNUM);
-  //CHECK_TYPE(rv1, cLLVMValue);
-  //CHECK_TYPE(rv2, cLLVMValue);
   DATA_GET_BUILDER
 
   Instruction::BinaryOps bin_op = (Instruction::BinaryOps)FIX2INT(rbin_op);
@@ -59,7 +57,7 @@ llvm_builder_bin_op(VALUE self, VALUE rbin_op, VALUE rv1, VALUE rv2) {
   Data_Get_Struct(rv1, Value, v1);
   Data_Get_Struct(rv2, Value, v2);
   Value *res = builder-&gt;CreateBinOp(bin_op, v1, v2);
-  return llvm_value_wrap(res);
+  return Data_Wrap_Struct(cLLVMBinaryOperator, NULL, NULL, res);
 }
 
 VALUE
@@ -73,15 +71,17 @@ llvm_builder_phi(VALUE self, VALUE type) {
 VALUE
 llvm_phi_add_incoming(VALUE self, VALUE val, VALUE rbb) {
   CHECK_TYPE(val, cLLVMValue);
+
   DATA_GET_BLOCK
   PHINode *phi = LLVM_PHI(self);
+
   phi-&gt;addIncoming(LLVM_VAL(val), bb);
   return self;
 }
 
 VALUE 
 llvm_builder_return(VALUE self, VALUE rv) {
-  //CHECK_TYPE(rv, cLLVMValue);
+  CHECK_TYPE(rv, cLLVMValue);
   DATA_GET_BUILDER
   return Data_Wrap_Struct(cLLVMReturnInst, NULL, NULL, builder-&gt;CreateRet(LLVM_VAL(rv)));
 }
@@ -142,8 +142,8 @@ VALUE
 llvm_builder_free(VALUE self, VALUE rptr) {
    DATA_GET_BUILDER
    Value *v = LLVM_VAL(rptr);
-   builder-&gt;CreateFree(v);
-   return Qtrue;
+   Value *free_inst = builder-&gt;CreateFree(v);
+   return Data_Wrap_Struct(cLLVMFreeInst, NULL, NULL, free_inst);
 }
   
 VALUE 
@@ -164,7 +164,7 @@ llvm_builder_load(VALUE self, VALUE rptr) {
 
   Value *ptr;
   Data_Get_Struct(rptr, Value, ptr);
-  return llvm_value_wrap(builder-&gt;CreateLoad(ptr));
+  return Data_Wrap_Struct(cLLVMLoadInst, NULL, NULL, builder-&gt;CreateLoad(ptr));
 }
 
 VALUE
@@ -174,7 +174,7 @@ llvm_builder_store(VALUE self, VALUE rv, VALUE rptr) {
   Value *v, *ptr;
   Data_Get_Struct(rv, Value, v);
   Data_Get_Struct(rptr, Value, ptr);
-  return llvm_value_wrap(builder-&gt;CreateStore(v, ptr));
+  return Data_Wrap_Struct(cLLVMStoreInst, NULL, NULL, builder-&gt;CreateStore(v, ptr));
 }
 
 VALUE
@@ -183,7 +183,7 @@ llvm_builder_icmp(VALUE self, VALUE pred, VALUE lhs, VALUE rhs) {
 
   CmpInst::Predicate p = (CmpInst::Predicate)FIX2INT(pred);
   Value *v = builder-&gt;CreateICmp(p, LLVM_VAL(lhs), LLVM_VAL(rhs));
-  return llvm_value_wrap(v);
+  return Data_Wrap_Struct(cLLVMICmpInst, NULL, NULL, v);
 }
 
 VALUE
@@ -192,7 +192,7 @@ llvm_builder_fcmp(VALUE self, VALUE pred, VALUE lhs, VALUE rhs) {
 
   CmpInst::Predicate p = (CmpInst::Predicate)FIX2INT(pred);
   Value *v = builder-&gt;CreateFCmp(p, LLVM_VAL(lhs), LLVM_VAL(rhs));
-  return llvm_value_wrap(v);
+  return Data_Wrap_Struct(cLLVMFCmpInst, NULL, NULL, v);
 }
 
 VALUE</diff>
      <filename>ext/llvm_basicblock.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -13,11 +13,19 @@ VALUE cLLVMArrayType = Qnil;
 VALUE cLLVMVectorType = Qnil;
 VALUE cLLVMFunctionType = Qnil;
 VALUE cLLVMInstruction = Qnil;
+VALUE cLLVMUnaryOperator = Qnil;
+VALUE cLLVMBinaryOperator = Qnil;
+VALUE cLLVMLoadInst = Qnil;
+VALUE cLLVMStoreInst = Qnil;
+VALUE cLLVMCmpInst = Qnil;
+VALUE cLLVMICmpInst = Qnil;
+VALUE cLLVMFCmpInst = Qnil;
 VALUE cLLVMTerminatorInst = Qnil;
 VALUE cLLVMReturnInst = Qnil;
 VALUE cLLVMBranchInst = Qnil;
 VALUE cLLVMSwitchInst = Qnil;
 VALUE cLLVMAllocationInst = Qnil;
+VALUE cLLVMFreeInst = Qnil;
 VALUE cLLVMPhi = Qnil;
 VALUE cLLVMBinaryOps = Qnil;
 VALUE cLLVMPassManager = Qnil;
@@ -137,12 +145,20 @@ void Init_llvmruby() {
   cLLVMBasicBlock = rb_define_class_under(cLLVMRuby, &quot;BasicBlock&quot;, cLLVMValue);   
   cLLVMBuilder = rb_define_class_under(cLLVMRuby, &quot;Builder&quot;, rb_cObject);
 
-  cLLVMInstruction = rb_define_class_under(cLLVMRuby, &quot;Instruction&quot;, rb_cObject);
+  cLLVMInstruction = rb_define_class_under(cLLVMRuby, &quot;Instruction&quot;, cLLVMValue);
+  cLLVMUnaryOperator = rb_define_class_under(cLLVMRuby, &quot;UnaryOperator&quot;, cLLVMInstruction);
+  cLLVMBinaryOperator = rb_define_class_under(cLLVMRuby, &quot;BinaryOperator&quot;, cLLVMInstruction);
+  cLLVMLoadInst = rb_define_class_under(cLLVMRuby, &quot;LoadInst&quot;, cLLVMUnaryOperator);
+  cLLVMStoreInst = rb_define_class_under(cLLVMRuby, &quot;BinaryOperator&quot;, cLLVMInstruction);
+  cLLVMCmpInst = rb_define_class_under(cLLVMRuby, &quot;CmpInst&quot;, cLLVMInstruction);
+  cLLVMICmpInst = rb_define_class_under(cLLVMRuby, &quot;ICmpInst&quot;, cLLVMCmpInst);
+  cLLVMFCmpInst = rb_define_class_under(cLLVMRuby, &quot;FCmpInst&quot;, cLLVMCmpInst);
   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);
   cLLVMAllocationInst = rb_define_class_under(cLLVMRuby, &quot;AllocationInst&quot;, cLLVMInstruction);
+  cLLVMFreeInst = rb_define_class_under(cLLVMRuby, &quot;FreeInst&quot;, cLLVMInstruction);
   cLLVMBinaryOps = rb_define_class_under(cLLVMInstruction, &quot;BinaryOps&quot;, rb_cObject);
   cLLVMPhi = rb_define_class_under(cLLVMRuby, &quot;Phi&quot;, cLLVMValue);
 </diff>
      <filename>ext/llvmruby.c</filename>
    </modified>
    <modified>
      <diff>@@ -32,11 +32,19 @@ extern VALUE cLLVMArrayType;
 extern VALUE cLLVMVectorType;
 extern VALUE cLLVMFunctionType;
 extern VALUE cLLVMInstruction;
+extern VALUE cLLVMUnaryOperator;
+extern VALUE cLLVMBinaryOperator;
+extern VALUE cLLVMLoadInst;
+extern VALUE cLLVMStoreInst;
+extern VALUE cLLVMCmpInst;
+extern VALUE cLLVMICmpInst;
+extern VALUE cLLVMFCmpInst;
 extern VALUE cLLVMTerminatorInst;
 extern VALUE cLLVMReturnInst;
 extern VALUE cLLVMBranchInst;
 extern VALUE cLLVMSwitchInst;
 extern VALUE cLLVMAllocationInst;
+extern VALUE cLLVMFreeInst;
 extern VALUE cLLVMBinaryOps;
 extern VALUE cLLVMPhi;
 extern VALUE cLLVMPassManager;
@@ -51,7 +59,7 @@ extern VALUE cLLVMPassManager;
 #define LLVM_PHI(obj) ((PHINode*)DATA_PTR(obj))
 
 #define CHECK_TYPE(val, klass)\
-  if(CLASS_OF(val) != klass) {\
+  if(!rb_obj_is_kind_of(val, klass)) {\
     rb_raise(rb_eTypeError, &quot;wrong argument type: %s given, expected %s&quot;, rb_obj_classname(val), rb_class2name(klass));\
   }
 </diff>
      <filename>ext/llvmruby.h</filename>
    </modified>
    <modified>
      <diff>@@ -280,7 +280,8 @@ class BasicTests &lt; Test::Unit::TestCase
 
       b.store(23.llvm(MACHINE_WORD), new_space)    
       v = b.load(new_space)
-      b.free(new_space)
+      free_inst = b.free(new_space)
+      assert_kind_of(FreeInst, free_inst)
       b.return(v)
     end
   end</diff>
      <filename>test/test_basic.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>d5243b0f46107e05471f884a95fe723ec6aaee23</id>
    </parent>
  </parents>
  <author>
    <name>Tom Bagby</name>
    <email>tomatobagby@gmail.com</email>
  </author>
  <url>http://github.com/tombagby/llvmruby/commit/86dc62620c7efb3e5cb10889af328c9675f449b2</url>
  <id>86dc62620c7efb3e5cb10889af328c9675f449b2</id>
  <committed-date>2008-10-19T17:17:04-07:00</committed-date>
  <authored-date>2008-10-19T17:17:04-07:00</authored-date>
  <message>more specialized instruction classes</message>
  <tree>21d5a2bf9ff34159d7e78bbd8e9efc2e0e0396f2</tree>
  <committer>
    <name>Tom Bagby</name>
    <email>tomatobagby@gmail.com</email>
  </committer>
</commit>
