Class: FFI::Inline::Builder
- Inherits:
-
Object
- Object
- FFI::Inline::Builder
- Defined in:
- lib/ffi/inline/builders.rb
Instance Attribute Summary collapse
-
#code ⇒ Object
readonly
Returns the value of attribute code.
-
#compiler ⇒ Object
readonly
Returns the value of attribute compiler.
Class Method Summary collapse
Instance Method Summary collapse
- #build ⇒ Object
- #eval(&block) ⇒ Object
-
#initialize(code = '') ⇒ Builder
constructor
A new instance of Builder.
- #raw(code) ⇒ Object
- #shared_object ⇒ Object
- #signatures ⇒ Object
- #symbols ⇒ Object
- #to_ffi_type(type) ⇒ Object
- #use_compiler(compiler) ⇒ Object
Constructor Details
#initialize(code = '') ⇒ Builder
Returns a new instance of Builder.
49 50 51 52 |
# File 'lib/ffi/inline/builders.rb', line 49 def initialize (code = '') @code = code @evals = [] end |
Instance Attribute Details
#code ⇒ Object (readonly)
Returns the value of attribute code.
47 48 49 |
# File 'lib/ffi/inline/builders.rb', line 47 def code @code end |
#compiler ⇒ Object (readonly)
Returns the value of attribute compiler.
47 48 49 |
# File 'lib/ffi/inline/builders.rb', line 47 def compiler @compiler end |
Class Method Details
.[](name) ⇒ Object
18 19 20 21 22 23 24 25 |
# File 'lib/ffi/inline/builders.rb', line 18 def self.[] (name) return name if name.is_a?(Builder) @builders.find {|builder| builder.name.downcase == name.downcase || builder.aliases.any? { |ali| ali.downcase == name.downcase } } end |
.define(name, *aliases, &block) ⇒ Object
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# File 'lib/ffi/inline/builders.rb', line 27 def self.define (name, *aliases, &block) inherit_from = self if name.is_a?(Builder) name = name.class end if name.is_a?(Class) inherit_from = name name = aliases.shift end @builders << Class.new(inherit_from, &block).tap {|k| k.instance_eval { define_singleton_method :name do name end define_singleton_method :aliases do aliases end } } end |
Instance Method Details
#build ⇒ Object
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
# File 'lib/ffi/inline/builders.rb', line 82 def build builder = self blocks = @evals mod = Module.new mod.instance_eval { extend FFI::Library ffi_lib builder.shared_object blocks.each { |block| instance_eval &block } builder.signatures.each {|s| attach_function s.name, s.arguments.compact.map {|a| builder.to_ffi_type(a, self) }, builder.to_ffi_type(s.return, self), :blocking => s.blocking } } mod end |
#eval(&block) ⇒ Object
62 63 64 |
# File 'lib/ffi/inline/builders.rb', line 62 def eval (&block) @evals << block end |
#raw(code) ⇒ Object
58 59 60 |
# File 'lib/ffi/inline/builders.rb', line 58 def raw (code) @code << code end |
#shared_object ⇒ Object
70 71 72 |
# File 'lib/ffi/inline/builders.rb', line 70 def shared_object raise 'the Builder has not been specialized' end |
#signatures ⇒ Object
74 75 76 |
# File 'lib/ffi/inline/builders.rb', line 74 def signatures raise 'the Builder has not been specialized' end |
#symbols ⇒ Object
78 79 80 |
# File 'lib/ffi/inline/builders.rb', line 78 def symbols signatures.map { |s| s.name.to_sym } end |
#to_ffi_type(type) ⇒ Object
66 67 68 |
# File 'lib/ffi/inline/builders.rb', line 66 def to_ffi_type (type) raise 'the Builder has not been specialized' end |
#use_compiler(compiler) ⇒ Object
54 55 56 |
# File 'lib/ffi/inline/builders.rb', line 54 def use_compiler (compiler) @compiler = Compiler[compiler] end |