ffi 1.14.2 → 1.15.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 353f17e7189b732ee142f0fdc41abd08c4fd452ff66c8a8ac8f6f73fea51af61
4
- data.tar.gz: dffb5ad7b577e129155fc17a27510a8b59c47b581f35a23feaecb8db1a8045ed
3
+ metadata.gz: aa4ec9f3d594a52a39d6ed09a73f1b25f912306d86447e183008adfedd8ef112
4
+ data.tar.gz: b998fa031983d27bc0bfb698e8284e8bc2fa931bd72e8fc21b761828d688f49d
5
5
  SHA512:
6
- metadata.gz: 2ecd826778b07a85f78e85d029f7fddf3db2504662368e00dca0089eab598b0192327a9b32dde4219c2c74085a8df6b68c65e1b1f949cb958933dbef2c827fdd
7
- data.tar.gz: 7eac3b6ba310ff47cc1fe4288a1efa9c0b4dda8f10be26c65d67d446cd83a4085cc99e60c965254165205d0345a03e56c39e8a2ab4e0cc48efbe1ba28c0c7bc2
6
+ metadata.gz: e2352da0e9bf497be6000ebf0dc9f2714c2fa8b4a4d379d7e05d0cfcb51d002e0a83f47463f54284f561b2a7250ddb73e82ea6a13d90c1e84fe1e7277fe5993f
7
+ data.tar.gz: 750d28e73978ec4bc9f2546a66a9293b610200aec7e91165b226b6a6ba1b6c3bc409cf30841f9d21ade246c4e5c7d39d89ea5a3d858649319ea381718e4dafb8
data/CHANGELOG.md CHANGED
@@ -1,3 +1,26 @@
1
+ 1.15.0 / 2021-03-05
2
+ -------------------
3
+
4
+ Fixed:
5
+ * Fix MSVC build
6
+ * Fix async callbacks in conjunction with fork(). #884
7
+
8
+ Added:
9
+ * Allow to pass callbacks in varargs. #885
10
+ * Name the threads for FFI callback dispatcher and async thread calls for easier debugging. #883
11
+ The name can be retrieved by Thread.name and is shown by Thread.list.inspect etc.
12
+ Even gdb shows the thread name on supported operating systems.
13
+ * Add types.conf for powerpc64le-linux
14
+ * Add types.conf for riscv64-linux
15
+ * More release automation of ffi gems
16
+
17
+ Changed:
18
+ * Switch from rubygems-tasks to bundler/gem_helper
19
+
20
+ Removed:
21
+ * Remove unused VariadicInvoker#init
22
+
23
+
1
24
  1.14.2 / 2020-12-21
2
25
  -------------------
3
26
 
data/Gemfile CHANGED
@@ -5,10 +5,7 @@ group :development do
5
5
  gem 'rake-compiler', '~> 1.0.3'
6
6
  gem 'rake-compiler-dock', '~> 1.0'
7
7
  gem 'rspec', '~> 3.0'
8
- # irb is a dependency of rubygems-tasks 0.2.5.
9
- # irb versions > 1.1.1 depend on reline,
10
- # which sometimes causes 'bundle install' to fail on Ruby <= 2.4: https://github.com/rubygems/rubygems/issues/3463
11
- gem 'rubygems-tasks', '>= 0.2', '< 0.2.5', :require => 'rubygems/tasks'
8
+ gem 'bundler', '~> 2.0'
12
9
  end
13
10
 
14
11
  group :doc do
data/Rakefile CHANGED
@@ -1,20 +1,17 @@
1
- require 'rubygems/tasks'
2
1
  require 'rbconfig'
3
- require 'rake/clean'
4
- require_relative "lib/ffi/version"
5
-
6
2
  require 'date'
7
3
  require 'fileutils'
8
4
  require 'rbconfig'
9
5
  require 'rspec/core/rake_task'
10
6
  require 'rubygems/package_task'
7
+ require 'rake/extensiontask'
8
+ require_relative "lib/ffi/version"
9
+ require_relative "rakelib/ffi_gem_helper"
11
10
 
12
11
  BUILD_DIR = "build"
13
12
  BUILD_EXT_DIR = File.join(BUILD_DIR, "#{RbConfig::CONFIG['arch']}", 'ffi_c', RUBY_VERSION)
14
13
 
15
- def gem_spec
16
- @gem_spec ||= Gem::Specification.load('ffi.gemspec')
17
- end
14
+ gem_spec = Bundler.load_gemspec('ffi.gemspec')
18
15
 
19
16
  RSpec::Core::RakeTask.new(:spec => :compile) do |config|
20
17
  config.rspec_opts = YAML.load_file 'spec/spec.opts'
@@ -87,6 +84,10 @@ end
87
84
 
88
85
  task 'gem:java' => 'java:gem'
89
86
 
87
+ FfiGemHelper.install_tasks
88
+ # Register windows gems to be pushed to rubygems.org
89
+ Bundler::GemHelper.instance.cross_platforms = %w[x86-mingw32 x64-mingw32]
90
+
90
91
  if RUBY_ENGINE == 'ruby' || RUBY_ENGINE == 'rbx'
91
92
  require 'rake/extensiontask'
92
93
  Rake::ExtensionTask.new('ffi_c', gem_spec) do |ext|
@@ -94,21 +95,11 @@ if RUBY_ENGINE == 'ruby' || RUBY_ENGINE == 'rbx'
94
95
  # ext.lib_dir = BUILD_DIR # put binaries into this folder.
95
96
  ext.tmp_dir = BUILD_DIR # temporary folder used during compilation.
96
97
  ext.cross_compile = true # enable cross compilation (requires cross compile toolchain)
97
- ext.cross_platform = %w[i386-mingw32 x64-mingw32] # forces the Windows platform instead of the default one
98
+ ext.cross_platform = Bundler::GemHelper.instance.cross_platforms
98
99
  ext.cross_compiling do |spec|
99
100
  spec.files.reject! { |path| File.fnmatch?('ext/*', path) }
100
101
  end
101
- end
102
-
103
- # To reduce the gem file size strip mingw32 dlls before packaging
104
- ENV['RUBY_CC_VERSION'].to_s.split(':').each do |ruby_version|
105
- task "build/i386-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/ffi_c.so" do |t|
106
- sh "i686-w64-mingw32-strip -S build/i386-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/ffi_c.so"
107
- end
108
102
 
109
- task "build/x64-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/ffi_c.so" do |t|
110
- sh "x86_64-w64-mingw32-strip -S build/x64-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/ffi_c.so"
111
- end
112
103
  end
113
104
  else
114
105
  task :compile do
@@ -116,6 +107,7 @@ else
116
107
  end
117
108
  end
118
109
 
110
+
119
111
  desc "build a windows gem without all the ceremony"
120
112
  task "gem:windows" do
121
113
  require "rake_compiler_dock"
@@ -132,7 +124,7 @@ task :libffi => "ext/ffi_c/libffi/autogen.sh"
132
124
 
133
125
  LIBFFI_GIT_FILES = `git --git-dir ext/ffi_c/libffi/.git ls-files -z`.split("\x0")
134
126
 
135
- # Generate files in gemspec but not in libffi's git repo by running autogen.sh
127
+ # Generate files which are in the gemspec but not in libffi's git repo by running autogen.sh
136
128
  gem_spec.files.select do |f|
137
129
  f =~ /ext\/ffi_c\/libffi\/(.*)/ && !LIBFFI_GIT_FILES.include?($1)
138
130
  end.each do |f|
@@ -148,6 +140,11 @@ end.each do |f|
148
140
  end
149
141
  end
150
142
 
143
+ # Make sure we have all gemspec files before packaging
144
+ task :build => gem_spec.files
145
+ task :gem => :build
146
+
147
+
151
148
  require_relative "lib/ffi/platform"
152
149
  types_conf = File.expand_path(File.join(FFI::Platform::CONF_DIR, 'types.conf'))
153
150
  logfile = File.join(File.dirname(__FILE__), 'types_log')
@@ -168,10 +165,6 @@ end
168
165
  desc "Create or update type information for platform #{FFI::Platform::NAME}"
169
166
  task :types_conf => types_conf
170
167
 
171
- Gem::Tasks.new do |t|
172
- t.scm.tag.format = '%s'
173
- end
174
-
175
168
  begin
176
169
  require 'yard'
177
170
 
data/ext/ffi_c/Call.c CHANGED
@@ -310,7 +310,6 @@ rbffi_SetupCallParams(int argc, VALUE* argv, int paramCount, Type** paramTypes,
310
310
 
311
311
 
312
312
  case NATIVE_FUNCTION:
313
- case NATIVE_CALLBACK:
314
313
  if (callbackProc != Qnil) {
315
314
  param->ptr = callback_param(callbackProc, callbackParameters[cbidx++]);
316
315
  } else {
data/ext/ffi_c/Function.c CHANGED
@@ -282,6 +282,17 @@ rbffi_Function_ForProc(VALUE rbFunctionInfo, VALUE proc)
282
282
  return callback;
283
283
  }
284
284
 
285
+ #if !defined(_WIN32) && defined(DEFER_ASYNC_CALLBACK)
286
+ static void
287
+ after_fork_callback(void)
288
+ {
289
+ /* Ensure that a new dispatcher thread is started in a forked process */
290
+ async_cb_thread = Qnil;
291
+ pthread_mutex_init(&async_cb_mutex, NULL);
292
+ pthread_cond_init(&async_cb_cond, NULL);
293
+ }
294
+ #endif
295
+
285
296
  static VALUE
286
297
  function_init(VALUE self, VALUE rbFunctionInfo, VALUE rbProc)
287
298
  {
@@ -309,7 +320,16 @@ function_init(VALUE self, VALUE rbFunctionInfo, VALUE rbProc)
309
320
 
310
321
  #if defined(DEFER_ASYNC_CALLBACK)
311
322
  if (async_cb_thread == Qnil) {
323
+
324
+ #if !defined(_WIN32)
325
+ if( pthread_atfork(NULL, NULL, after_fork_callback) ){
326
+ rb_warn("FFI: unable to register fork callback");
327
+ }
328
+ #endif
329
+
312
330
  async_cb_thread = rb_thread_create(async_cb_event, NULL);
331
+ /* Name thread, for better debugging */
332
+ rb_funcall(async_cb_thread, rb_intern("name="), 1, rb_str_new2("FFI Callback Dispatcher"));
313
333
  }
314
334
  #endif
315
335
 
@@ -525,7 +545,9 @@ async_cb_event(void* unused)
525
545
  rb_thread_call_without_gvl(async_cb_wait, &w, async_cb_stop, &w);
526
546
  if (w.cb != NULL) {
527
547
  /* Start up a new ruby thread to run the ruby callback */
528
- rb_thread_create(async_cb_call, w.cb);
548
+ VALUE new_thread = rb_thread_create(async_cb_call, w.cb);
549
+ /* Name thread, for better debugging */
550
+ rb_funcall(new_thread, rb_intern("name="), 1, rb_str_new2("FFI Callback Runner"));
529
551
  }
530
552
  }
531
553
 
@@ -711,7 +733,6 @@ invoke_callback(VALUE data)
711
733
  break;
712
734
 
713
735
  case NATIVE_FUNCTION:
714
- case NATIVE_CALLBACK:
715
736
  case NATIVE_STRUCT:
716
737
  param = rbffi_NativeValue_ToRuby(paramType, rbParamType, parameters[i]);
717
738
  break;
@@ -787,7 +808,6 @@ invoke_callback(VALUE data)
787
808
  break;
788
809
 
789
810
  case NATIVE_FUNCTION:
790
- case NATIVE_CALLBACK:
791
811
  if (TYPE(rbReturnValue) == T_DATA && rb_obj_is_kind_of(rbReturnValue, rbffi_PointerClass)) {
792
812
 
793
813
  *((void **) retval) = ((AbstractMemory *) DATA_PTR(rbReturnValue))->address;
data/ext/ffi_c/Function.h CHANGED
@@ -34,11 +34,7 @@
34
34
  extern "C" {
35
35
  #endif
36
36
 
37
- #ifndef _MSC_VER
38
37
  # include <stdbool.h>
39
- #else
40
- # include "win32/stdbool.h"
41
- #endif
42
38
 
43
39
  #include <ffi.h>
44
40
 
@@ -31,11 +31,7 @@
31
31
  #ifndef RBFFI_MEMORYPOINTER_H
32
32
  #define RBFFI_MEMORYPOINTER_H
33
33
 
34
- #ifndef _MSC_VER
35
34
  # include <stdbool.h>
36
- #else
37
- # include "win32/stdbool.h"
38
- #endif
39
35
  #include <ruby.h>
40
36
 
41
37
  #ifdef __cplusplus
data/ext/ffi_c/Pointer.h CHANGED
@@ -30,11 +30,7 @@
30
30
  #ifndef RBFFI_POINTER_H
31
31
  #define RBFFI_POINTER_H
32
32
 
33
- #ifndef _MSC_VER
34
33
  # include <stdbool.h>
35
- #else
36
- # include "win32/stdbool.h"
37
- #endif
38
34
 
39
35
  #ifdef __cplusplus
40
36
  extern "C" {
@@ -123,7 +123,6 @@ struct_field_initialize(int argc, VALUE* argv, VALUE self)
123
123
 
124
124
  switch (field->type->nativeType == NATIVE_MAPPED ? ((MappedType *) field->type)->type->nativeType : field->type->nativeType) {
125
125
  case NATIVE_FUNCTION:
126
- case NATIVE_CALLBACK:
127
126
  case NATIVE_POINTER:
128
127
  field->referenceRequired = true;
129
128
  break;
data/ext/ffi_c/Types.c CHANGED
@@ -85,10 +85,9 @@ rbffi_NativeValue_ToRuby(Type* type, VALUE rbType, const void* ptr)
85
85
  return rbffi_Pointer_NewInstance(*(void **) ptr);
86
86
  case NATIVE_BOOL:
87
87
  return ((unsigned char) *(ffi_arg *) ptr) ? Qtrue : Qfalse;
88
-
89
- case NATIVE_FUNCTION:
90
- case NATIVE_CALLBACK: {
91
- return *(void **) ptr != NULL
88
+
89
+ case NATIVE_FUNCTION: {
90
+ return *(void **) ptr != NULL
92
91
  ? rbffi_Function_NewInstance(rbType, rbffi_Pointer_NewInstance(*(void **) ptr))
93
92
  : Qnil;
94
93
  }
@@ -116,15 +115,15 @@ rbffi_NativeValue_ToRuby(Type* type, VALUE rbType, const void* ptr)
116
115
 
117
116
  values[0] = rbffi_NativeValue_ToRuby(m->type, m->rbType, ptr);
118
117
  values[1] = Qnil;
119
-
118
+
120
119
 
121
120
  rbReturnValue = rb_funcall2(m->rbConverter, id_from_native, 2, values);
122
121
  RB_GC_GUARD(values[0]);
123
122
  RB_GC_GUARD(rbType);
124
-
123
+
125
124
  return rbReturnValue;
126
125
  }
127
-
126
+
128
127
  default:
129
128
  rb_raise(rb_eRuntimeError, "Unknown type: %d", type->nativeType);
130
129
  return Qnil;
data/ext/ffi_c/Types.h CHANGED
@@ -51,20 +51,19 @@ typedef enum {
51
51
  NATIVE_FLOAT64,
52
52
  NATIVE_LONGDOUBLE,
53
53
  NATIVE_POINTER,
54
- NATIVE_CALLBACK,
55
54
  NATIVE_FUNCTION,
56
55
  NATIVE_BUFFER_IN,
57
56
  NATIVE_BUFFER_OUT,
58
57
  NATIVE_BUFFER_INOUT,
59
58
  NATIVE_CHAR_ARRAY,
60
59
  NATIVE_BOOL,
61
-
60
+
62
61
  /** An immutable string. Nul terminated, but only copies in to the native function */
63
62
  NATIVE_STRING,
64
-
63
+
65
64
  /** The function takes a variable number of arguments */
66
65
  NATIVE_VARARGS,
67
-
66
+
68
67
  /** Struct-by-value param or result */
69
68
  NATIVE_STRUCT,
70
69
 
data/ext/ffi_c/Variadic.c CHANGED
@@ -168,7 +168,8 @@ variadic_invoke(VALUE self, VALUE parameterTypes, VALUE parameterValues)
168
168
  ffi_type* ffiReturnType;
169
169
  Type** paramTypes;
170
170
  VALUE* argv;
171
- int paramCount = 0, fixedCount = 0, i;
171
+ VALUE* callbackParameters;
172
+ int paramCount = 0, fixedCount = 0, callbackCount = 0, i;
172
173
  ffi_status ffiStatus;
173
174
  rbffi_frame_t frame = { 0 };
174
175
 
@@ -182,6 +183,7 @@ variadic_invoke(VALUE self, VALUE parameterTypes, VALUE parameterValues)
182
183
  params = ALLOCA_N(FFIStorage, paramCount);
183
184
  ffiValues = ALLOCA_N(void*, paramCount);
184
185
  argv = ALLOCA_N(VALUE, paramCount);
186
+ callbackParameters = ALLOCA_N(VALUE, paramCount);
185
187
  retval = alloca(MAX(invoker->returnType->ffiType->size, FFI_SIZEOF_ARG));
186
188
 
187
189
  for (i = 0; i < paramCount; ++i) {
@@ -211,6 +213,14 @@ variadic_invoke(VALUE self, VALUE parameterTypes, VALUE parameterValues)
211
213
  Data_Get_Struct(rbType, Type, paramTypes[i]);
212
214
  break;
213
215
 
216
+ case NATIVE_FUNCTION:
217
+ if (!rb_obj_is_kind_of(rbType, rbffi_FunctionTypeClass)) {
218
+ VALUE typeName = rb_funcall2(rbType, rb_intern("inspect"), 0, NULL);
219
+ rb_raise(rb_eTypeError, "Incorrect parameter type (%s)", RSTRING_PTR(typeName));
220
+ }
221
+ callbackParameters[callbackCount++] = rbType;
222
+ break;
223
+
214
224
  default:
215
225
  break;
216
226
  }
@@ -248,7 +258,7 @@ variadic_invoke(VALUE self, VALUE parameterTypes, VALUE parameterValues)
248
258
  }
249
259
 
250
260
  rbffi_SetupCallParams(paramCount, argv, -1, paramTypes, params,
251
- ffiValues, NULL, 0, invoker->rbEnums);
261
+ ffiValues, callbackParameters, callbackCount, invoker->rbEnums);
252
262
 
253
263
  rbffi_frame_push(&frame);
254
264
 
@@ -0,0 +1,100 @@
1
+ rbx.platform.typedef.*__caddr_t = char
2
+ rbx.platform.typedef.*__qaddr_t = long
3
+ rbx.platform.typedef.__blkcnt64_t = long
4
+ rbx.platform.typedef.__blkcnt_t = long
5
+ rbx.platform.typedef.__blksize_t = long
6
+ rbx.platform.typedef.__clock_t = long
7
+ rbx.platform.typedef.__clockid_t = int
8
+ rbx.platform.typedef.__daddr_t = int
9
+ rbx.platform.typedef.__dev_t = ulong
10
+ rbx.platform.typedef.__fd_mask = long
11
+ rbx.platform.typedef.__fsblkcnt64_t = ulong
12
+ rbx.platform.typedef.__fsblkcnt_t = ulong
13
+ rbx.platform.typedef.__fsfilcnt64_t = ulong
14
+ rbx.platform.typedef.__fsfilcnt_t = ulong
15
+ rbx.platform.typedef.__gid_t = uint
16
+ rbx.platform.typedef.__id_t = uint
17
+ rbx.platform.typedef.__ino64_t = ulong
18
+ rbx.platform.typedef.__ino_t = ulong
19
+ rbx.platform.typedef.__int16_t = short
20
+ rbx.platform.typedef.__int32_t = int
21
+ rbx.platform.typedef.__int64_t = long
22
+ rbx.platform.typedef.__int8_t = char
23
+ rbx.platform.typedef.__intptr_t = long
24
+ rbx.platform.typedef.__key_t = int
25
+ rbx.platform.typedef.__loff_t = long
26
+ rbx.platform.typedef.__mode_t = uint
27
+ rbx.platform.typedef.__nlink_t = ulong
28
+ rbx.platform.typedef.__off64_t = long
29
+ rbx.platform.typedef.__off_t = long
30
+ rbx.platform.typedef.__pid_t = int
31
+ rbx.platform.typedef.__priority_which_t = int
32
+ rbx.platform.typedef.__quad_t = long
33
+ rbx.platform.typedef.__rlim64_t = ulong
34
+ rbx.platform.typedef.__rlim_t = ulong
35
+ rbx.platform.typedef.__rlimit_resource_t = int
36
+ rbx.platform.typedef.__rusage_who_t = int
37
+ rbx.platform.typedef.__sig_atomic_t = int
38
+ rbx.platform.typedef.__socklen_t = uint
39
+ rbx.platform.typedef.__ssize_t = long
40
+ rbx.platform.typedef.__suseconds_t = long
41
+ rbx.platform.typedef.__swblk_t = long
42
+ rbx.platform.typedef.__time_t = long
43
+ rbx.platform.typedef.__timer_t = pointer
44
+ rbx.platform.typedef.__u_char = uchar
45
+ rbx.platform.typedef.__u_int = uint
46
+ rbx.platform.typedef.__u_long = ulong
47
+ rbx.platform.typedef.__u_quad_t = ulong
48
+ rbx.platform.typedef.__u_short = ushort
49
+ rbx.platform.typedef.__uid_t = uint
50
+ rbx.platform.typedef.__uint16_t = ushort
51
+ rbx.platform.typedef.__uint32_t = uint
52
+ rbx.platform.typedef.__uint64_t = ulong
53
+ rbx.platform.typedef.__uint8_t = uchar
54
+ rbx.platform.typedef.__useconds_t = uint
55
+ rbx.platform.typedef.blkcnt_t = long
56
+ rbx.platform.typedef.clockid_t = int
57
+ rbx.platform.typedef.daddr_t = int
58
+ rbx.platform.typedef.dev_t = ulong
59
+ rbx.platform.typedef.fd_mask = long
60
+ rbx.platform.typedef.fsblkcnt_t = ulong
61
+ rbx.platform.typedef.fsfilcnt_t = ulong
62
+ rbx.platform.typedef.gid_t = uint
63
+ rbx.platform.typedef.id_t = uint
64
+ rbx.platform.typedef.ino_t = ulong
65
+ rbx.platform.typedef.int16_t = short
66
+ rbx.platform.typedef.int32_t = int
67
+ rbx.platform.typedef.int64_t = long
68
+ rbx.platform.typedef.int8_t = char
69
+ rbx.platform.typedef.key_t = int
70
+ rbx.platform.typedef.loff_t = long
71
+ rbx.platform.typedef.mode_t = uint
72
+ rbx.platform.typedef.nlink_t = ulong
73
+ rbx.platform.typedef.off_t = long
74
+ rbx.platform.typedef.pid_t = int
75
+ rbx.platform.typedef.pthread_key_t = uint
76
+ rbx.platform.typedef.pthread_once_t = int
77
+ rbx.platform.typedef.pthread_t = ulong
78
+ rbx.platform.typedef.quad_t = long
79
+ rbx.platform.typedef.register_t = long
80
+ rbx.platform.typedef.rlim_t = ulong
81
+ rbx.platform.typedef.sa_family_t = ushort
82
+ rbx.platform.typedef.size_t = ulong
83
+ rbx.platform.typedef.socklen_t = uint
84
+ rbx.platform.typedef.ssize_t = long
85
+ rbx.platform.typedef.suseconds_t = long
86
+ rbx.platform.typedef.time_t = long
87
+ rbx.platform.typedef.timer_t = pointer
88
+ rbx.platform.typedef.u_char = uchar
89
+ rbx.platform.typedef.u_int = uint
90
+ rbx.platform.typedef.u_int16_t = ushort
91
+ rbx.platform.typedef.u_int32_t = uint
92
+ rbx.platform.typedef.u_int64_t = ulong
93
+ rbx.platform.typedef.u_int8_t = uchar
94
+ rbx.platform.typedef.u_long = ulong
95
+ rbx.platform.typedef.u_quad_t = ulong
96
+ rbx.platform.typedef.u_short = ushort
97
+ rbx.platform.typedef.uid_t = uint
98
+ rbx.platform.typedef.uint = uint
99
+ rbx.platform.typedef.ulong = ulong
100
+ rbx.platform.typedef.ushort = ushort
@@ -0,0 +1,104 @@
1
+ rbx.platform.typedef.*__caddr_t = char
2
+ rbx.platform.typedef.*__qaddr_t = long
3
+ rbx.platform.typedef.__blkcnt64_t = long
4
+ rbx.platform.typedef.__blkcnt_t = long
5
+ rbx.platform.typedef.__blksize_t = int
6
+ rbx.platform.typedef.__clock_t = long
7
+ rbx.platform.typedef.__clockid_t = int
8
+ rbx.platform.typedef.__daddr_t = int
9
+ rbx.platform.typedef.__dev_t = ulong
10
+ rbx.platform.typedef.__fd_mask = long
11
+ rbx.platform.typedef.__fsblkcnt64_t = ulong
12
+ rbx.platform.typedef.__fsblkcnt_t = ulong
13
+ rbx.platform.typedef.__fsfilcnt64_t = ulong
14
+ rbx.platform.typedef.__fsfilcnt_t = ulong
15
+ rbx.platform.typedef.__fsword_t = long
16
+ rbx.platform.typedef.__gid_t = uint
17
+ rbx.platform.typedef.__id_t = uint
18
+ rbx.platform.typedef.__ino64_t = ulong
19
+ rbx.platform.typedef.__ino_t = ulong
20
+ rbx.platform.typedef.__int16_t = short
21
+ rbx.platform.typedef.__int32_t = int
22
+ rbx.platform.typedef.__int64_t = long
23
+ rbx.platform.typedef.__int8_t = char
24
+ rbx.platform.typedef.__intptr_t = long
25
+ rbx.platform.typedef.__key_t = int
26
+ rbx.platform.typedef.__loff_t = long
27
+ rbx.platform.typedef.__mode_t = uint
28
+ rbx.platform.typedef.__nlink_t = uint
29
+ rbx.platform.typedef.__off64_t = long
30
+ rbx.platform.typedef.__off_t = long
31
+ rbx.platform.typedef.__pid_t = int
32
+ rbx.platform.typedef.__priority_which_t = int
33
+ rbx.platform.typedef.__quad_t = long
34
+ rbx.platform.typedef.__rlim64_t = ulong
35
+ rbx.platform.typedef.__rlim_t = ulong
36
+ rbx.platform.typedef.__rlimit_resource_t = int
37
+ rbx.platform.typedef.__rusage_who_t = int
38
+ rbx.platform.typedef.__sig_atomic_t = int
39
+ rbx.platform.typedef.__socklen_t = uint
40
+ rbx.platform.typedef.__ssize_t = long
41
+ rbx.platform.typedef.__suseconds_t = long
42
+ rbx.platform.typedef.__syscall_slong_t = long
43
+ rbx.platform.typedef.__syscall_ulong_t = ulong
44
+ rbx.platform.typedef.__time_t = long
45
+ rbx.platform.typedef.__timer_t = pointer
46
+ rbx.platform.typedef.__u_char = uchar
47
+ rbx.platform.typedef.__u_int = uint
48
+ rbx.platform.typedef.__u_long = ulong
49
+ rbx.platform.typedef.__u_quad_t = ulong
50
+ rbx.platform.typedef.__u_short = ushort
51
+ rbx.platform.typedef.__uid_t = uint
52
+ rbx.platform.typedef.__uint16_t = ushort
53
+ rbx.platform.typedef.__uint32_t = uint
54
+ rbx.platform.typedef.__uint64_t = ulong
55
+ rbx.platform.typedef.__uint8_t = uchar
56
+ rbx.platform.typedef.__useconds_t = uint
57
+ rbx.platform.typedef.blkcnt_t = long
58
+ rbx.platform.typedef.blksize_t = int
59
+ rbx.platform.typedef.clock_t = long
60
+ rbx.platform.typedef.clockid_t = int
61
+ rbx.platform.typedef.daddr_t = int
62
+ rbx.platform.typedef.dev_t = ulong
63
+ rbx.platform.typedef.fd_mask = long
64
+ rbx.platform.typedef.fsblkcnt_t = ulong
65
+ rbx.platform.typedef.fsfilcnt_t = ulong
66
+ rbx.platform.typedef.gid_t = uint
67
+ rbx.platform.typedef.id_t = uint
68
+ rbx.platform.typedef.ino_t = ulong
69
+ rbx.platform.typedef.int16_t = short
70
+ rbx.platform.typedef.int32_t = int
71
+ rbx.platform.typedef.int64_t = long
72
+ rbx.platform.typedef.int8_t = char
73
+ rbx.platform.typedef.key_t = int
74
+ rbx.platform.typedef.loff_t = long
75
+ rbx.platform.typedef.mode_t = uint
76
+ rbx.platform.typedef.nlink_t = uint
77
+ rbx.platform.typedef.off_t = long
78
+ rbx.platform.typedef.pid_t = int
79
+ rbx.platform.typedef.pthread_key_t = uint
80
+ rbx.platform.typedef.pthread_once_t = int
81
+ rbx.platform.typedef.pthread_t = ulong
82
+ rbx.platform.typedef.quad_t = long
83
+ rbx.platform.typedef.register_t = long
84
+ rbx.platform.typedef.rlim_t = ulong
85
+ rbx.platform.typedef.sa_family_t = ushort
86
+ rbx.platform.typedef.size_t = ulong
87
+ rbx.platform.typedef.socklen_t = uint
88
+ rbx.platform.typedef.ssize_t = long
89
+ rbx.platform.typedef.suseconds_t = long
90
+ rbx.platform.typedef.time_t = long
91
+ rbx.platform.typedef.timer_t = pointer
92
+ rbx.platform.typedef.u_char = uchar
93
+ rbx.platform.typedef.u_int = uint
94
+ rbx.platform.typedef.u_int16_t = ushort
95
+ rbx.platform.typedef.u_int32_t = uint
96
+ rbx.platform.typedef.u_int64_t = ulong
97
+ rbx.platform.typedef.u_int8_t = uchar
98
+ rbx.platform.typedef.u_long = ulong
99
+ rbx.platform.typedef.u_quad_t = ulong
100
+ rbx.platform.typedef.u_short = ushort
101
+ rbx.platform.typedef.uid_t = uint
102
+ rbx.platform.typedef.uint = uint
103
+ rbx.platform.typedef.ulong = ulong
104
+ rbx.platform.typedef.ushort = ushort
data/lib/ffi/variadic.rb CHANGED
@@ -32,15 +32,6 @@
32
32
 
33
33
  module FFI
34
34
  class VariadicInvoker
35
- def init(arg_types, type_map)
36
- @fixed = Array.new
37
- @type_map = type_map
38
- arg_types.each_with_index do |type, i|
39
- @fixed << type unless type == Type::VARARGS
40
- end
41
- end
42
-
43
-
44
35
  def call(*args, &block)
45
36
  param_types = Array.new(@fixed)
46
37
  param_values = Array.new
data/lib/ffi/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module FFI
2
- VERSION = '1.14.2'
2
+ VERSION = '1.15.0'
3
3
  end
@@ -0,0 +1,65 @@
1
+ require 'bundler'
2
+ require 'bundler/gem_helper'
3
+
4
+ class FfiGemHelper < Bundler::GemHelper
5
+ attr_accessor :cross_platforms
6
+
7
+ def install
8
+ super
9
+
10
+ task "release:guard_clean" => ["release:update_history"]
11
+
12
+ task "release:update_history" do
13
+ update_history
14
+ end
15
+
16
+ task "release:rubygem_push" => ["gem:windows", "gem:java"]
17
+ end
18
+
19
+ def hfile
20
+ "CHANGELOG.md"
21
+ end
22
+
23
+ def headline
24
+ '([^\w]*)(\d+\.\d+\.\d+(?:\.\w+)?)([^\w]+)([2Y][0Y][0-9Y][0-9Y]-[0-1M][0-9M]-[0-3D][0-9D])([^\w]*|$)'
25
+ end
26
+
27
+ def reldate
28
+ Time.now.strftime("%Y-%m-%d")
29
+ end
30
+
31
+ def update_history
32
+ hin = File.read(hfile)
33
+ hout = hin.sub(/#{headline}/) do
34
+ raise "#{hfile} isn't up-to-date for version #{version}" unless $2==version.to_s
35
+ $1 + $2 + $3 + reldate + $5
36
+ end
37
+ if hout != hin
38
+ Bundler.ui.confirm "Updating #{hfile} for release."
39
+ File.write(hfile, hout)
40
+ Rake::FileUtilsExt.sh "git", "commit", hfile, "-m", "Update release date in #{hfile}"
41
+ end
42
+ end
43
+
44
+ def tag_version
45
+ Bundler.ui.confirm "Tag release with annotation:"
46
+ m = File.read(hfile).match(/(?<annotation>#{headline}.*?)#{headline}/m) || raise("Unable to find release notes in #{hfile}")
47
+ Bundler.ui.info(m[:annotation].gsub(/^/, " "))
48
+ IO.popen(["git", "tag", "--file=-", version_tag], "w") do |fd|
49
+ fd.write m[:annotation]
50
+ end
51
+ yield if block_given?
52
+ rescue
53
+ Bundler.ui.error "Untagging #{version_tag} due to error."
54
+ sh_with_code "git tag -d #{version_tag}"
55
+ raise
56
+ end
57
+
58
+ def rubygem_push(path)
59
+ cross_platforms.each do |ruby_platform|
60
+ super(path.gsub(/\.gem\z/, "-#{ruby_platform}.gem"))
61
+ end
62
+ super(path.gsub(/\.gem\z/, "-java.gem"))
63
+ super(path)
64
+ end
65
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ffi
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.14.2
4
+ version: 1.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wayne Meissner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-21 00:00:00.000000000 Z
11
+ date: 2021-03-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -613,6 +613,8 @@ files:
613
613
  - lib/ffi/platform/powerpc-linux/types.conf
614
614
  - lib/ffi/platform/powerpc-openbsd/types.conf
615
615
  - lib/ffi/platform/powerpc64-linux/types.conf
616
+ - lib/ffi/platform/powerpc64le-linux/types.conf
617
+ - lib/ffi/platform/riscv64-linux/types.conf
616
618
  - lib/ffi/platform/s390-linux/types.conf
617
619
  - lib/ffi/platform/s390x-linux/types.conf
618
620
  - lib/ffi/platform/sparc-linux/types.conf
@@ -646,6 +648,7 @@ files:
646
648
  - lib/ffi/union.rb
647
649
  - lib/ffi/variadic.rb
648
650
  - lib/ffi/version.rb
651
+ - rakelib/ffi_gem_helper.rb
649
652
  - samples/getlogin.rb
650
653
  - samples/getpid.rb
651
654
  - samples/gettimeofday.rb
@@ -680,7 +683,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
680
683
  - !ruby/object:Gem::Version
681
684
  version: '0'
682
685
  requirements: []
683
- rubygems_version: 3.1.4
686
+ rubygems_version: 3.2.3
684
687
  signing_key:
685
688
  specification_version: 4
686
689
  summary: Ruby FFI