def self.create_invoker(lib, name, args, ret, options = { :convention => :default })
raise SignatureError, 'FFI functions may take max 32 arguments!' if args.size > 32
library = if lib.kind_of?(DynamicLibrary)
lib
elsif lib.kind_of?(String)
DynamicLibrary.open(FFI.map_library_name(lib), DynamicLibrary::RTLD_LAZY)
elsif lib.nil?
FFI::Library::DEFAULT
else
raise LoadError, "Invalid library '#{lib}'"
end
function = library.find_symbol(name)
raise NotFoundError.new(name, library.name) unless function
args = args.map {|e| find_type(e) }
if args.length > 0 && args[args.length - 1] == FFI::NativeType::VARARGS
invoker = FFI::VariadicInvoker.new(library, function, args, find_type(ret), options)
else
invoker = FFI::Invoker.new(library, function, args, find_type(ret), options[:convention].to_s)
end
raise NotFoundError.new(name, library.name) unless invoker
return invoker
end