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:
parent
89f1c60cba
commit
c30e32d075
3 changed files with 43 additions and 1 deletions
|
@ -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.
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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))
|
||||||
|
|
Loading…
Reference in a new issue