diff --git a/ext/dl/doc/dl.txt b/ext/dl/doc/dl.txt index 114baafcb7..9964c4e12f 100644 --- a/ext/dl/doc/dl.txt +++ b/ext/dl/doc/dl.txt @@ -59,6 +59,18 @@ to wrap the given PtrData object which is, for example, created by DL::malloc(). DL::malloc() is a function to allocate a memory by using the C library function malloc(). +We can define a callback using the module function "callback" as follows: + + module Foo + extend DL::Importable + def my_comp(str1,str2) + str1 <=> str2 + end + COMPARE = callback "int my_comp(char*,char*)" + end + +where Foo::COMPARE is a Symbol object which invokes the method "my_comp". + DL::Importable module is very useful. However, we sometimes encounter a case that we must directly use low-level functions such as dlsym(). In such case, we would use DL module functions. They are described in next section. diff --git a/ext/dl/lib/dl/types.rb b/ext/dl/lib/dl/types.rb index 51489921ff..53680ac536 100644 --- a/ext/dl/lib/dl/types.rb +++ b/ext/dl/lib/dl/types.rb @@ -88,6 +88,7 @@ module DL ["long", "L", nil, nil, nil, nil], ["float", "F", nil, nil, nil, nil], ["double", "D", nil, nil, nil, nil], + [/char\s*\*/,"S",nil, nil, nil, nil], [/.+\*/, "P", nil, nil, nil, nil], [/.+\[\]/, "a", nil, nil, nil, nil], ["void", "0", nil, nil, nil, nil], diff --git a/ext/dl/sample/libc.rb b/ext/dl/sample/libc.rb index 9975828be3..32816fd331 100644 --- a/ext/dl/sample/libc.rb +++ b/ext/dl/sample/libc.rb @@ -35,6 +35,11 @@ module LIBC "int tz_minuteswest", "int tz_dsttime", ] + + def my_compare(ptr1, ptr2) + ptr1.ptr.to_s <=> ptr2.ptr.to_s + end + COMPARE = callback "int my_compare(char**, char**)" end @@ -54,7 +59,7 @@ p LIBC.strcat("a", "b") ary = ["a","c","b"] ptr = ary.to_ptr -LIBC.qsort(ptr, ary.length, DL.sizeof('P'), $cb1) +LIBC.qsort(ptr, ary.length, DL.sizeof('P'), LIBC::COMPARE) p ptr.to_a('S', ary.length) tv = LIBC::Timeval.malloc