ffi 1.16.2 → 1.16.3
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +8 -0
- data/README.md +1 -1
- data/ext/ffi_c/AbstractMemory.c +4 -2
- data/ext/ffi_c/Call.c +6 -3
- data/ext/ffi_c/Function.c +4 -2
- data/ext/ffi_c/FunctionInfo.c +4 -2
- data/ext/ffi_c/Struct.c +7 -3
- data/ext/ffi_c/libffi/compile +9 -8
- data/lib/ffi/types.rb +2 -1
- data/lib/ffi/version.rb +1 -1
- data/samples/hello_ractor.rb +11 -0
- data/samples/qsort_ractor.rb +28 -0
- data.tar.gz.sig +0 -0
- metadata +4 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5920bab18c2bfca946febdf9d31aae894569dd1a293d816631a077696f7db8fa
|
4
|
+
data.tar.gz: 7aa17dd90399d15bd149573ab4b9857907028beae4f84409f76f50e9508aaba2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dd42730736988cac47f45485f4a8b200c26759066fe156a89ef7736cd6ac80f404e8aaced28a8f10f9b22b43436ed3e248cb191f1c457ccabc19299b91b49174
|
7
|
+
data.tar.gz: '0252969e7a324d530c1d704e2d408f1bd7283f320de90b4c98f20bb49f9d32733ac45609d78a40f821cd5335e102e80576fd446cd5de863babea041d0eb3c780'
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -15,7 +15,7 @@ using Ruby-FFI](https://github.com/ffi/ffi/wiki/why-use-ffi).
|
|
15
15
|
* C structs (also nested), enums and global variables
|
16
16
|
* Callbacks from C to Ruby
|
17
17
|
* Automatic garbage collection of native memory
|
18
|
-
* Usable in Ractor
|
18
|
+
* Usable in Ractor: [How-to-use-FFI-in-Ruby-Ractors](https://github.com/ffi/ffi/wiki/Ractors)
|
19
19
|
|
20
20
|
## Synopsis
|
21
21
|
|
data/ext/ffi_c/AbstractMemory.c
CHANGED
@@ -350,6 +350,7 @@ memory_get(VALUE self, VALUE type_name, VALUE offset)
|
|
350
350
|
AbstractMemory* ptr;
|
351
351
|
VALUE nType;
|
352
352
|
Type *type;
|
353
|
+
MemoryOp *op;
|
353
354
|
|
354
355
|
nType = rbffi_Type_Lookup(type_name);
|
355
356
|
if(NIL_P(nType)) goto undefined_type;
|
@@ -357,7 +358,7 @@ memory_get(VALUE self, VALUE type_name, VALUE offset)
|
|
357
358
|
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
|
358
359
|
TypedData_Get_Struct(nType, Type, &rbffi_type_data_type, type);
|
359
360
|
|
360
|
-
|
361
|
+
op = get_memory_op(type);
|
361
362
|
if(op == NULL) goto undefined_type;
|
362
363
|
|
363
364
|
return op->get(ptr, NUM2LONG(offset));
|
@@ -382,6 +383,7 @@ memory_put(VALUE self, VALUE type_name, VALUE offset, VALUE value)
|
|
382
383
|
AbstractMemory* ptr;
|
383
384
|
VALUE nType;
|
384
385
|
Type *type;
|
386
|
+
MemoryOp *op;
|
385
387
|
|
386
388
|
nType = rbffi_Type_Lookup(type_name);
|
387
389
|
if(NIL_P(nType)) goto undefined_type;
|
@@ -389,7 +391,7 @@ memory_put(VALUE self, VALUE type_name, VALUE offset, VALUE value)
|
|
389
391
|
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
|
390
392
|
TypedData_Get_Struct(nType, Type, &rbffi_type_data_type, type);
|
391
393
|
|
392
|
-
|
394
|
+
op = get_memory_op(type);
|
393
395
|
if(op == NULL) goto undefined_type;
|
394
396
|
|
395
397
|
op->put(ptr, NUM2LONG(offset), value);
|
data/ext/ffi_c/Call.c
CHANGED
@@ -427,8 +427,10 @@ getPointer(VALUE value, int type)
|
|
427
427
|
} else if (type == T_DATA && rb_obj_is_kind_of(value, rbffi_StructClass)) {
|
428
428
|
|
429
429
|
Struct* s;
|
430
|
+
AbstractMemory* memory;
|
431
|
+
|
430
432
|
TypedData_Get_Struct(value, Struct, &rbffi_struct_data_type, s);
|
431
|
-
|
433
|
+
memory = s->pointer;
|
432
434
|
return memory != NULL ? memory->address : NULL;
|
433
435
|
|
434
436
|
} else if (type == T_STRING) {
|
@@ -464,7 +466,9 @@ rbffi_GetInvoker(FunctionType *fnInfo)
|
|
464
466
|
static void*
|
465
467
|
callback_param(VALUE proc, VALUE cbInfo)
|
466
468
|
{
|
467
|
-
VALUE callback
|
469
|
+
VALUE callback;
|
470
|
+
AbstractMemory *mem;
|
471
|
+
|
468
472
|
if (unlikely(proc == Qnil)) {
|
469
473
|
return NULL ;
|
470
474
|
}
|
@@ -479,7 +483,6 @@ callback_param(VALUE proc, VALUE cbInfo)
|
|
479
483
|
callback = rbffi_Function_ForProc(cbInfo, proc);
|
480
484
|
RB_GC_GUARD(callback);
|
481
485
|
|
482
|
-
AbstractMemory *mem;
|
483
486
|
TypedData_Get_Struct(callback, AbstractMemory, &rbffi_abstract_memory_data_type, mem);
|
484
487
|
return mem->address;
|
485
488
|
}
|
data/ext/ffi_c/Function.c
CHANGED
@@ -953,10 +953,10 @@ invoke_callback(VALUE data)
|
|
953
953
|
|
954
954
|
} else if (rb_obj_is_kind_of(rbReturnValue, rb_cProc) || rb_respond_to(rbReturnValue, id_call)) {
|
955
955
|
VALUE function;
|
956
|
+
AbstractMemory* memory;
|
956
957
|
|
957
958
|
function = rbffi_Function_ForProc(rbReturnType, rbReturnValue);
|
958
959
|
|
959
|
-
AbstractMemory* memory;
|
960
960
|
TypedData_Get_Struct(function, AbstractMemory, &rbffi_abstract_memory_data_type, memory);
|
961
961
|
|
962
962
|
*((void **) retval) = memory->address;
|
@@ -968,8 +968,10 @@ invoke_callback(VALUE data)
|
|
968
968
|
case NATIVE_STRUCT:
|
969
969
|
if (TYPE(rbReturnValue) == T_DATA && rb_obj_is_kind_of(rbReturnValue, rbffi_StructClass)) {
|
970
970
|
Struct* s;
|
971
|
+
AbstractMemory* memory;
|
972
|
+
|
971
973
|
TypedData_Get_Struct(rbReturnValue, Struct, &rbffi_struct_data_type, s);
|
972
|
-
|
974
|
+
memory = s->pointer;
|
973
975
|
|
974
976
|
if (memory->address != NULL) {
|
975
977
|
memcpy(retval, memory->address, returnType->ffiType->size);
|
data/ext/ffi_c/FunctionInfo.c
CHANGED
@@ -97,7 +97,8 @@ fntype_mark(void *data)
|
|
97
97
|
rb_gc_mark_movable(fnInfo->rbParameterTypes);
|
98
98
|
rb_gc_mark_movable(fnInfo->rbEnums);
|
99
99
|
if (fnInfo->callbackCount > 0 && fnInfo->callbackParameters != NULL) {
|
100
|
-
|
100
|
+
size_t index;
|
101
|
+
for (index = 0; index < fnInfo->callbackCount; index++) {
|
101
102
|
rb_gc_mark_movable(fnInfo->callbackParameters[index]);
|
102
103
|
}
|
103
104
|
}
|
@@ -111,7 +112,8 @@ fntype_compact(void *data)
|
|
111
112
|
ffi_gc_location(fnInfo->rbParameterTypes);
|
112
113
|
ffi_gc_location(fnInfo->rbEnums);
|
113
114
|
if (fnInfo->callbackCount > 0 && fnInfo->callbackParameters != NULL) {
|
114
|
-
|
115
|
+
size_t index;
|
116
|
+
for (index = 0; index < fnInfo->callbackCount; index++) {
|
115
117
|
ffi_gc_location(fnInfo->callbackParameters[index]);
|
116
118
|
}
|
117
119
|
}
|
data/ext/ffi_c/Struct.c
CHANGED
@@ -189,9 +189,11 @@ struct_initialize_copy(VALUE self, VALUE other)
|
|
189
189
|
}
|
190
190
|
|
191
191
|
if (src->layout->referenceFieldCount > 0) {
|
192
|
+
size_t index;
|
193
|
+
|
192
194
|
dst->rbReferences = ALLOC_N(VALUE, dst->layout->referenceFieldCount);
|
193
195
|
memcpy(dst->rbReferences, src->rbReferences, dst->layout->referenceFieldCount * sizeof(VALUE));
|
194
|
-
for (
|
196
|
+
for ( index = 0; index < dst->layout->referenceFieldCount; index++) {
|
195
197
|
RB_OBJ_WRITTEN(self, Qundef, &dst->rbReferences[index]);
|
196
198
|
}
|
197
199
|
}
|
@@ -268,7 +270,8 @@ struct_mark(void *data)
|
|
268
270
|
rb_gc_mark_movable(s->rbPointer);
|
269
271
|
rb_gc_mark_movable(s->rbLayout);
|
270
272
|
if (s->rbReferences != NULL) {
|
271
|
-
|
273
|
+
size_t index;
|
274
|
+
for (index = 0; index < s->layout->referenceFieldCount; index++) {
|
272
275
|
rb_gc_mark_movable(s->rbReferences[index]);
|
273
276
|
}
|
274
277
|
}
|
@@ -281,7 +284,8 @@ struct_compact(void *data)
|
|
281
284
|
ffi_gc_location(s->rbPointer);
|
282
285
|
ffi_gc_location(s->rbLayout);
|
283
286
|
if (s->rbReferences != NULL) {
|
284
|
-
|
287
|
+
size_t index;
|
288
|
+
for (index = 0; index < s->layout->referenceFieldCount; index++) {
|
285
289
|
ffi_gc_location(s->rbReferences[index]);
|
286
290
|
}
|
287
291
|
}
|
data/ext/ffi_c/libffi/compile
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
#! /bin/sh
|
2
2
|
# Wrapper for compilers which do not understand '-c -o'.
|
3
3
|
|
4
|
-
scriptversion=
|
4
|
+
scriptversion=2018-03-07.03; # UTC
|
5
5
|
|
6
|
-
# Copyright (C) 1999-
|
6
|
+
# Copyright (C) 1999-2021 Free Software Foundation, Inc.
|
7
7
|
# Written by Tom Tromey <tromey@cygnus.com>.
|
8
8
|
#
|
9
9
|
# This program is free software; you can redistribute it and/or modify
|
@@ -17,7 +17,7 @@ scriptversion=2012-10-14.11; # UTC
|
|
17
17
|
# GNU General Public License for more details.
|
18
18
|
#
|
19
19
|
# You should have received a copy of the GNU General Public License
|
20
|
-
# along with this program. If not, see <
|
20
|
+
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
21
21
|
|
22
22
|
# As a special exception to the GNU General Public License, if you
|
23
23
|
# distribute this file as part of a program that contains a
|
@@ -53,7 +53,7 @@ func_file_conv ()
|
|
53
53
|
MINGW*)
|
54
54
|
file_conv=mingw
|
55
55
|
;;
|
56
|
-
CYGWIN*)
|
56
|
+
CYGWIN* | MSYS*)
|
57
57
|
file_conv=cygwin
|
58
58
|
;;
|
59
59
|
*)
|
@@ -67,7 +67,7 @@ func_file_conv ()
|
|
67
67
|
mingw/*)
|
68
68
|
file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
|
69
69
|
;;
|
70
|
-
cygwin/*)
|
70
|
+
cygwin/* | msys/*)
|
71
71
|
file=`cygpath -m "$file" || echo "$file"`
|
72
72
|
;;
|
73
73
|
wine/*)
|
@@ -255,7 +255,8 @@ EOF
|
|
255
255
|
echo "compile $scriptversion"
|
256
256
|
exit $?
|
257
257
|
;;
|
258
|
-
cl | *[/\\]cl | cl.exe | *[/\\]cl.exe
|
258
|
+
cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
|
259
|
+
icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
|
259
260
|
func_cl_wrapper "$@" # Doesn't return...
|
260
261
|
;;
|
261
262
|
esac
|
@@ -339,9 +340,9 @@ exit $ret
|
|
339
340
|
# Local Variables:
|
340
341
|
# mode: shell-script
|
341
342
|
# sh-indentation: 2
|
342
|
-
# eval: (add-hook '
|
343
|
+
# eval: (add-hook 'before-save-hook 'time-stamp)
|
343
344
|
# time-stamp-start: "scriptversion="
|
344
345
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
345
|
-
# time-stamp-time-zone: "
|
346
|
+
# time-stamp-time-zone: "UTC0"
|
346
347
|
# time-stamp-end: "; # UTC"
|
347
348
|
# End:
|
data/lib/ffi/types.rb
CHANGED
@@ -87,7 +87,8 @@ module FFI
|
|
87
87
|
TypeDefs[name]
|
88
88
|
|
89
89
|
elsif name.is_a?(DataConverter)
|
90
|
-
(type_map ||
|
90
|
+
tm = (type_map || custom_typedefs)
|
91
|
+
tm[name] = Type::Mapped.new(name)
|
91
92
|
else
|
92
93
|
raise TypeError, "unable to resolve type '#{name}'"
|
93
94
|
end
|
data/lib/ffi/version.rb
CHANGED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'ffi'
|
2
|
+
|
3
|
+
module LibC
|
4
|
+
extend FFI::Library
|
5
|
+
ffi_lib FFI::Library::LIBC
|
6
|
+
callback :qsort_cmp, [ :pointer, :pointer ], :int
|
7
|
+
attach_function :qsort, [ :pointer, :ulong, :ulong, :qsort_cmp ], :int
|
8
|
+
|
9
|
+
freeze # Freeze the module variables, so that it can be shared across ractors.
|
10
|
+
end
|
11
|
+
|
12
|
+
p = FFI::MemoryPointer.new(:int, 3)
|
13
|
+
p.put_array_of_int32(0, [ 2, 3, 1 ]) # Write some unsorted data into the memory
|
14
|
+
# Ractor.make_shareable(p) # freeze the pointer to be shared between ractors instead of copied
|
15
|
+
puts "main -ptr=#{p.inspect}"
|
16
|
+
res = Ractor.new(p) do |p|
|
17
|
+
puts "ractor-ptr=#{p.inspect}"
|
18
|
+
puts "Before qsort #{p.get_array_of_int32(0, 3).join(', ')}"
|
19
|
+
LibC.qsort(p, 3, 4) do |p1, p2|
|
20
|
+
i1 = p1.get_int32(0)
|
21
|
+
i2 = p2.get_int32(0)
|
22
|
+
puts "In block: comparing #{i1} and #{i2}"
|
23
|
+
i1 < i2 ? -1 : i1 > i2 ? 1 : 0
|
24
|
+
end
|
25
|
+
puts "After qsort #{p.get_array_of_int32(0, 3).join(', ')}"
|
26
|
+
end.take
|
27
|
+
|
28
|
+
puts "After ractor termination #{p.get_array_of_int32(0, 3).join(', ')}"
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ffi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.16.
|
4
|
+
version: 1.16.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Wayne Meissner
|
@@ -33,7 +33,7 @@ cert_chain:
|
|
33
33
|
Dzx/gFSOrRoCt2mXNgrmcAfr386AfaMvCh7cXqdxZwmVo7ILZCYXck0pajvubsDd
|
34
34
|
NUIIFkVXvd1odFyK9LF1RFAtxn/iAmpx
|
35
35
|
-----END CERTIFICATE-----
|
36
|
-
date: 2023-
|
36
|
+
date: 2023-10-04 00:00:00.000000000 Z
|
37
37
|
dependencies:
|
38
38
|
- !ruby/object:Gem::Dependency
|
39
39
|
name: rake
|
@@ -712,9 +712,11 @@ files:
|
|
712
712
|
- samples/getpid.rb
|
713
713
|
- samples/gettimeofday.rb
|
714
714
|
- samples/hello.rb
|
715
|
+
- samples/hello_ractor.rb
|
715
716
|
- samples/inotify.rb
|
716
717
|
- samples/pty.rb
|
717
718
|
- samples/qsort.rb
|
719
|
+
- samples/qsort_ractor.rb
|
718
720
|
homepage: https://github.com/ffi/ffi/wiki
|
719
721
|
licenses:
|
720
722
|
- BSD-3-Clause
|
metadata.gz.sig
CHANGED
Binary file
|