summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--ext/dl/cptr.c23
-rw-r--r--test/dl/test_cptr.rb16
3 files changed, 43 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 37a6335d45..fe7766371d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Wed Nov 4 02:08:14 2009 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * ext/dl/cptr.c (rb_dlptr_eql, rb_dlptr_cmp): DL::CPtr#== and DL::CPtr#<=>
+ should not raise an exception when compared to a different object.
+
Wed Nov 4 00:05:36 2009 NARUSE, Yui <naruse@ruby-lang.org>
* string.c (rb_str_upto): make next object before yield its block.
diff --git a/ext/dl/cptr.c b/ext/dl/cptr.c
index 466905f69b..94632e8240 100644
--- a/ext/dl/cptr.c
+++ b/ext/dl/cptr.c
@@ -333,21 +333,42 @@ rb_dlptr_inspect(VALUE self)
return rb_str_new2(str);
}
+/*
+ * call-seq:
+ * ptr == other => true or false
+ * ptr.eql?(other) => true or false
+ *
+ * Returns true if +other+ wraps the same pointer, otherwise returns
+ * false.
+ */
VALUE
rb_dlptr_eql(VALUE self, VALUE other)
{
void *ptr1, *ptr2;
+
+ if(!rb_obj_is_kind_of(other, rb_cDLCPtr)) return Qfalse;
+
ptr1 = rb_dlptr2cptr(self);
ptr2 = rb_dlptr2cptr(other);
return ptr1 == ptr2 ? Qtrue : Qfalse;
}
-VALUE
+/*
+ * call-seq:
+ * ptr <=> other => -1, 0, 1, or nil
+ *
+ * Returns -1 if less than, 0 if equal to, 1 if greater than +other+. Returns
+ * nil if +ptr+ cannot be compared to +other+.
+ */
+static VALUE
rb_dlptr_cmp(VALUE self, VALUE other)
{
void *ptr1, *ptr2;
SIGNED_VALUE diff;
+
+ if(!rb_obj_is_kind_of(other, rb_cDLCPtr)) return Qnil;
+
ptr1 = rb_dlptr2cptr(self);
ptr2 = rb_dlptr2cptr(other);
diff = (SIGNED_VALUE)ptr1 - (SIGNED_VALUE)ptr2;
diff --git a/test/dl/test_cptr.rb b/test/dl/test_cptr.rb
index 2a55a07dee..c03abbe73e 100644
--- a/test/dl/test_cptr.rb
+++ b/test/dl/test_cptr.rb
@@ -3,6 +3,22 @@ require_relative '../ruby/envutil'
module DL
class TestCPtr < TestBase
+ def test_equals
+ ptr = CPtr.new 0
+ ptr2 = CPtr.new 0
+ assert_equal ptr2, ptr
+ end
+
+ def test_not_equals
+ ptr = CPtr.new 0
+ assert_not_equal 10, ptr, '10 should not equal the pointer'
+ end
+
+ def test_cmp
+ ptr = CPtr.new 0
+ assert_nil(ptr <=> 10, '10 should not be comparable')
+ end
+
def test_ref_ptr
ary = [0,1,2,4,5]
addr = CPtr.new(dlwrap(ary))