class GirFFI::BaseArgumentBuilder

Abstract parent class of the argument building classes. These classes are used by FunctionBuilder to create the code that processes each argument before and after the actual function call.

Constants

KEYWORDS

Attributes

array_arg[RW]
is_closure[RW]
length_arg[RW]
name[R]
retname[R]

Public Class Methods

new(var_gen, name, typeinfo, direction) click to toggle source
# File lib/gir_ffi/builders/base_argument_builder.rb, line 20
def initialize var_gen, name, typeinfo, direction
  @var_gen = var_gen

  @typeinfo = typeinfo
  @direction = direction
  @name = safe(name)

  @inarg = nil
  @retname = nil

  @length_arg = nil
  @array_arg = nil

  @is_closure = false
end

Public Instance Methods

argument_class_name() click to toggle source

TODO: Use class rather than class name

# File lib/gir_ffi/builders/base_argument_builder.rb, line 45
def argument_class_name
  type_info.argument_class_name
end
array_size() click to toggle source
# File lib/gir_ffi/builders/base_argument_builder.rb, line 49
def array_size
  if @length_arg
    @length_arg.retname
  else
    type_info.array_fixed_size
  end
end
callarg() click to toggle source
# File lib/gir_ffi/builders/base_argument_builder.rb, line 73
def callarg
  @callarg ||= @var_gen.new_var
end
cleanup() click to toggle source
# File lib/gir_ffi/builders/base_argument_builder.rb, line 85
def cleanup
  []
end
inarg() click to toggle source
# File lib/gir_ffi/builders/base_argument_builder.rb, line 65
def inarg
  @array_arg.nil? ? @inarg : nil
end
new_variable() click to toggle source
# File lib/gir_ffi/builders/base_argument_builder.rb, line 89
def new_variable
  @var_gen.new_var
end
post() click to toggle source
# File lib/gir_ffi/builders/base_argument_builder.rb, line 81
def post
  []
end
pre() click to toggle source
# File lib/gir_ffi/builders/base_argument_builder.rb, line 77
def pre
  []
end
retval() click to toggle source
# File lib/gir_ffi/builders/base_argument_builder.rb, line 69
def retval
  @array_arg.nil? ? retname : nil
end
safe(name) click to toggle source
# File lib/gir_ffi/builders/base_argument_builder.rb, line 57
def safe name
  if KEYWORDS.include? name
    "#{name}_"
  else
    name
  end
end
specialized_type_tag() click to toggle source
# File lib/gir_ffi/builders/base_argument_builder.rb, line 40
def specialized_type_tag
  type_info.flattened_tag
end
type_info() click to toggle source
# File lib/gir_ffi/builders/base_argument_builder.rb, line 36
def type_info
  @typeinfo
end

Private Instance Methods

conversion_arguments(name) click to toggle source
# File lib/gir_ffi/builders/base_argument_builder.rb, line 119
def conversion_arguments name
  type_info.extra_conversion_arguments.map(&:inspect).push(name).join(", ")
end
needs_outgoing_parameter_conversion?() click to toggle source
# File lib/gir_ffi/builders/base_argument_builder.rb, line 95
def needs_outgoing_parameter_conversion?
  [ :array, :byte_array, :c, :error, :filename, :ghash, :glist,
    :gslist, :interface, :object, :ptr_array, :struct, :strv, :union,
    :utf8, :zero_terminated ].include?(specialized_type_tag)
end
outgoing_conversion(base) click to toggle source
# File lib/gir_ffi/builders/base_argument_builder.rb, line 101
def outgoing_conversion base
  args = output_conversion_arguments base
  case specialized_type_tag
  when :utf8, :filename
    "#{base}.to_utf8"
  else
    "#{argument_class_name}.wrap(#{args})"
  end
end
output_conversion_arguments(arg) click to toggle source
# File lib/gir_ffi/builders/base_argument_builder.rb, line 111
def output_conversion_arguments arg
  if specialized_type_tag == :c
    "#{type_info.subtype_tag_or_class.inspect}, #{array_size}, #{arg}"
  else
    conversion_arguments arg
  end
end