diff options
-rw-r--r-- | ext/dl/handle.c | 11 | ||||
-rw-r--r-- | test/dl/test_handle.rb | 25 |
2 files changed, 33 insertions, 3 deletions
diff --git a/ext/dl/handle.c b/ext/dl/handle.c index eee0cb26b0..ad1f2210cf 100644 --- a/ext/dl/handle.c +++ b/ext/dl/handle.c @@ -205,16 +205,21 @@ rb_dlhandle_to_i(VALUE self) static VALUE dlhandle_sym(void *handle, const char *symbol); +/* + * Document-method: sym + * Document-method: [] + * + * call-seq: sym(name) + * + * Get the address as an Integer for the function named +name+. + */ VALUE rb_dlhandle_sym(VALUE self, VALUE sym) { struct dl_handle *dlhandle; - const char *name; rb_secure(2); - name = StringValuePtr(sym); - TypedData_Get_Struct(self, struct dl_handle, &dlhandle_data_type, dlhandle); if( ! dlhandle->open ){ rb_raise(rb_eDLError, "closed handle"); diff --git a/test/dl/test_handle.rb b/test/dl/test_handle.rb index fed9da4f85..59582e96b2 100644 --- a/test/dl/test_handle.rb +++ b/test/dl/test_handle.rb @@ -2,6 +2,31 @@ require 'test_base' module DL class TestHandle < TestBase + def test_sym_closed_handle + handle = DL::Handle.new(LIBC_SO) + handle.close + assert_raises(DL::DLError) { handle.sym("calloc") } + assert_raises(DL::DLError) { handle["calloc"] } + end + + def test_sym_unknown + handle = DL::Handle.new(LIBC_SO) + assert_raises(DL::DLError) { handle.sym('fooo') } + assert_raises(DL::DLError) { handle['fooo'] } + end + + def test_sym_with_bad_args + handle = DL::Handle.new(LIBC_SO) + assert_raises(TypeError) { handle.sym(nil) } + assert_raises(TypeError) { handle[nil] } + end + + def test_sym + handle = DL::Handle.new(LIBC_SO) + assert handle.sym('calloc') + assert handle['calloc'] + end + def test_handle_close handle = DL::Handle.new(LIBC_SO) assert_equal 0, handle.close |