diff options
author | ttate <ttate@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-02-07 09:45:02 +0000 |
---|---|---|
committer | ttate <ttate@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-02-07 09:45:02 +0000 |
commit | 7bcc13550437e1c4198fbf6212abc8e7672e1adb (patch) | |
tree | cf1236e58aba577543c8788adbca32293d2d4ad4 /ext/dl/handle.c | |
parent | 48a86f5ffafb2744fac609714fee74f1872df84b (diff) | |
download | ruby-7bcc13550437e1c4198fbf6212abc8e7672e1adb.tar.gz |
Improved DL::Handle#sym.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@7911 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/dl/handle.c')
-rw-r--r-- | ext/dl/handle.c | 125 |
1 files changed, 85 insertions, 40 deletions
diff --git a/ext/dl/handle.c b/ext/dl/handle.c index 7f5ce12168..d30105169c 100644 --- a/ext/dl/handle.c +++ b/ext/dl/handle.c @@ -125,64 +125,109 @@ rb_dlhandle_to_i(VALUE self) VALUE rb_dlhandle_sym(VALUE self, VALUE sym) { - void (*func)(); - struct sym_data *data; - struct dl_handle *dlhandle; - void *handle; - const char *name; - const char *err; + void (*func)(); + struct sym_data *data; + struct dl_handle *dlhandle; + void *handle; + const char *name; + const char *err; - rb_secure(2); + rb_secure(2); - if( sym == Qnil ){ + if( sym == Qnil ){ #if defined(RTLD_NEXT) - name = RTLD_NEXT; + name = RTLD_NEXT; #else - name = NULL; + name = NULL; #endif - } - else{ - name = StringValuePtr(sym); - } + } + else{ + name = StringValuePtr(sym); + } - Data_Get_Struct(self, struct dl_handle, dlhandle); - if( ! dlhandle->open ){ - rb_raise(rb_eDLError, "Closed handle."); - } - handle = dlhandle->ptr; + Data_Get_Struct(self, struct dl_handle, dlhandle); + if( ! dlhandle->open ){ + rb_raise(rb_eDLError, "Closed handle."); + } + handle = dlhandle->ptr; - func = dlsym(handle, name); + func = dlsym(handle, name); #if defined(HAVE_DLERROR) - if( !func && (err = dlerror()) ) + if( !func && (err = dlerror()) ) #else - if( !func ) + if( !func ) #endif - { -#if defined(__CYGWIN__) || defined(WIN32) || defined(__MINGW32__) { - int len = strlen(name); - char *name_a = (char*)xmalloc(len+2); - strcpy(name_a, name); - name_a[len] = 'A'; - name_a[len+1] = '\0'; - func = dlsym(handle, name_a); - xfree(name_a); +#if defined(__CYGWIN__) || defined(WIN32) || defined(__MINGW32__) + { + int len = strlen(name); + int i; + char *name_a = (char*)xmalloc(len+2); + strcpy(name_a, name); + name_a[len] = 'A'; + name_a[len+1] = '\0'; + func = dlsym(handle, name_a); + xfree(name_a); #if defined(HAVE_DLERROR) - if( !func && (err = dlerror()) ) + if( !func && (err = dlerror()) ) #else - if( !func ) + if( !func ) #endif - { - rb_raise(rb_eDLError, "Unknown symbol \"%sA\".", name); - } - } + { + for( i = 0; i < 256; i += 4 ){ + int len = strlen(name); + char *name_n = (char*)xmalloc(len+5); + sprintf(name_n, "%s@%d%c", name, i, 0); + func = dlsym(handle, name_n); + xfree(name_n); +#if defined(HAVE_DLERROR) + if( func || !(err = dlerror()) ) #else - rb_raise(rb_eDLError, "Unknown symbol \"%s\".", name); + if( func ) #endif - } + { + break; + } + } +#if defined(HAVE_DLERROR) + if( !func && (err = dlerror()) ) +#else + if( !func ) +#endif + { + rb_raise(rb_eDLError, "Unknown symbol \"%s\".", name); + } + } + } +#else + for( i = 0; i < 256; i += 4 ){ + int len = strlen(name); + char *name_n = (char*)xmalloc(len+4); + sprintf(name_n, "%s@%d", name, i); + func = dlsym(handle, name_n); + xfree(name_n); +#if defined(HAVE_DLERROR) + if( func || !(err = dlerror()) ) +#else + if( func ) +#endif + { + break; + } + } +#if defined(HAVE_DLERROR) + if( !func && (err = dlerror()) ) +#else + if( !func ) +#endif + { + rb_raise(rb_eDLError, "Unknown symbol \"%s\".", name); + } +#endif + } - return PTR2NUM(func); + return PTR2NUM(func); } void |