1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* 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.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@25634 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
tenderlove 2009-11-03 17:12:46 +00:00
parent 89f1c60cba
commit c30e32d075
3 changed files with 43 additions and 1 deletions

View file

@ -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> 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. * string.c (rb_str_upto): make next object before yield its block.

View file

@ -333,21 +333,42 @@ rb_dlptr_inspect(VALUE self)
return rb_str_new2(str); 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 VALUE
rb_dlptr_eql(VALUE self, VALUE other) rb_dlptr_eql(VALUE self, VALUE other)
{ {
void *ptr1, *ptr2; void *ptr1, *ptr2;
if(!rb_obj_is_kind_of(other, rb_cDLCPtr)) return Qfalse;
ptr1 = rb_dlptr2cptr(self); ptr1 = rb_dlptr2cptr(self);
ptr2 = rb_dlptr2cptr(other); ptr2 = rb_dlptr2cptr(other);
return ptr1 == ptr2 ? Qtrue : Qfalse; 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) rb_dlptr_cmp(VALUE self, VALUE other)
{ {
void *ptr1, *ptr2; void *ptr1, *ptr2;
SIGNED_VALUE diff; SIGNED_VALUE diff;
if(!rb_obj_is_kind_of(other, rb_cDLCPtr)) return Qnil;
ptr1 = rb_dlptr2cptr(self); ptr1 = rb_dlptr2cptr(self);
ptr2 = rb_dlptr2cptr(other); ptr2 = rb_dlptr2cptr(other);
diff = (SIGNED_VALUE)ptr1 - (SIGNED_VALUE)ptr2; diff = (SIGNED_VALUE)ptr1 - (SIGNED_VALUE)ptr2;

View file

@ -3,6 +3,22 @@ require_relative '../ruby/envutil'
module DL module DL
class TestCPtr < TestBase 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 def test_ref_ptr
ary = [0,1,2,4,5] ary = [0,1,2,4,5]
addr = CPtr.new(dlwrap(ary)) addr = CPtr.new(dlwrap(ary))