ffi 1.16.3 → 1.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +51 -0
  4. data/Gemfile +9 -2
  5. data/README.md +1 -1
  6. data/Rakefile +18 -6
  7. data/ext/ffi_c/AbstractMemory.c +39 -38
  8. data/ext/ffi_c/ArrayType.c +2 -2
  9. data/ext/ffi_c/Buffer.c +4 -4
  10. data/ext/ffi_c/Call.c +12 -6
  11. data/ext/ffi_c/Call.h +3 -2
  12. data/ext/ffi_c/DynamicLibrary.c +2 -2
  13. data/ext/ffi_c/Function.c +52 -34
  14. data/ext/ffi_c/FunctionInfo.c +1 -1
  15. data/ext/ffi_c/LastError.c +4 -4
  16. data/ext/ffi_c/MemoryPointer.c +2 -2
  17. data/ext/ffi_c/Pointer.c +14 -11
  18. data/ext/ffi_c/Struct.c +11 -4
  19. data/ext/ffi_c/StructLayout.c +13 -13
  20. data/ext/ffi_c/Type.c +17 -16
  21. data/ext/ffi_c/Types.c +7 -1
  22. data/ext/ffi_c/Types.h +0 -1
  23. data/ext/ffi_c/Variadic.c +6 -3
  24. data/ext/ffi_c/libffi/.allow-ai-service +0 -0
  25. data/ext/ffi_c/libffi/.github/workflows/build.yml +34 -15
  26. data/ext/ffi_c/libffi/.github/workflows/emscripten.yml +2 -1
  27. data/ext/ffi_c/libffi/LICENSE +1 -1
  28. data/ext/ffi_c/libffi/README.md +10 -5
  29. data/ext/ffi_c/libffi/configure +1254 -940
  30. data/ext/ffi_c/libffi/configure.ac +2 -2
  31. data/ext/ffi_c/libffi/configure.host +1 -1
  32. data/ext/ffi_c/libffi/doc/libffi.texi +1 -1
  33. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  34. data/ext/ffi_c/libffi/fficonfig.h.in +6 -6
  35. data/ext/ffi_c/libffi/include/ffi.h.in +2 -11
  36. data/ext/ffi_c/libffi/include/ffi_common.h +4 -2
  37. data/ext/ffi_c/libffi/libffi.map.in +5 -0
  38. data/ext/ffi_c/libffi/libtool-version +1 -1
  39. data/ext/ffi_c/libffi/ltmain.sh +8 -20
  40. data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h +1 -1
  41. data/ext/ffi_c/libffi/src/aarch64/ffi.c +26 -13
  42. data/ext/ffi_c/libffi/src/aarch64/sysv.S +198 -46
  43. data/ext/ffi_c/libffi/src/closures.c +3 -3
  44. data/ext/ffi_c/libffi/src/debug.c +2 -2
  45. data/ext/ffi_c/libffi/src/dlmalloc.c +1 -1
  46. data/ext/ffi_c/libffi/src/loongarch64/ffi.c +3 -0
  47. data/ext/ffi_c/libffi/src/mips/ffi.c +12 -4
  48. data/ext/ffi_c/libffi/src/mips/n32.S +65 -14
  49. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +36 -24
  50. data/ext/ffi_c/libffi/src/sparc/ffi64.c +7 -1
  51. data/ext/ffi_c/libffi/src/tramp.c +1 -1
  52. data/ext/ffi_c/libffi/src/types.c +4 -6
  53. data/ext/ffi_c/libffi/src/wasm32/ffi.c +13 -0
  54. data/ext/ffi_c/libffi/src/x86/ffiw64.c +1 -1
  55. data/ext/ffi_c/libffi/testsuite/Makefile.am +79 -127
  56. data/ext/ffi_c/libffi/testsuite/Makefile.in +79 -127
  57. data/ext/ffi_c/libffi/testsuite/emscripten/conftest.py +6 -0
  58. data/ext/ffi_c/libffi/testsuite/libffi.call/callback.c +99 -0
  59. data/ext/ffi_c/libffi/testsuite/libffi.call/callback2.c +108 -0
  60. data/ext/ffi_c/libffi/testsuite/libffi.call/callback3.c +114 -0
  61. data/ext/ffi_c/libffi/testsuite/libffi.call/callback4.c +119 -0
  62. data/ext/ffi_c/libffi.darwin.mk +2 -2
  63. data/lib/ffi/autopointer.rb +1 -9
  64. data/lib/ffi/dynamic_library.rb +34 -5
  65. data/lib/ffi/enum.rb +0 -1
  66. data/lib/ffi/ffi.rb +59 -0
  67. data/lib/ffi/function.rb +1 -1
  68. data/lib/ffi/io.rb +2 -2
  69. data/lib/ffi/library.rb +23 -23
  70. data/lib/ffi/platform/aarch64-linux/types.conf +74 -3
  71. data/lib/ffi/pointer.rb +6 -6
  72. data/lib/ffi/struct.rb +4 -4
  73. data/lib/ffi/struct_layout.rb +2 -2
  74. data/lib/ffi/struct_layout_builder.rb +8 -8
  75. data/lib/ffi/types.rb +51 -49
  76. data/lib/ffi/version.rb +1 -1
  77. data/sig/ffi/abstract_memory.rbs +165 -0
  78. data/sig/ffi/auto_pointer.rbs +26 -0
  79. data/sig/ffi/buffer.rbs +18 -0
  80. data/sig/ffi/data_converter.rbs +10 -0
  81. data/sig/ffi/dynamic_library.rbs +9 -0
  82. data/sig/ffi/enum.rbs +38 -0
  83. data/sig/ffi/function.rbs +39 -0
  84. data/sig/ffi/library.rbs +42 -0
  85. data/sig/ffi/native_type.rbs +86 -0
  86. data/sig/ffi/pointer.rbs +42 -0
  87. data/sig/ffi/struct.rbs +76 -0
  88. data/sig/ffi/struct_by_reference.rbs +11 -0
  89. data/sig/ffi/struct_by_value.rbs +7 -0
  90. data/sig/ffi/struct_layout.rbs +9 -0
  91. data/sig/ffi/struct_layout_builder.rbs +5 -0
  92. data/sig/ffi/type.rbs +39 -0
  93. data/sig/ffi.rbs +26 -0
  94. data.tar.gz.sig +0 -0
  95. metadata +37 -18
  96. metadata.gz.sig +0 -0
@@ -183,7 +183,7 @@ fntype_initialize(int argc, VALUE* argv, VALUE self)
183
183
  Check_Type(rbParamTypes, T_ARRAY);
184
184
 
185
185
  TypedData_Get_Struct(self, FunctionType, &rbffi_fntype_data_type, fnInfo);
186
- fnInfo->parameterCount = (int) RARRAY_LEN(rbParamTypes);
186
+ fnInfo->parameterCount = RARRAY_LENINT(rbParamTypes);
187
187
  fnInfo->parameterTypes = xcalloc(fnInfo->parameterCount, sizeof(*fnInfo->parameterTypes));
188
188
  fnInfo->ffiParameterTypes = xcalloc(fnInfo->parameterCount, sizeof(ffi_type *));
189
189
  fnInfo->nativeParameterTypes = xcalloc(fnInfo->parameterCount, sizeof(*fnInfo->nativeParameterTypes));
@@ -141,7 +141,7 @@ thread_data_get(void)
141
141
 
142
142
  /*
143
143
  * call-seq: error
144
- * @return [Numeric]
144
+ * @return [Integer]
145
145
  * Get +errno+ value.
146
146
  */
147
147
  static VALUE
@@ -153,7 +153,7 @@ get_last_error(VALUE self)
153
153
  #if defined(_WIN32) || defined(__CYGWIN__)
154
154
  /*
155
155
  * call-seq: winapi_error
156
- * @return [Numeric]
156
+ * @return [Integer]
157
157
  * Get +GetLastError()+ value. Only Windows or Cygwin.
158
158
  */
159
159
  static VALUE
@@ -166,7 +166,7 @@ get_last_winapi_error(VALUE self)
166
166
 
167
167
  /*
168
168
  * call-seq: error(error)
169
- * @param [Numeric] error
169
+ * @param [Integer] error
170
170
  * @return [nil]
171
171
  * Set +errno+ value.
172
172
  */
@@ -185,7 +185,7 @@ set_last_error(VALUE self, VALUE error)
185
185
  #if defined(_WIN32) || defined(__CYGWIN__)
186
186
  /*
187
187
  * call-seq: error(error)
188
- * @param [Numeric] error
188
+ * @param [Integer] error
189
189
  * @return [nil]
190
190
  * Set +GetLastError()+ value. Only on Windows and Cygwin.
191
191
  */
@@ -80,8 +80,8 @@ memptr_allocate(VALUE klass)
80
80
 
81
81
  /*
82
82
  * call-seq: initialize(size, count=1, clear=true)
83
- * @param [Fixnum, Bignum, Symbol, FFI::Type] size size of a memory cell (in bytes, or type whom size will be used)
84
- * @param [Numeric] count number of cells in memory
83
+ * @param [Integer, Symbol, FFI::Type] size size of a memory cell (in bytes, or type whom size will be used)
84
+ * @param [Integer] count number of cells in memory
85
85
  * @param [Boolean] clear set memory to all-zero if +true+
86
86
  * @return [self]
87
87
  * A new instance of FFI::MemoryPointer.
data/ext/ffi_c/Pointer.c CHANGED
@@ -95,12 +95,10 @@ ptr_allocate(VALUE klass)
95
95
  }
96
96
 
97
97
  /*
98
- * @overload initialize(pointer)
99
- * @param [Pointer] pointer another pointer to initialize from
100
- * Create a new pointer from another {Pointer}.
98
+ * @overload initialize(address)
101
99
  * @overload initialize(type, address)
102
- * @param [Type] type type for pointer
103
- * @param [Integer] address base address for pointer
100
+ * @param [Type] type Optional type for pointer (defaults to byte)
101
+ * @param [Pointer, Integer] address base address for pointer
104
102
  * Create a new pointer from a {Type} and a base address
105
103
  * @return [self]
106
104
  * A new instance of Pointer.
@@ -229,7 +227,7 @@ slice(VALUE self, long offset, long size)
229
227
  /*
230
228
  * Document-method: +
231
229
  * call-seq: ptr + offset
232
- * @param [Numeric] offset
230
+ * @param [Integer] offset
233
231
  * @return [Pointer]
234
232
  * Return a new {Pointer} from an existing pointer and an +offset+.
235
233
  */
@@ -246,8 +244,8 @@ ptr_plus(VALUE self, VALUE offset)
246
244
 
247
245
  /*
248
246
  * call-seq: ptr.slice(offset, length)
249
- * @param [Numeric] offset
250
- * @param [Numeric] length
247
+ * @param [Integer] offset
248
+ * @param [Integer] length
251
249
  * @return [Pointer]
252
250
  * Return a new {Pointer} from an existing one. This pointer points on same contents
253
251
  * from +offset+ for a length +length+.
@@ -314,12 +312,17 @@ ptr_equals(VALUE self, VALUE other)
314
312
  return ptr->memory.address == NULL ? Qtrue : Qfalse;
315
313
  }
316
314
 
317
- return ptr->memory.address == POINTER(other)->address ? Qtrue : Qfalse;
315
+ if (!rb_obj_is_kind_of(other, rbffi_PointerClass)) {
316
+ return Qfalse;
317
+ }
318
+ else {
319
+ return ptr->memory.address == POINTER(other)->address ? Qtrue : Qfalse;
320
+ }
318
321
  }
319
322
 
320
323
  /*
321
324
  * call-seq: ptr.address
322
- * @return [Numeric] pointer's base address
325
+ * @return [Integer] pointer's base address
323
326
  * Return +self+'s base address (alias: #to_i).
324
327
  */
325
328
  static VALUE
@@ -440,7 +443,7 @@ ptr_autorelease(VALUE self, VALUE autorelease)
440
443
 
441
444
  rb_check_frozen(self);
442
445
  TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, ptr);
443
- ptr->autorelease = autorelease == Qtrue;
446
+ ptr->autorelease = RB_TEST(autorelease);
444
447
 
445
448
  return autorelease;
446
449
  }
data/ext/ffi_c/Struct.c CHANGED
@@ -91,6 +91,7 @@ VALUE rbffi_StructLayoutCharArrayClass = Qnil;
91
91
 
92
92
  static ID id_pointer_ivar = 0, id_layout_ivar = 0;
93
93
  static ID id_get = 0, id_put = 0, id_to_ptr = 0, id_to_s = 0, id_layout = 0;
94
+ static ID id_initialize = 0;
94
95
 
95
96
  static inline char*
96
97
  memory_address(VALUE self)
@@ -114,6 +115,7 @@ struct_allocate(VALUE klass)
114
115
 
115
116
  /*
116
117
  * call-seq: initialize
118
+ * @overload initialize
117
119
  * @overload initialize(pointer, *args)
118
120
  * @param [AbstractMemory] pointer
119
121
  * @param [Array] args
@@ -616,7 +618,7 @@ inline_array_initialize(VALUE self, VALUE rbMemory, VALUE rbField)
616
618
 
617
619
  /*
618
620
  * call-seq: size
619
- * @return [Numeric]
621
+ * @return [Integer]
620
622
  * Get size
621
623
  */
622
624
  static VALUE
@@ -641,7 +643,7 @@ inline_array_offset(InlineArray* array, int index)
641
643
 
642
644
  /*
643
645
  * call-seq: [](index)
644
- * @param [Numeric] index
646
+ * @param [Integer] index
645
647
  * @return [Type, Struct]
646
648
  */
647
649
  static VALUE
@@ -665,8 +667,12 @@ inline_array_aref(VALUE self, VALUE rbIndex)
665
667
  VALUE rbOffset = INT2NUM(inline_array_offset(array, NUM2INT(rbIndex)));
666
668
  VALUE rbLength = INT2NUM(array->componentType->ffiType->size);
667
669
  VALUE rbPointer = rb_funcall(array->rbMemory, rb_intern("slice"), 2, rbOffset, rbLength);
670
+ VALUE obj;
668
671
 
669
- return rb_class_new_instance(1, &rbPointer, ((StructByValue *) array->componentType)->rbStructClass);
672
+ /* We avoid rb_class_new_instance here, to avoid passing the method block */
673
+ obj = rb_obj_alloc(((StructByValue *) array->componentType)->rbStructClass);
674
+ rb_funcallv(obj, id_initialize, 1, &rbPointer);
675
+ return obj;
670
676
  } else {
671
677
 
672
678
  rb_raise(rb_eArgError, "get not supported for %s", rb_obj_classname(array->arrayType->rbComponentType));
@@ -676,7 +682,7 @@ inline_array_aref(VALUE self, VALUE rbIndex)
676
682
 
677
683
  /*
678
684
  * call-seq: []=(index, value)
679
- * @param [Numeric] index
685
+ * @param [Integer] index
680
686
  * @param [Type, Struct]
681
687
  * @return [value]
682
688
  */
@@ -893,5 +899,6 @@ rbffi_Struct_Init(VALUE moduleFFI)
893
899
  id_put = rb_intern("put");
894
900
  id_to_ptr = rb_intern("to_ptr");
895
901
  id_to_s = rb_intern("to_s");
902
+ id_initialize = rb_intern("initialize");
896
903
  }
897
904
 
@@ -132,7 +132,7 @@ struct_field_memsize(const void *data)
132
132
  /*
133
133
  * call-seq: initialize(name, offset, type)
134
134
  * @param [String,Symbol] name
135
- * @param [Fixnum] offset
135
+ * @param [Integer] offset
136
136
  * @param [FFI::Type] type
137
137
  * @return [self]
138
138
  * A new FFI::StructLayout::Field instance.
@@ -188,7 +188,7 @@ struct_field_initialize(int argc, VALUE* argv, VALUE self)
188
188
 
189
189
  /*
190
190
  * call-seq: offset
191
- * @return [Numeric]
191
+ * @return [Integer]
192
192
  * Get the field offset.
193
193
  */
194
194
  static VALUE
@@ -201,7 +201,7 @@ struct_field_offset(VALUE self)
201
201
 
202
202
  /*
203
203
  * call-seq: size
204
- * @return [Numeric]
204
+ * @return [Integer]
205
205
  * Get the field size.
206
206
  */
207
207
  static VALUE
@@ -214,7 +214,7 @@ struct_field_size(VALUE self)
214
214
 
215
215
  /*
216
216
  * call-seq: alignment
217
- * @return [Numeric]
217
+ * @return [Integer]
218
218
  * Get the field alignment.
219
219
  */
220
220
  static VALUE
@@ -460,9 +460,9 @@ struct_layout_allocate(VALUE klass)
460
460
  VALUE obj;
461
461
 
462
462
  obj = TypedData_Make_Struct(klass, StructLayout, &rbffi_struct_layout_data_type, layout);
463
- layout->rbFieldMap = Qnil;
464
- layout->rbFieldNames = Qnil;
465
- layout->rbFields = Qnil;
463
+ RB_OBJ_WRITE(obj, &layout->rbFieldMap, Qnil);
464
+ RB_OBJ_WRITE(obj, &layout->rbFieldNames, Qnil);
465
+ RB_OBJ_WRITE(obj, &layout->rbFields, Qnil);
466
466
  layout->base.ffiType = xcalloc(1, sizeof(*layout->base.ffiType));
467
467
  layout->base.ffiType->size = 0;
468
468
  layout->base.ffiType->alignment = 0;
@@ -474,8 +474,8 @@ struct_layout_allocate(VALUE klass)
474
474
  /*
475
475
  * call-seq: initialize(fields, size, align)
476
476
  * @param [Array<StructLayout::Field>] fields
477
- * @param [Numeric] size
478
- * @param [Numeric] align
477
+ * @param [Integer] size
478
+ * @param [Integer] align
479
479
  * @return [self]
480
480
  * A new StructLayout instance.
481
481
  */
@@ -487,14 +487,14 @@ struct_layout_initialize(VALUE self, VALUE fields, VALUE size, VALUE align)
487
487
  int i;
488
488
 
489
489
  TypedData_Get_Struct(self, StructLayout, &rbffi_struct_layout_data_type, layout);
490
- layout->fieldCount = (int) RARRAY_LEN(fields);
491
- layout->rbFieldMap = rb_hash_new();
492
- layout->rbFieldNames = rb_ary_new2(layout->fieldCount);
490
+ layout->fieldCount = RARRAY_LENINT(fields);
491
+ RB_OBJ_WRITE(self, &layout->rbFieldMap, rb_hash_new());
492
+ RB_OBJ_WRITE(self, &layout->rbFieldNames, rb_ary_new2(layout->fieldCount));
493
493
  layout->size = (int) FFI_ALIGN(NUM2INT(size), NUM2INT(align));
494
494
  layout->align = NUM2INT(align);
495
495
  layout->fields = xcalloc(layout->fieldCount, sizeof(StructField *));
496
496
  layout->ffiTypes = xcalloc(layout->fieldCount + 1, sizeof(ffi_type *));
497
- layout->rbFields = rb_ary_new2(layout->fieldCount);
497
+ RB_OBJ_WRITE(self, &layout->rbFields, rb_ary_new2(layout->fieldCount));
498
498
  layout->referenceFieldCount = 0;
499
499
  layout->base.ffiType->elements = layout->ffiTypes;
500
500
  layout->base.ffiType->size = layout->size;
data/ext/ffi_c/Type.c CHANGED
@@ -107,7 +107,7 @@ type_allocate(VALUE klass)
107
107
  /*
108
108
  * Document-method: initialize
109
109
  * call-seq: initialize(value)
110
- * @param [Fixnum,Type] value
110
+ * @param [Integer,Type] value
111
111
  * @return [self]
112
112
  */
113
113
  static VALUE
@@ -135,7 +135,7 @@ type_initialize(VALUE self, VALUE value)
135
135
 
136
136
  /*
137
137
  * call-seq: type.size
138
- * @return [Fixnum]
138
+ * @return [Integer]
139
139
  * Return type's size, in bytes.
140
140
  */
141
141
  static VALUE
@@ -150,7 +150,7 @@ type_size(VALUE self)
150
150
 
151
151
  /*
152
152
  * call-seq: type.alignment
153
- * @return [Fixnum]
153
+ * @return [Integer]
154
154
  * Get Type alignment.
155
155
  */
156
156
  static VALUE
@@ -333,10 +333,10 @@ rbffi_Type_Init(VALUE moduleFFI)
333
333
  classBuiltinType = rb_define_class_under(rbffi_TypeClass, "Builtin", rbffi_TypeClass);
334
334
  /*
335
335
  * Document-module: FFI::NativeType
336
- * This module defines constants for native (C) types.
336
+ * This module defines constants for C native types.
337
337
  *
338
338
  * ==Native type constants
339
- * Native types are defined by constants :
339
+ * Native types are defined by constants and aliases:
340
340
  * * INT8, SCHAR, CHAR
341
341
  * * UINT8, UCHAR
342
342
  * * INT16, SHORT, SSHORT
@@ -349,24 +349,25 @@ rbffi_Type_Init(VALUE moduleFFI)
349
349
  * * ULONG
350
350
  * * FLOAT32, FLOAT
351
351
  * * FLOAT64, DOUBLE
352
+ * * LONGDOUBLE (if the native platform has `long double`)
352
353
  * * POINTER
353
- * * CALLBACK
354
- * * FUNCTION
355
- * * CHAR_ARRAY
356
354
  * * BOOL
357
- * * STRING (immutable string, nul terminated)
358
- * * STRUCT (struct-b-value param or result)
359
- * * ARRAY (array type definition)
360
- * * MAPPED (custom native type)
361
- * For function return type only :
355
+ * * STRING (immutable string, null terminated)
356
+ * For function return type only:
362
357
  * * VOID
363
- * For function argument type only :
358
+ * For function argument type only:
364
359
  * * BUFFER_IN
365
360
  * * BUFFER_OUT
361
+ * * BUFFER_INOUT
366
362
  * * VARARGS (function takes a variable number of arguments)
367
363
  *
368
- * All these constants are exported to {FFI} module prefixed with "TYPE_".
369
- * They are objets from {FFI::Type::Builtin} class.
364
+ * They are objects of the class {FFI::Type::Builtin}.
365
+ *
366
+ * Non-alias (the first name in each bullet point) constants are also exported to modules +FFI::NativeType+ and (prefixed with +TYPE_+) {FFI}.
367
+ * All constants and aliases above are exported to the {FFI::Type} class, as well as the following aliases:
368
+ * * Array ({FFI::ArrayType})
369
+ * * Function ({FFI::FunctionType})
370
+ * * Struct ({FFI::StructByValue})
370
371
  */
371
372
  moduleNativeType = rb_define_module_under(moduleFFI, "NativeType");
372
373
 
data/ext/ffi_c/Types.c CHANGED
@@ -41,6 +41,7 @@
41
41
  #include "LongDouble.h"
42
42
 
43
43
  static ID id_from_native = 0;
44
+ static ID id_initialize = 0;
44
45
 
45
46
 
46
47
  VALUE
@@ -95,6 +96,7 @@ rbffi_NativeValue_ToRuby(Type* type, VALUE rbType, const void* ptr)
95
96
  case NATIVE_STRUCT: {
96
97
  StructByValue* sbv = (StructByValue *)type;
97
98
  AbstractMemory* mem;
99
+ VALUE obj;
98
100
  VALUE rbMemory = rbffi_MemoryPointer_NewInstance(1, sbv->base.ffiType->size, false);
99
101
 
100
102
  TypedData_Get_Struct(rbMemory, AbstractMemory, &rbffi_abstract_memory_data_type, mem);
@@ -102,7 +104,10 @@ rbffi_NativeValue_ToRuby(Type* type, VALUE rbType, const void* ptr)
102
104
  RB_GC_GUARD(rbMemory);
103
105
  RB_GC_GUARD(rbType);
104
106
 
105
- return rb_class_new_instance(1, &rbMemory, sbv->rbStructClass);
107
+ /* We avoid rb_class_new_instance here, to avoid passing the method block */
108
+ obj = rb_obj_alloc(sbv->rbStructClass);
109
+ rb_funcallv(obj, id_initialize, 1, &rbMemory);
110
+ return obj;
106
111
  }
107
112
 
108
113
  case NATIVE_MAPPED: {
@@ -134,5 +139,6 @@ void
134
139
  rbffi_Types_Init(VALUE moduleFFI)
135
140
  {
136
141
  id_from_native = rb_intern("from_native");
142
+ id_initialize = rb_intern("initialize");
137
143
  }
138
144
 
data/ext/ffi_c/Types.h CHANGED
@@ -55,7 +55,6 @@ typedef enum {
55
55
  NATIVE_BUFFER_IN,
56
56
  NATIVE_BUFFER_OUT,
57
57
  NATIVE_BUFFER_INOUT,
58
- NATIVE_CHAR_ARRAY,
59
58
  NATIVE_BOOL,
60
59
 
61
60
  /** An immutable string. Nul terminated, but only copies in to the native function */
data/ext/ffi_c/Variadic.c CHANGED
@@ -202,6 +202,7 @@ variadic_invoke(VALUE self, VALUE parameterTypes, VALUE parameterValues)
202
202
  Type** paramTypes;
203
203
  VALUE* argv;
204
204
  VALUE* callbackParameters;
205
+ VALUE callbackProc;
205
206
  int paramCount = 0, fixedCount = 0, callbackCount = 0, i;
206
207
  ffi_status ffiStatus;
207
208
  rbffi_frame_t frame = { 0 };
@@ -210,7 +211,7 @@ variadic_invoke(VALUE self, VALUE parameterTypes, VALUE parameterValues)
210
211
  Check_Type(parameterValues, T_ARRAY);
211
212
 
212
213
  TypedData_Get_Struct(self, VariadicInvoker, &variadic_data_type, invoker);
213
- paramCount = (int) RARRAY_LEN(parameterTypes);
214
+ paramCount = RARRAY_LENINT(parameterTypes);
214
215
  paramTypes = ALLOCA_N(Type *, paramCount);
215
216
  ffiParamTypes = ALLOCA_N(ffi_type *, paramCount);
216
217
  params = ALLOCA_N(FFIStorage, paramCount);
@@ -290,8 +291,9 @@ variadic_invoke(VALUE self, VALUE parameterTypes, VALUE parameterValues)
290
291
  rb_raise(rb_eArgError, "Unknown FFI error");
291
292
  }
292
293
 
293
- rbffi_SetupCallParams(paramCount, argv, -1, paramTypes, params,
294
- ffiValues, callbackParameters, callbackCount, invoker->rbEnums);
294
+ callbackProc = rbffi_SetupCallParams(paramCount, argv, -1, paramTypes, params,
295
+ ffiValues, callbackParameters, callbackCount,
296
+ invoker->rbEnums);
295
297
 
296
298
  rbffi_frame_push(&frame);
297
299
 
@@ -309,6 +311,7 @@ variadic_invoke(VALUE self, VALUE parameterTypes, VALUE parameterValues)
309
311
  } else {
310
312
  ffi_call(&cif, FFI_FN(invoker->function), retval, ffiValues);
311
313
  }
314
+ RB_GC_GUARD(callbackProc);
312
315
 
313
316
  rbffi_frame_pop(&frame);
314
317
 
File without changes
@@ -14,6 +14,30 @@ on:
14
14
  # A workflow run is made up of one or more jobs that can run sequentially or in parallel
15
15
  jobs:
16
16
 
17
+ build-warp:
18
+ name: ${{ matrix.HOST }} ${{ matrix.CONFIGURE_OPTIONS }} ${{ matrix.MEVAL }} ${{ matrix.LIBFFI_TEST_OPTIMIZATION }}
19
+ runs-on: warp-ubuntu-latest-arm64-2x
20
+
21
+ strategy:
22
+ fail-fast: false
23
+ matrix:
24
+ include:
25
+ - HOST: "aarch64-linux-gnu"
26
+
27
+ steps:
28
+ - uses: actions/checkout@v3
29
+
30
+ - env:
31
+ MEVAL: ${{ matrix.MEVAL }}
32
+ HOST: ${{ matrix.HOST }}
33
+ LDFLAGS: ${{ matrix.LDFLAGS }}
34
+ RUNTESTFLAGS: ${{ matrix.RUNTESTFLAGS }}
35
+ CONFIGURE_OPTIONS: ${{ matrix.CONFIGURE_OPTIONS }}
36
+ run: |
37
+ if test x"$MEVAL" != x; then eval ${MEVAL}; fi
38
+ ./.ci/install.sh
39
+ ./.ci/build.sh
40
+
17
41
  build-sim:
18
42
  name: ${{ matrix.HOST }} ${{ matrix.CONFIGURE_OPTIONS }} ${{ matrix.MEVAL }} ${{ matrix.LIBFFI_TEST_OPTIMIZATION }}
19
43
  runs-on: ubuntu-latest
@@ -89,57 +113,52 @@ jobs:
89
113
  fail-fast: false
90
114
  matrix:
91
115
  include:
92
- - CFARM_HOST: gcc117.fsffrance.org
116
+ - CFARM_HOST: cfarm185.cfarm.net
93
117
  CFARM_PORT: 22
94
118
  CFARM_TRIPLE: aarch64-linux-gnu
95
119
  CFARM_CC: "gcc"
96
120
  CFARM_CXX: "g++"
97
- - CFARM_HOST: gcc117.fsffrance.org
98
- CFARM_PORT: 22
99
- CFARM_TRIPLE: aarch64-linux-gnu
100
- CFARM_CC: "/home/green/gcc12/bin/gcc"
101
- CFARM_CXX: "/home/green/gcc12/bin/g++"
102
- - CFARM_HOST: gcc117.fsffrance.org
121
+ - CFARM_HOST: cfarm185.fsffrance.org
103
122
  CFARM_PORT: 22
104
123
  CFARM_TRIPLE: aarch64-lto-linux-gnu
105
124
  CFARM_CC: "gcc -flto"
106
125
  CFARM_CXX: "g++ -flto"
107
- - CFARM_HOST: gcc400.fsffrance.org
126
+ - CFARM_HOST: cfarm400.cfarm.net
108
127
  CFARM_PORT: 25465
109
128
  CFARM_TRIPLE: loongarch64-linux-gnu
110
129
  CFARM_CC: "gcc"
111
130
  CFARM_CXX: "g++"
112
- - CFARM_HOST: gcc230.fsffrance.org
131
+ - CFARM_HOST: cfarm230.cfarm.net
113
132
  CFARM_PORT: 22
114
133
  CFARM_TRIPLE: mips-linux-gnu
115
134
  CFARM_CC: "gcc"
116
135
  CFARM_CXX: "g++"
117
- - CFARM_HOST: gcc102.fsffrance.org
136
+ - CFARM_HOST: cfarm211.cfarm.net
118
137
  CFARM_PORT: 22
119
138
  CFARM_TRIPLE: sparc64-linux-gnu
120
139
  CFARM_CC: "gcc"
121
140
  CFARM_CXX: "g++"
122
- - CFARM_HOST: gcc102.fsffrance.org
141
+ - CFARM_HOST: cfarm211.cfarm.net
123
142
  CFARM_PORT: 22
124
143
  CFARM_TRIPLE: sparc64-linux-gnu
125
144
  CFARM_CC: "gcc -m32"
126
145
  CFARM_CXX: "g++ -m32"
127
- - CFARM_HOST: gcc91.fsffrance.org
146
+ - CFARM_HOST: cfarm91.cfarm.net
128
147
  CFARM_PORT: 22
129
148
  CFARM_TRIPLE: riscv64-linux-gnu
130
149
  CFARM_CC: "gcc"
131
150
  CFARM_CXX: "g++"
132
- - CFARM_HOST: gcc103.fsffrance.org
151
+ - CFARM_HOST: cfarm103.cfarm.net
133
152
  CFARM_PORT: 22
134
153
  CFARM_TRIPLE: aarch64-m1-linux-gnu
135
154
  CFARM_CC: "gcc"
136
155
  CFARM_CXX: "g++"
137
- - CFARM_HOST: gcc112.fsffrance.org
156
+ - CFARM_HOST: cfarm112.cfarm.net
138
157
  CFARM_PORT: 22
139
158
  CFARM_TRIPLE: powerpc64le-linux-gnu
140
159
  CFARM_CC: "gcc"
141
160
  CFARM_CXX: "g++"
142
- - CFARM_HOST: gcc111.fsffrance.org
161
+ - CFARM_HOST: cfarm111.cfarm.net
143
162
  CFARM_PORT: 22
144
163
  CFARM_TRIPLE: powerpc-ibm-aix7.1.5.0
145
164
  CFARM_CC: "gcc"
@@ -129,7 +129,8 @@ jobs:
129
129
  strategy:
130
130
  matrix:
131
131
  bigint: ["--wasm-bigint", ""]
132
- browser: ["firefox", "chrome"]
132
+ browser: ["chrome"]
133
+ # FIXME: selenium can't find gecko driver for "firefox"
133
134
  runs-on: ubuntu-22.04
134
135
  needs: [build]
135
136
  steps:
@@ -1,4 +1,4 @@
1
- libffi - Copyright (c) 1996-2022 Anthony Green, Red Hat, Inc and others.
1
+ libffi - Copyright (c) 1996-2024 Anthony Green, Red Hat, Inc and others.
2
2
  See source files for details.
3
3
 
4
4
  Permission is hereby granted, free of charge, to any person obtaining
@@ -1,7 +1,7 @@
1
1
  Status
2
2
  ======
3
3
 
4
- libffi-3.4.4 was released on October 23, 2022. Check the libffi web
4
+ libffi-3.4.6 was released on February 18, 2024. Check the libffi web
5
5
  page for updates: <URL:http://sourceware.org/libffi/>.
6
6
 
7
7
 
@@ -158,7 +158,7 @@ It's also possible to build libffi on Windows platforms with
158
158
  Microsoft's Visual C++ compiler. In this case, use the msvcc.sh
159
159
  wrapper script during configuration like so:
160
160
 
161
- path/to/configure CC=path/to/msvcc.sh CXX=path/to/msvcc.sh LD=link CPP="cl -nologo -EP" CPPFLAGS="-DFFI_BUILDING_DLL"
161
+ path/to/configure CC=path/to/msvcc.sh CXX=path/to/msvcc.sh LD=link CPP="cl -nologo -EP" CXXCPP="cl -nologo -EP" CPPFLAGS="-DFFI_BUILDING_DLL"
162
162
 
163
163
  For 64-bit Windows builds, use ``CC="path/to/msvcc.sh -m64"`` and
164
164
  ``CXX="path/to/msvcc.sh -m64"``. You may also need to specify
@@ -201,11 +201,16 @@ History
201
201
 
202
202
  See the git log for details at http://github.com/libffi/libffi.
203
203
 
204
- TBD - TBD
204
+ 3.4.6 Feb-18-2024
205
+ Fix long double regression on mips64 and alpha.
206
+
207
+ 3.4.5 Feb-15-2024
205
208
  Add support for wasm32.
206
- Add support for HPPA64, and many HPPA fixes.
209
+ Add support for aarch64 branch target identification (bti).
207
210
  Add support for ARCv3: ARC32 & ARC64.
208
- Many x86 Darwin fixes.
211
+ Add support for HPPA64, and many HPPA fixes.
212
+ Add support for Haikuos on PowerPC.
213
+ Fixes for AIX, loongson, MIPS, power, sparc64, and x86 Darwin.
209
214
 
210
215
  3.4.4 Oct-23-2022
211
216
  Important aarch64 fixes, including support for linux builds