Sha256: a6d1c65bb68f96b550edd912435b32a7928f66f107f70c30f1510f5179aaf661

Contents?: true

Size: 1.99 KB

Versions: 1

Compression:

Stored size: 1.99 KB

Contents

require 'gir_ffi/builder/argument'
require 'gir_ffi/variable_name_generator'

module GirFFI::Builder
  # Implements the creation of a Ruby function definition out of a GIR
  # IFunctionInfo.
  class Function
    def initialize info, libmodule
      @info = info
      @libmodule = libmodule
    end

    def generate
      vargen = GirFFI::VariableNameGenerator.new
      @data = @info.args.map {|arg| Argument.build vargen, arg, @libmodule}
      @rvdata = ReturnValue.build vargen, @info

      alldata = @data.dup << @rvdata

      alldata.each {|data|
        data.prepare
	idx = data.type_info.array_length
        if idx > -1
          data.length_arg = @data[idx] 
          @data[idx].array_arg = data
        end
      }

      setup_error_argument vargen
      return filled_out_template
    end

    def pretty_print
      generate
    end

    private

    def setup_error_argument vargen
      klass = @info.throws? ? ErrorArgument : NullArgument
      @errarg = klass.new vargen, nil, nil, nil
      @errarg.prepare
    end

    def filled_out_template
      lines = pre
      lines << "#{capture}::#{@libmodule}.#{@info.symbol} #{callargs.join(', ')}"
      lines << post

      code = "def #{@info.safe_name} #{inargs.join(', ')}\n"
      code << lines.join("\n").indent
      code << "\nend\n"
    end

    def inargs
      @data.map(&:inarg).compact
    end

    def callargs
      ca = @data.map(&:callarg)
      ca << @errarg.callarg
      ca.unshift "self" if @info.method?
      ca.compact
    end

    def pre
      pr = @data.map(&:pre)
      pr << @errarg.pre
      pr.flatten
    end

    def capture
      if (cv = @rvdata.cvar)
        "#{cv} = "
      else
        ""
      end
    end

    def post
      po = (@data.map(&:post) + @data.map(&:postpost) + @rvdata.post)
      po.unshift @errarg.post

      po += @data.map {|d| d.cleanup}

      retvals = ([@rvdata.retval] + @data.map(&:retval)).compact
      po << "return #{retvals.join(', ')}" unless retvals.empty?

      po.flatten
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
gir_ffi-0.2.2 lib/gir_ffi/builder/function.rb