module FFI::Library
def attach_variable(mname, a1, a2 = nil)
-
(FFI::NotFoundError)- if +cname+ cannot be found in libraries
Returns:
-
(DynamicLibrary::Symbol)-
Parameters:
-
type(DataConverter, Struct, Symbol, Type) -- C variable's type -
mname(#to_s) -- name of ruby method to attach as -
type(DataConverter, Struct, Symbol, Type) -- C variable's type -
cname(#to_s) -- name of C variable to attach -
mname(#to_s) -- name of ruby method to attach as
Overloads:
-
attach_variable(cname, type) -
attach_variable(mname, cname, type)
def attach_variable(mname, a1, a2 = nil) cname, type = a2 ? [ a1, a2 ] : [ mname.to_s, a1 ] mname = mname.to_sym address = nil ffi_libraries.each do |lib| begin address = lib.find_variable(cname.to_s) break unless address.nil? rescue LoadError end end raise FFI::NotFoundError.new(cname, ffi_libraries) if address.nil? || address.null? if type.is_a?(Class) && type < FFI::Struct # If it is a global struct, just attach directly to the pointer s = s = type.new(address) # Assigning twice to suppress unused variable warning self.module_eval <<-code, __FILE__, __LINE__ @ffi_gsvars = {} unless defined?(@ffi_gsvars) @ffi_gsvars[#{mname.inspect}] = s def self.#{mname} @ffi_gsvars[#{mname.inspect}] end code else sc = Class.new(FFI::Struct) sc.layout :gvar, find_type(type) s = sc.new(address) # # Attach to this module as mname/mname= # self.module_eval <<-code, __FILE__, __LINE__ @ffi_gvars = {} unless defined?(@ffi_gvars) @ffi_gvars[#{mname.inspect}] = s def self.#{mname} @ffi_gvars[#{mname.inspect}][:gvar] end def self.#{mname}=(value) @ffi_gvars[#{mname.inspect}][:gvar] = value end code end address end