Class: Inliner::Builder

Inherits:
Object
  • Object
show all
Defined in:
lib/ffi-inliner/inliner.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(mod, code = "", options = {}) ⇒ Builder

Returns a new instance of Builder.



135
136
137
138
139
140
141
142
143
# File 'lib/ffi-inliner/inliner.rb', line 135

def initialize(mod, code = "", options = {})
  make_pointer_types
  @mod = mod
  @code = code
  @sig = [parse_signature(@code)] unless @code.empty?
  options = { :use_compiler => Compilers::GCC }.merge(options)
  @compiler = options[:use_compiler]
  @libraries = []
end

Instance Attribute Details

#codeObject (readonly)

Returns the value of attribute code.



134
135
136
# File 'lib/ffi-inliner/inliner.rb', line 134

def code
  @code
end

#compilerObject (readonly)

Returns the value of attribute compiler.



134
135
136
# File 'lib/ffi-inliner/inliner.rb', line 134

def compiler
  @compiler
end

Instance Method Details

#buildObject



178
179
180
181
182
183
184
185
186
187
188
# File 'lib/ffi-inliner/inliner.rb', line 178

def build
  @fm = FilenameManager.new(@mod, @code, @libraries)
  @compiler = @compiler.check_and_create(@fm, @libraries)
  unless @fm.cached?
    write_files(@code, @sig)
    @compiler.compile
    @mod.instance_eval generate_ffi(@sig)
  else
    @mod.instance_eval(File.read(@fm.rb_fn))
  end
end

#c(code) ⇒ Object



157
158
159
160
# File 'lib/ffi-inliner/inliner.rb', line 157

def c(code)
  (@sig ||= []) << parse_signature(code)
  @code << (@compiler == Compilers::GPlusPlus ? "extern \"C\" {\n#{code}\n}" : code )
end

#c_raw(code) ⇒ Object



162
163
164
# File 'lib/ffi-inliner/inliner.rb', line 162

def c_raw(code)
  @code << code
end

#include(fn, options = {}) ⇒ Object



149
150
151
# File 'lib/ffi-inliner/inliner.rb', line 149

def include(fn, options = {})
  options[:quoted] ? @code << "#include \"#{fn}\"\n" : @code << "#include <#{fn}>\n"
end

#library(*libraries) ⇒ Object



153
154
155
# File 'lib/ffi-inliner/inliner.rb', line 153

def library(*libraries)
  (@libraries ||= []).concat(libraries)
end

#map(type_map) ⇒ Object



145
146
147
# File 'lib/ffi-inliner/inliner.rb', line 145

def map(type_map)
  @types.merge!(type_map)
end

#struct(ffi_struct) ⇒ Object



170
171
172
173
174
175
176
# File 'lib/ffi-inliner/inliner.rb', line 170

def struct(ffi_struct)
  @code << "typedef struct {"
  ffi_struct.layout.fields.each do |field|
    @code << "#{field} #{field.name};\n"
  end
  @code << "} #{ffi_struct.class.name}"
end

#use_compiler(compiler) ⇒ Object



166
167
168
# File 'lib/ffi-inliner/inliner.rb', line 166

def use_compiler(compiler)
  @compiler = compiler
end