[#28561] Ruby::DL vs Ruby::FFI — Aston <blackapache512-ticket@...>

Ruby.DL and FFI libraries are great for programmers like me who are not internet programmers, but are more interested in scientific and number processing etc.

11 messages 2010/03/08

[#28686] trunk (26947) build fail with msys/mingw/vista — Jon <jon.forums@...>

I get the following build failure when msysgit's "c:\git\cmd" dir is on PATH.

8 messages 2010/03/16

[#28687] [Bug #2973] rb_bug - Segmentation fault - error.c:213 — rudolf gavlas <redmine@...>

Bug #2973: rb_bug - Segmentation fault - error.c:213

10 messages 2010/03/16

[#28735] [Bug #2982] Ruby tries to link with both openssl and readline — Lucas Nussbaum <redmine@...>

Bug #2982: Ruby tries to link with both openssl and readline

16 messages 2010/03/18

[#28736] [Bug #2983] Ruby (GPLv2 only) tries to link to with readline (now GPLv3) — Lucas Nussbaum <redmine@...>

Bug #2983: Ruby (GPLv2 only) tries to link to with readline (now GPLv3)

10 messages 2010/03/18

[#28907] [Bug #3000] Open SSL Segfaults — Christian Höltje <redmine@...>

Bug #3000: Open SSL Segfaults

19 messages 2010/03/23

[#28924] [Bug #3005] Ruby core dump - [BUG] rb_sys_fail() - errno == 0 — Sebastian YEPES <redmine@...>

Bug #3005: Ruby core dump - [BUG] rb_sys_fail() - errno == 0

10 messages 2010/03/24

[#28954] [Feature #3010] slow require gems in ruby 1.9.1 — Miao Jiang <redmine@...>

Feature #3010: slow require gems in ruby 1.9.1

15 messages 2010/03/24

[#29179] [Bug #3071] Convert rubygems and rdoc to use psych — Aaron Patterson <redmine@...>

Bug #3071: Convert rubygems and rdoc to use psych

10 messages 2010/03/31

[ruby-core:28504] Patch for : ext\dl\handle.c

From: Christian Bodt <sirk390@...>
Date: 2010-03-05 13:24:01 UTC
List: ruby-core #28504
Hi,

It's the first time I try to contribute to the ruby project.
I'd like to propose this small patch to make the dlhandle_sym function a
little more readable.
     * ext/dl/handle.c (dlhandle_sym): Added xdlsym function and replaced
CHECK_DLERROR with 'xdlsym'

Initially, I wanted to add the support for loading of symbols with the
format "_function@NNN" (from MSCV dlls) but the "dlhandle_sym" function was
a little to complex to implement it without some refactoring. I will need
some more patches to achieve this :)

I tried to keep this patch very simple.
What do you think?

Christian Bodt

Attachments (1)

simpler_dlerror_check.patch (1.7 KB, text/x-diff)
Index: handle.c
===================================================================
--- handle.c	(revision 26818)
+++ handle.c	(working copy)
@@ -52,6 +52,23 @@
 };
 
 /*
+ *  	xdlsym:	dlsym with dlerror() check 
+ */
+static void*
+xdlsym(void *handle, const char *name)
+{
+    void (*func)();
+
+	func = dlsym(handle, name);	
+#if defined(HAVE_DLERROR)
+    const char *err;
+	if( err = dlerror() )
+		func = 0;
+#endif
+	return (func);
+}
+
+/*
  * call-seq: close
  *
  * Close this DL::Handle.  Calling close more than once will raise a
@@ -296,17 +313,10 @@
 static VALUE
 dlhandle_sym(void *handle, const char *name)
 {
-#if defined(HAVE_DLERROR)
-    const char *err;
-# define CHECK_DLERROR if( err = dlerror() ){ func = 0; }
-#else
-# define CHECK_DLERROR
-#endif
     void (*func)();
 
     rb_secure(2);
-    func = dlsym(handle, name);
-    CHECK_DLERROR;
+    func = xdlsym(handle, name);
 #if defined(FUNC_STDCALL)
     if( !func ){
 	int  i;
@@ -319,8 +329,7 @@
 	    name_n = name_a;
 	    name_a[len]   = 'A';
 	    name_a[len+1] = '\0';
-	    func = dlsym(handle, name_a);
-	    CHECK_DLERROR;
+	    func = xdlsym(handle, name_a);
 	    if( func ) goto found;
 	    name_n = xrealloc(name_a, len+6);
 	}
@@ -331,8 +340,7 @@
 	name_n[len++] = '@';
 	for( i = 0; i < 256; i += 4 ){
 	    sprintf(name_n + len, "%d", i);
-	    func = dlsym(handle, name_n);
-	    CHECK_DLERROR;
+	    func = xdlsym(handle, name_n);
 	    if( func ) break;
 	}
 	if( func ) goto found;
@@ -340,8 +348,7 @@
 	name_n[len++] = '@';
 	for( i = 0; i < 256; i += 4 ){
 	    sprintf(name_n + len, "%d", i);
-	    func = dlsym(handle, name_n);
-	    CHECK_DLERROR;
+	    func = xdlsym(handle, name_n);
 	    if( func ) break;
 	}
       found:

In This Thread

Prev Next