mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* test/dl/test_cptr.rb (test_to_ptr*): testing DL::CPtr#to_ptr
* ext/dl/cptr.c (rb_dlptr_free_set, rb_dlptr_free_get, rb_dlptr_s_to_ptr): adding documentation, fixing indentation git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@25636 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
b9e0294eda
commit
02d55ac989
2 changed files with 61 additions and 7 deletions
|
@ -254,7 +254,12 @@ rb_dlptr_null_p(VALUE self)
|
|||
return data->ptr ? Qfalse : Qtrue;
|
||||
}
|
||||
|
||||
VALUE
|
||||
/*
|
||||
* call-seq: free=(function)
|
||||
*
|
||||
* Set the free function for this pointer to the DL::CFunc in +function+.
|
||||
*/
|
||||
static VALUE
|
||||
rb_dlptr_free_set(VALUE self, VALUE val)
|
||||
{
|
||||
struct ptr_data *data;
|
||||
|
@ -265,7 +270,12 @@ rb_dlptr_free_set(VALUE self, VALUE val)
|
|||
return Qnil;
|
||||
}
|
||||
|
||||
VALUE
|
||||
/*
|
||||
* call-seq: free
|
||||
*
|
||||
* Get the free function for this pointer. Returns DL::CFunc or nil.
|
||||
*/
|
||||
static VALUE
|
||||
rb_dlptr_free_get(VALUE self)
|
||||
{
|
||||
struct ptr_data *pdata;
|
||||
|
@ -499,21 +509,29 @@ rb_dlptr_size_get(VALUE self)
|
|||
return LONG2NUM(RPTR_DATA(self)->size);
|
||||
}
|
||||
|
||||
VALUE
|
||||
/*
|
||||
* call-seq:
|
||||
* DL::CPtr.to_ptr(val) => cptr
|
||||
* DL::CPtr[val] => cptr
|
||||
*
|
||||
* Get the underlying pointer for ruby object +val+ and return it as a
|
||||
* DL::CPtr object.
|
||||
*/
|
||||
static VALUE
|
||||
rb_dlptr_s_to_ptr(VALUE self, VALUE val)
|
||||
{
|
||||
VALUE ptr;
|
||||
|
||||
if (rb_obj_is_kind_of(val, rb_cIO) == Qtrue){
|
||||
if (RTEST(rb_obj_is_kind_of(val, rb_cIO))){
|
||||
rb_io_t *fptr;
|
||||
FILE *fp;
|
||||
GetOpenFile(val, fptr);
|
||||
fp = rb_io_stdio_file(fptr);
|
||||
ptr = rb_dlptr_new(fp, 0, NULL);
|
||||
}
|
||||
else if (rb_obj_is_kind_of(val, rb_cString) == Qtrue){
|
||||
char *str = StringValuePtr(val);
|
||||
ptr = rb_dlptr_new(str, RSTRING_LEN(val), NULL);
|
||||
else if (RTEST(rb_obj_is_kind_of(val, rb_cString))){
|
||||
char *str = StringValuePtr(val);
|
||||
ptr = rb_dlptr_new(str, RSTRING_LEN(val), NULL);
|
||||
}
|
||||
else if (rb_respond_to(val, id_to_ptr)){
|
||||
VALUE vptr = rb_funcall(val, id_to_ptr, 0);
|
||||
|
|
|
@ -3,6 +3,42 @@ require_relative '../ruby/envutil'
|
|||
|
||||
module DL
|
||||
class TestCPtr < TestBase
|
||||
def test_to_ptr_string
|
||||
str = "hello world"
|
||||
ptr = CPtr[str]
|
||||
assert ptr.tainted?, 'pointer should be tainted'
|
||||
assert_equal str.length, ptr.size
|
||||
assert_equal 'hello', ptr[0,5]
|
||||
end
|
||||
|
||||
def test_to_ptr_io
|
||||
buf = CPtr.malloc(10)
|
||||
File.open(__FILE__, 'r') do |f|
|
||||
ptr = CPtr.to_ptr f
|
||||
fread = CFunc.new(@libc['fread'], TYPE_VOID, 'fread')
|
||||
fread.call([buf.to_i, DL::SIZEOF_CHAR, buf.size - 1, ptr.to_i])
|
||||
end
|
||||
|
||||
File.open(__FILE__, 'r') do |f|
|
||||
assert_equal f.read(9), buf.to_s
|
||||
end
|
||||
end
|
||||
|
||||
def test_to_ptr_with_ptr
|
||||
ptr = CPtr.new 0
|
||||
ptr2 = CPtr.to_ptr Struct.new(:to_ptr).new(ptr)
|
||||
assert_equal ptr, ptr2
|
||||
|
||||
assert_raises(DL::DLError) do
|
||||
CPtr.to_ptr Struct.new(:to_ptr).new(nil)
|
||||
end
|
||||
end
|
||||
|
||||
def test_to_ptr_with_num
|
||||
ptr = CPtr.new 0
|
||||
assert_equal ptr, CPtr[0]
|
||||
end
|
||||
|
||||
def test_equals
|
||||
ptr = CPtr.new 0
|
||||
ptr2 = CPtr.new 0
|
||||
|
|
Loading…
Reference in a new issue