Class: FFI::Inline::Builder

Inherits:
Object
  • Object
show all
Defined in:
lib/ffi/inline/builders.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

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

#codeObject (readonly)

Returns the value of attribute code.



47
48
49
# File 'lib/ffi/inline/builders.rb', line 47

def code
  @code
end

#compilerObject (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

#buildObject



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_objectObject



70
71
72
# File 'lib/ffi/inline/builders.rb', line 70

def shared_object
  raise 'the Builder has not been specialized'
end

#signaturesObject



74
75
76
# File 'lib/ffi/inline/builders.rb', line 74

def signatures
  raise 'the Builder has not been specialized'
end

#symbolsObject



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