[前][次][番号順一覧][スレッド一覧]

ruby-changes:28167

From: naruse <ko1@a...>
Date: Thu, 11 Apr 2013 06:15:56 +0900 (JST)
Subject: [ruby-changes:28167] naruse:r40219 (trunk): * ext/fiddle/extconf.rb: define RUBY_LIBFFI_MODVERSION macro.

naruse	2013-04-11 06:15:37 +0900 (Thu, 11 Apr 2013)

  New Revision: 40219

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=40219

  Log:
    * ext/fiddle/extconf.rb: define RUBY_LIBFFI_MODVERSION macro.
    
    * ext/fiddle/closure.c (USE_FFI_CLOSURE_ALLOC): define 0 or 1
      with platform and libffi's version. [Bug #3371]

  Modified files:
    trunk/ChangeLog
    trunk/ext/fiddle/closure.c
    trunk/ext/fiddle/extconf.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 40218)
+++ ChangeLog	(revision 40219)
@@ -1,3 +1,10 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Thu Apr 11 06:09:57 2013  NARUSE, Yui  <naruse@r...>
+
+	* ext/fiddle/extconf.rb: define RUBY_LIBFFI_MODVERSION macro.
+
+	* ext/fiddle/closure.c (USE_FFI_CLOSURE_ALLOC): define 0 or 1
+	  with platform and libffi's version. [Bug #3371]
+
 Thu Apr 11 05:30:43 2013  NARUSE, Yui  <naruse@r...>
 
 	* lib/mkmf.rb (pkg_config): Add optional argument "option".
Index: ext/fiddle/extconf.rb
===================================================================
--- ext/fiddle/extconf.rb	(revision 40218)
+++ ext/fiddle/extconf.rb	(revision 40219)
@@ -5,6 +5,10 @@ require 'mkmf' https://github.com/ruby/ruby/blob/trunk/ext/fiddle/extconf.rb#L5
 dir_config 'libffi'
 
 pkg_config("libffi")
+if ver = pkg_config("libffi", "modversion")
+  $defs.push(%{-DRUBY_LIBFFI_MODVERSION=#{ '%d%03d%03d' % ver.split('.') }})
+end
+
 unless have_header('ffi.h')
   if have_header('ffi/ffi.h')
     $defs.push(format('-DUSE_HEADER_HACKS'))
Index: ext/fiddle/closure.c
===================================================================
--- ext/fiddle/closure.c	(revision 40218)
+++ ext/fiddle/closure.c	(revision 40219)
@@ -10,15 +10,21 @@ typedef struct { https://github.com/ruby/ruby/blob/trunk/ext/fiddle/closure.c#L10
     ffi_type **argv;
 } fiddle_closure;
 
-#if defined(MACOSX) || defined(__linux__) || defined(__OpenBSD__)
-#define DONT_USE_FFI_CLOSURE_ALLOC
+#if defined(USE_FFI_CLOSURE_ALLOC)
+#elif defined(__OpenBSD__)
+# define USE_FFI_CLOSURE_ALLOC 0
+#elif RUBY_LIBFFI_MODVERSION < 3000005 && \
+	(defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_AMD64))
+# define USE_FFI_CLOSURE_ALLOC 0
+#else
+# define USE_FFI_CLOSURE_ALLOC 1
 #endif
 
 static void
 dealloc(void * ptr)
 {
     fiddle_closure * cls = (fiddle_closure *)ptr;
-#ifndef DONT_USE_FFI_CLOSURE_ALLOC
+#if USE_FFI_CLOSURE_ALLOC
     ffi_closure_free(cls->pcl);
 #else
     munmap(cls->pcl, sizeof(cls->pcl));
@@ -170,7 +176,7 @@ allocate(VALUE klass) https://github.com/ruby/ruby/blob/trunk/ext/fiddle/closure.c#L176
     VALUE i = TypedData_Make_Struct(klass, fiddle_closure,
 	    &closure_data_type, closure);
 
-#ifndef DONT_USE_FFI_CLOSURE_ALLOC
+#if USE_FFI_CLOSURE_ALLOC
     closure->pcl = ffi_closure_alloc(sizeof(ffi_closure), &closure->code);
 #else
     closure->pcl = mmap(NULL, sizeof(ffi_closure), PROT_READ | PROT_WRITE,
@@ -222,7 +228,7 @@ initialize(int rbargc, VALUE argv[], VAL https://github.com/ruby/ruby/blob/trunk/ext/fiddle/closure.c#L228
     if (FFI_OK != result)
 	rb_raise(rb_eRuntimeError, "error prepping CIF %d", result);
 
-#ifndef DONT_USE_FFI_CLOSURE_ALLOC
+#if USE_FFI_CLOSURE_ALLOC
     result = ffi_prep_closure_loc(pcl, cif, callback,
 		(void *)self, cl->code);
 #else

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]