# File lib/inline_acceleration.rb, line 150
    def link_function(c_return_type, function_name, parameter_types)
      delegate_function_name = "C_delegate_#{function_name}"
      return_type = Type.new(c_return_type, link_type(c_return_type))
      parameters = parameter_types.map_with_indices { |type, index| Parameter.new(type, link_type(type), index)  }
      
      #build c delegate
      c_code = "\#{return_type.c_transfer_type} \#{delegate_function_name}(\#{parameters.c_method_parameters.join(', ')}) {\n\#{return_type.void? ? '' : \"return (\#{return_type.c_transfer_type})\"} \#{function_name}(\#{parameters.c_casted_call_args.join(', ')});\n}\n"
      #      puts c_code
      self.c_singleton c_code
      
      #build ruby delegate
      line = __LINE__; ruby_code = "def self.\#{function_name}(\#{parameters.ruby_method_parameters.join(', ')})\n\#{parameters.ruby_ref_assigns.reject_nils.join('; ')}\nreturn_values = []\n\#{return_type.void? ? '' : ('return_values << ' + return_type.ruby_type_conversion)}(\#{delegate_function_name}(\#{parameters.ruby_transformed_call_args.join(', ')}))\n\#{parameters.ruby_converted_return_values.reject_nils.prefix('return_values << ').join('; ')}\ncase return_values.size\nwhen 0: nil\nwhen 1: return_values[0]\nelse    return_values\nend\nend\ndef \#{function_name}(\#{parameters.ruby_method_parameters.join(', ')})\nself.class.\#{function_name}(\#{parameters.arg_names.join(', ')})\nend\n"
      #      puts ruby_code
      @mod.class_eval ruby_code, __FILE__, line + 1
    end