summaryrefslogtreecommitdiff
path: root/lib/ffi/variadic.rb
diff options
context:
space:
mode:
authorLars Kanis <lars@greiz-reinsdorf.de>2023-05-08 13:21:33 +0200
committerLars Kanis <lars@greiz-reinsdorf.de>2023-05-08 13:21:33 +0200
commitc6b7139d0394638ef51b451b81dcd2ffefb94160 (patch)
treef1513b0afc5ef798382100a53c3191ff52e66d3e /lib/ffi/variadic.rb
parentc1e6a14476e210efeac79aa260c2eb2d1d98a580 (diff)
parent938b5d8590361acf871fddb9149fe725f65d781f (diff)
downloadffi-c6b7139d0394638ef51b451b81dcd2ffefb94160.tar.gz
Merge branch 'ractor'
Diffstat (limited to 'lib/ffi/variadic.rb')
-rw-r--r--lib/ffi/variadic.rb27
1 files changed, 19 insertions, 8 deletions
diff --git a/lib/ffi/variadic.rb b/lib/ffi/variadic.rb
index 743ce7f..ee33409 100644
--- a/lib/ffi/variadic.rb
+++ b/lib/ffi/variadic.rb
@@ -54,16 +54,27 @@ module FFI
invoker = self
params = "*args"
call = "call"
- mod.module_eval <<-code
- @@#{mname} = invoker
- def self.#{mname}(#{params})
- @@#{mname}.#{call}(#{params})
- end
- def #{mname}(#{params})
- @@#{mname}.#{call}(#{params})
- end
+ mname = mname.to_sym
+ mod.module_eval <<-code, __FILE__, __LINE__
+ @ffi_functions = {} unless defined?(@ffi_functions)
+ @ffi_functions[#{mname.inspect}] = invoker
+
+ def self.#{mname}(#{params})
+ @ffi_functions[#{mname.inspect}].#{call}(#{params})
+ end
+
+ define_method(#{mname.inspect}, &method(#{mname.inspect}))
code
invoker
end
+
+ # Retrieve Array of parameter types
+ #
+ # This method returns an Array of FFI types accepted as function parameters.
+ #
+ # @return [Array<FFI::Type>]
+ def param_types
+ [*@fixed, Type::Builtin::VARARGS]
+ end
end
end