class FFIGen::FunctionOrCallback

Attributes

function_description[R]
name[R]
parameters[R]
return_type[R]
return_value_description[R]

Public Class Methods

new(generator, name, parameters, return_type, is_callback, blocking, function_description, return_value_description) click to toggle source
# File lib/ffi_gen.rb, line 114
def initialize(generator, name, parameters, return_type, is_callback, blocking, function_description, return_value_description)
  @generator = generator
  @name = name
  @parameters = parameters
  @return_type = return_type
  @is_callback = is_callback
  @blocking = blocking
  @function_description = function_description
  @return_value_description = return_value_description
end

Public Instance Methods

java_description() click to toggle source
# File lib/ffi_gen/java_output.rb, line 252
def java_description
  "Proc(_callback_#{java_name}_)"
end
java_jna_return_type() click to toggle source
# File lib/ffi_gen/java_output.rb, line 245
def java_jna_return_type
  if @return_type.is_a? ByReferenceType and not @return_type.inner_type.fields.empty?
    return "#{@return_type.java_jna_type}.ByReference"
  end
  @return_type.java_jna_type
end
java_jna_type() click to toggle source
# File lib/ffi_gen/java_output.rb, line 241
def java_jna_type
  java_name
end
java_name() click to toggle source
# File lib/ffi_gen/java_output.rb, line 236
def java_name
  n = (@is_callback ? (@generator.module_name + 'Interface.') : '') + @name.to_java_downcase
  @java_name ||= n
end
ruby_description() click to toggle source
# File lib/ffi_gen/ruby_output.rb, line 183
def ruby_description
  "Proc(_callback_#{ruby_name}_)"
end
ruby_ffi_return_type() click to toggle source
# File lib/ffi_gen/ruby_output.rb, line 172
def ruby_ffi_return_type
  if @return_type.is_a? ByReferenceType and not @return_type.inner_type.fields.empty?
    return @return_type.inner_type
  end
  @return_type
end
ruby_ffi_type() click to toggle source
# File lib/ffi_gen/ruby_output.rb, line 179
def ruby_ffi_type
  ":#{ruby_name}"
end
ruby_name() click to toggle source
# File lib/ffi_gen/ruby_output.rb, line 168
def ruby_name
  @ruby_name ||= @name.to_ruby_downcase
end
write_java(writer) click to toggle source
# File lib/ffi_gen/java_output.rb, line 167
def write_java(writer)
  if @is_callback
    writer.puts "public static interface #{java_name.split('.').last} extends Callback {"
    writer.indent do
      jna_signature = "#{@parameters.map{ |parameter| "#{parameter[:type].java_jna_type} #{parameter[:name].to_java_downcase}" }.join(', ')}"
      writer.puts "#{java_jna_return_type} invoke(#{jna_signature});"
    end
    writer.puts "}", ""
    return
  end

  jna_signature = "#{@parameters.map{ |parameter| "#{parameter[:type].java_jna_type} #{parameter[:name].to_java_downcase}" }.join(', ')}"
  writer.puts "@NativeName(\"#{@name.raw}\")", "#{java_jna_return_type} #{java_name}(#{jna_signature});", ""
end
write_ruby(writer) click to toggle source
# File lib/ffi_gen/ruby_output.rb, line 147
def write_ruby(writer)
  writer.puts "@blocking = true" if @blocking
  writer.comment do
    writer.write_description @function_description
    writer.puts "", "<em>This entry is only for documentation and no real method.</em>" if @is_callback
    writer.puts "", "@method #{@is_callback ? "_callback_#{ruby_name}_" : ruby_name}(#{@parameters.map{ |parameter| parameter[:name].to_ruby_downcase }.join(', ')})"
    @parameters.each do |parameter|
      writer.write_description parameter[:description], false, "@param [#{parameter[:type].ruby_description}] #{parameter[:name].to_ruby_downcase} ", "  "
    end
    writer.write_description @return_value_description, false, "@return [#{@return_type.ruby_description}] ", "  "
    writer.puts "@scope class"
  end

  ffi_signature = "[#{@parameters.map{ |parameter| parameter[:type].ruby_ffi_type }.join(', ')}], #{@return_type.ruby_ffi_type}"
  if @is_callback
    writer.puts "callback :#{ruby_name}, #{ffi_signature}", ""
  else
    writer.puts "attach_function :#{ruby_name}, :#{@name.raw}, #{ffi_signature}", ""
  end
end
write_static_java(writer) click to toggle source
# File lib/ffi_gen/java_output.rb, line 182
def write_static_java(writer)
  return if @is_callback # must be in Library
  
  replace = {}
  parameters = []
  lp = nil
  @parameters.each do |p|
    if lp and lp[:type].is_a?(PointerType) and lp[:type].pointee_type.respond_to?(:clang_type) and lp[:type].pointee_type.clang_type == :u_char and [:u_long, :u_long_long].include?(p[:type].clang_type)
      n = lp[:name].to_java_downcase
      replace[n] = "bytesToPointer(#{n})"
      replace[p[:name].to_java_downcase] = "#{n}.length";
      d = lp.dup
      d[:type] = ArrayType.new(lp[:type].pointee_type, nil)
      parameters << d
      lp = nil
    else
      if lp
        parameters << lp
      end
      lp = p
    end
  end
  if lp
    parameters << lp
  end
  
  writer.comment do
    writer.write_description @function_description
    writer.puts "", "<em>This entry is only for documentation and no real method.</em>" if @is_callback
    writer.puts "", "@method #{@is_callback ? "_callback_#{java_name}_" : java_name}(#{parameters.map{ |parameter| parameter[:name].to_java_downcase }.join(', ')})"
    parameters.each do |parameter|
      writer.write_description parameter[:description], false, "@param [#{parameter[:type].java_description}] #{parameter[:name].to_java_downcase} ", "  "
    end
    writer.write_description @return_value_description, false, "@return [#{@return_type.java_description}] ", "  "
    writer.puts "@scope class"
  end
  
  args = @parameters.map{ |parameter|
    n = parameter[:name].to_java_downcase
    replace[n] || n
  }.join(', ')
  jna_signature = "#{parameters.map{ |parameter| "#{parameter[:type].java_jna_type} #{parameter[:name].to_java_downcase}" }.join(', ')}"
  writer.puts "public static #{java_jna_return_type} #{java_name}(#{jna_signature}) {"
  writer.indent do
    call = "INSTANCE.#{java_name}(#{args});"
    if @return_type.respond_to? :clang_type and @return_type.clang_type == :void
      writer.puts call
    else
      writer.puts "return #{call}"
    end
  end
  writer.puts "}", ""
end