gir_ffi 0.7.7 → 0.7.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Changelog.md +9 -0
- data/lib/ffi-glib/array.rb +1 -1
- data/lib/ffi-glib/error.rb +1 -2
- data/lib/ffi-glib/hash_table.rb +2 -2
- data/lib/ffi-glib/variant.rb +1 -1
- data/lib/ffi-gobject/base.rb +23 -23
- data/lib/ffi-gobject/object.rb +7 -3
- data/lib/ffi-gobject/value.rb +6 -1
- data/lib/ffi-gobject.rb +9 -6
- data/lib/ffi-gobject_introspection/i_base_info.rb +3 -3
- data/lib/ffi-gobject_introspection/i_constant_info.rb +1 -1
- data/lib/ffi-gobject_introspection/i_repository.rb +4 -1
- data/lib/ffi-gobject_introspection/i_type_info.rb +1 -1
- data/lib/ffi-gobject_introspection/i_unresolved_info.rb +7 -0
- data/lib/ffi-gobject_introspection/lib.rb +1 -1
- data/lib/gir_ffi/builders/argument_builder.rb +1 -1
- data/lib/gir_ffi/builders/c_to_ruby_convertor.rb +37 -29
- data/lib/gir_ffi/builders/callback_argument_builder.rb +57 -27
- data/lib/gir_ffi/builders/closure_convertor.rb +12 -8
- data/lib/gir_ffi/builders/closure_to_pointer_convertor.rb +12 -8
- data/lib/gir_ffi/builders/constructor_result_convertor.rb +11 -7
- data/lib/gir_ffi/builders/field_builder.rb +1 -1
- data/lib/gir_ffi/builders/function_builder.rb +1 -1
- data/lib/gir_ffi/builders/mapping_method_builder.rb +1 -1
- data/lib/gir_ffi/builders/marshalling_method_builder.rb +2 -2
- data/lib/gir_ffi/builders/method_template.rb +1 -1
- data/lib/gir_ffi/builders/null_convertor.rb +11 -7
- data/lib/gir_ffi/builders/property_builder.rb +1 -1
- data/lib/gir_ffi/builders/ruby_to_c_convertor.rb +17 -13
- data/lib/gir_ffi/error_argument_info.rb +1 -1
- data/lib/gir_ffi/ffi_ext/pointer.rb +1 -1
- data/lib/gir_ffi/info_ext/i_unresolved_info.rb +12 -0
- data/lib/gir_ffi/info_ext/safe_constant_name.rb +2 -2
- data/lib/gir_ffi/info_ext/safe_function_name.rb +1 -1
- data/lib/gir_ffi/info_ext.rb +1 -0
- data/lib/gir_ffi/module_base.rb +1 -1
- data/lib/gir_ffi/receiver_argument_info.rb +15 -12
- data/lib/gir_ffi/user_data_argument_info.rb +17 -15
- data/lib/gir_ffi/user_data_type_info.rb +14 -12
- data/lib/gir_ffi/version.rb +1 -1
- data/lib/gir_ffi-base/gobject/lib.rb +1 -1
- data/test/base_test_helper.rb +15 -15
- data/test/ffi-glib/array_test.rb +38 -38
- data/test/ffi-glib/byte_array_test.rb +6 -7
- data/test/ffi-glib/bytes_test.rb +9 -9
- data/test/ffi-glib/hash_table_test.rb +26 -23
- data/test/ffi-glib/iconv_test.rb +5 -5
- data/test/ffi-glib/list_test.rb +16 -16
- data/test/ffi-glib/main_loop_test.rb +6 -6
- data/test/ffi-glib/ptr_array_test.rb +45 -45
- data/test/ffi-glib/ruby_closure_test.rb +6 -6
- data/test/ffi-glib/s_list_test.rb +15 -15
- data/test/ffi-glib/strv_test.rb +21 -21
- data/test/ffi-glib/variant_test.rb +4 -4
- data/test/ffi-gobject/gobject_test.rb +35 -35
- data/test/ffi-gobject/object_class_test.rb +1 -1
- data/test/ffi-gobject/object_test.rb +29 -6
- data/test/ffi-gobject/value_test.rb +66 -52
- data/test/ffi-gobject_introspection/i_base_info_test.rb +10 -11
- data/test/ffi-gobject_introspection/i_constant_info_test.rb +6 -6
- data/test/ffi-gobject_introspection/i_enum_info_test.rb +4 -5
- data/test/ffi-gobject_introspection/i_function_info_test.rb +0 -2
- data/test/ffi-gobject_introspection/i_object_info_test.rb +5 -5
- data/test/ffi-gobject_introspection/i_registered_type_info_test.rb +9 -8
- data/test/ffi-gobject_introspection/i_repository_test.rb +16 -16
- data/test/ffi-gobject_introspection/i_type_info_test.rb +16 -2
- data/test/ffi-gobject_introspection/lib_test.rb +2 -2
- data/test/ffi-gobject_test.rb +50 -40
- data/test/gir_ffi/arg_helper_test.rb +5 -5
- data/test/gir_ffi/builder_test.rb +41 -41
- data/test/gir_ffi/builders/argument_builder_test.rb +240 -207
- data/test/gir_ffi/builders/base_argument_builder_test.rb +0 -1
- data/test/gir_ffi/builders/callback_argument_builder_test.rb +81 -15
- data/test/gir_ffi/builders/callback_builder_test.rb +39 -14
- data/test/gir_ffi/builders/callback_return_value_builder_test.rb +41 -33
- data/test/gir_ffi/builders/enum_builder_test.rb +3 -3
- data/test/gir_ffi/builders/field_builder_test.rb +17 -17
- data/test/gir_ffi/builders/function_builder_test.rb +16 -16
- data/test/gir_ffi/builders/interface_builder_test.rb +9 -7
- data/test/gir_ffi/builders/module_builder_test.rb +5 -6
- data/test/gir_ffi/builders/object_builder_test.rb +24 -19
- data/test/gir_ffi/builders/property_builder_test.rb +25 -23
- data/test/gir_ffi/builders/registered_type_builder_test.rb +11 -11
- data/test/gir_ffi/builders/return_value_builder_test.rb +237 -197
- data/test/gir_ffi/builders/signal_closure_builder_test.rb +29 -22
- data/test/gir_ffi/builders/struct_builder_test.rb +10 -10
- data/test/gir_ffi/builders/unintrospectable_builder_test.rb +8 -8
- data/test/gir_ffi/builders/union_builder_test.rb +5 -6
- data/test/gir_ffi/builders/user_defined_builder_test.rb +42 -33
- data/test/gir_ffi/builders/vfunc_builder_test.rb +37 -30
- data/test/gir_ffi/callback_base_test.rb +4 -5
- data/test/gir_ffi/class_base_test.rb +35 -28
- data/test/gir_ffi/error_type_info_test.rb +14 -14
- data/test/gir_ffi/ffi_ext/pointer_test.rb +4 -4
- data/test/gir_ffi/g_type_test.rb +6 -6
- data/test/gir_ffi/in_out_pointer_test.rb +27 -27
- data/test/gir_ffi/in_pointer_test.rb +54 -50
- data/test/gir_ffi/info_ext/i_callable_info_test.rb +8 -7
- data/test/gir_ffi/info_ext/i_callback_info_test.rb +7 -7
- data/test/gir_ffi/info_ext/i_field_info_test.rb +10 -8
- data/test/gir_ffi/info_ext/i_function_info_test.rb +17 -15
- data/test/gir_ffi/info_ext/i_signal_info_test.rb +10 -8
- data/test/gir_ffi/info_ext/i_type_info_test.rb +158 -155
- data/test/gir_ffi/info_ext/i_unresolved_info_test.rb +17 -0
- data/test/gir_ffi/info_ext/safe_constant_name_test.rb +12 -10
- data/test/gir_ffi/info_ext/safe_function_name_test.rb +12 -10
- data/test/gir_ffi/interface_base_test.rb +6 -6
- data/test/gir_ffi/method_stubber_test.rb +16 -13
- data/test/gir_ffi/object_base_test.rb +6 -6
- data/test/gir_ffi/sized_array_test.rb +23 -23
- data/test/gir_ffi/type_map_test.rb +3 -3
- data/test/gir_ffi/unintrospectable_type_info_test.rb +18 -18
- data/test/gir_ffi/user_defined_property_info_test.rb +4 -4
- data/test/gir_ffi/user_defined_type_info_test.rb +16 -16
- data/test/gir_ffi/variable_name_generator_test.rb +6 -6
- data/test/gir_ffi/version_test.rb +1 -1
- data/test/gir_ffi/zero_terminated_test.rb +16 -17
- data/test/gir_ffi-base/glib/boolean_test.rb +13 -13
- data/test/gir_ffi-base/glib/strv_test.rb +11 -11
- data/test/gir_ffi_test.rb +18 -18
- data/test/gir_ffi_test_helper.rb +13 -18
- data/test/integration/derived_classes_test.rb +8 -8
- data/test/integration/generated_gimarshallingtests_test.rb +794 -792
- data/test/integration/generated_gio_test.rb +25 -26
- data/test/integration/generated_glib_test.rb +8 -2
- data/test/integration/generated_gobject_test.rb +16 -9
- data/test/integration/generated_pango_ft2_test.rb +1 -2
- data/test/integration/generated_pango_test.rb +2 -2
- data/test/integration/generated_regress_test.rb +785 -705
- data/test/integration/generated_secret_test.rb +5 -5
- data/test/integration/method_lookup_test.rb +5 -5
- data/test/introspection_test_helper.rb +3 -1
- data/test/minitest/stats_plugin.rb +3 -3
- metadata +6 -3
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 58dffbf9a2115d4ddfe8ca620557382d27510bb5
         | 
| 4 | 
            +
              data.tar.gz: 6f0e46d81b16c5d29468acc9fce70e4249b44f37
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 80c91f162cc4b515d85a77de746ba8305c1a8f241bf28e739bbbb46bd5e34ee4029f553ff57764f7824a33dedcb2486931c979a3d612432601e92aa2867e02d3
         | 
| 7 | 
            +
              data.tar.gz: e5e38438a0b57c2ac477a60d464dbf7e0547f74ae7b8326c54f79a486c6bbc205e7e90f484a95a9c628abd927023b771c94b1c0f1272537ac480dcc85a958cdf
         | 
    
        data/Changelog.md
    CHANGED
    
    | @@ -1,5 +1,14 @@ | |
| 1 1 | 
             
            # Changelog
         | 
| 2 2 |  | 
| 3 | 
            +
            ## 0.7.8 / 2014-12-09
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            * Support constants with a falsy value
         | 
| 6 | 
            +
            * Support type aliases that resolve to a type that is not introspectable
         | 
| 7 | 
            +
            * Support callback arguments with direction :inout
         | 
| 8 | 
            +
            * Provide GObject.signal_connect_after and GObject::Object.signal_connect_after
         | 
| 9 | 
            +
            * Handle setting GValues (and hence, properties) that have enum values
         | 
| 10 | 
            +
            * Various refactorings & coding style cleanups
         | 
| 11 | 
            +
             | 
| 3 12 | 
             
            ## 0.7.7 / 2014-10-21
         | 
| 4 13 |  | 
| 5 14 | 
             
            * Handle introspecting boolean constants
         | 
    
        data/lib/ffi-glib/array.rb
    CHANGED
    
    
    
        data/lib/ffi-glib/error.rb
    CHANGED
    
    | @@ -3,8 +3,7 @@ GLib.load_class :Error | |
| 3 3 | 
             
            module GLib
         | 
| 4 4 | 
             
              # Overrides for GError, used by GLib for handling non-fatal errors.
         | 
| 5 5 | 
             
              class Error
         | 
| 6 | 
            -
                 | 
| 7 | 
            -
                GIR_FFI_DOMAIN = GLib.quark_from_string("gir_ffi")
         | 
| 6 | 
            +
                GIR_FFI_DOMAIN = GLib.quark_from_string('gir_ffi')
         | 
| 8 7 |  | 
| 9 8 | 
             
                def self.from_exception ex
         | 
| 10 9 | 
             
                  new_literal GIR_FFI_DOMAIN, 0, ex.message
         | 
    
        data/lib/ffi-glib/hash_table.rb
    CHANGED
    
    | @@ -56,7 +56,7 @@ module GLib | |
| 56 56 | 
             
                  when :utf8
         | 
| 57 57 | 
             
                    FFI::Function.new(:uint,
         | 
| 58 58 | 
             
                                      [:pointer],
         | 
| 59 | 
            -
                                      find_support_function( | 
| 59 | 
            +
                                      find_support_function('g_str_hash'))
         | 
| 60 60 | 
             
                  else
         | 
| 61 61 | 
             
                    nil
         | 
| 62 62 | 
             
                  end
         | 
| @@ -67,7 +67,7 @@ module GLib | |
| 67 67 | 
             
                  when :utf8
         | 
| 68 68 | 
             
                    FFI::Function.new(:int,
         | 
| 69 69 | 
             
                                      [:pointer, :pointer],
         | 
| 70 | 
            -
                                      find_support_function( | 
| 70 | 
            +
                                      find_support_function('g_str_equal'))
         | 
| 71 71 | 
             
                  else
         | 
| 72 72 | 
             
                    nil
         | 
| 73 73 | 
             
                  end
         | 
    
        data/lib/ffi-glib/variant.rb
    CHANGED
    
    
    
        data/lib/ffi-gobject/base.rb
    CHANGED
    
    | @@ -1,26 +1,26 @@ | |
| 1 1 | 
             
            # Preload type contants
         | 
| 2 2 | 
             
            module GObject
         | 
| 3 | 
            -
              TYPE_INVALID = type_from_name( | 
| 4 | 
            -
              TYPE_NONE = type_from_name( | 
| 5 | 
            -
              TYPE_INTERFACE = type_from_name( | 
| 6 | 
            -
              TYPE_CHAR = type_from_name( | 
| 7 | 
            -
              TYPE_UCHAR = type_from_name( | 
| 8 | 
            -
              TYPE_BOOLEAN = type_from_name( | 
| 9 | 
            -
              TYPE_INT = type_from_name( | 
| 10 | 
            -
              TYPE_UINT = type_from_name( | 
| 11 | 
            -
              TYPE_LONG = type_from_name( | 
| 12 | 
            -
              TYPE_ULONG = type_from_name( | 
| 13 | 
            -
              TYPE_INT64 = type_from_name( | 
| 14 | 
            -
              TYPE_UINT64 = type_from_name( | 
| 15 | 
            -
              TYPE_ENUM = type_from_name( | 
| 16 | 
            -
              TYPE_FLAGS = type_from_name( | 
| 17 | 
            -
              TYPE_FLOAT = type_from_name( | 
| 18 | 
            -
              TYPE_DOUBLE = type_from_name( | 
| 19 | 
            -
              TYPE_STRING = type_from_name( | 
| 20 | 
            -
              TYPE_POINTER = type_from_name( | 
| 21 | 
            -
              TYPE_BOXED = type_from_name( | 
| 22 | 
            -
              TYPE_PARAM = type_from_name( | 
| 23 | 
            -
              TYPE_OBJECT = type_from_name( | 
| 24 | 
            -
              TYPE_GTYPE = type_from_name( | 
| 25 | 
            -
              TYPE_VARIANT = type_from_name( | 
| 3 | 
            +
              TYPE_INVALID = type_from_name('invalid')
         | 
| 4 | 
            +
              TYPE_NONE = type_from_name('void')
         | 
| 5 | 
            +
              TYPE_INTERFACE = type_from_name('GInterface')
         | 
| 6 | 
            +
              TYPE_CHAR = type_from_name('gchar')
         | 
| 7 | 
            +
              TYPE_UCHAR = type_from_name('guchar')
         | 
| 8 | 
            +
              TYPE_BOOLEAN = type_from_name('gboolean')
         | 
| 9 | 
            +
              TYPE_INT = type_from_name('gint')
         | 
| 10 | 
            +
              TYPE_UINT = type_from_name('guint')
         | 
| 11 | 
            +
              TYPE_LONG = type_from_name('glong')
         | 
| 12 | 
            +
              TYPE_ULONG = type_from_name('gulong')
         | 
| 13 | 
            +
              TYPE_INT64 = type_from_name('gint64')
         | 
| 14 | 
            +
              TYPE_UINT64 = type_from_name('guint64')
         | 
| 15 | 
            +
              TYPE_ENUM = type_from_name('GEnum')
         | 
| 16 | 
            +
              TYPE_FLAGS = type_from_name('GFlags')
         | 
| 17 | 
            +
              TYPE_FLOAT = type_from_name('gfloat')
         | 
| 18 | 
            +
              TYPE_DOUBLE = type_from_name('gdouble')
         | 
| 19 | 
            +
              TYPE_STRING = type_from_name('gchararray')
         | 
| 20 | 
            +
              TYPE_POINTER = type_from_name('gpointer')
         | 
| 21 | 
            +
              TYPE_BOXED = type_from_name('GBoxed')
         | 
| 22 | 
            +
              TYPE_PARAM = type_from_name('GParam')
         | 
| 23 | 
            +
              TYPE_OBJECT = type_from_name('GObject')
         | 
| 24 | 
            +
              TYPE_GTYPE = type_from_name('GType')
         | 
| 25 | 
            +
              TYPE_VARIANT = type_from_name('GVariant')
         | 
| 26 26 | 
             
            end
         | 
    
        data/lib/ffi-gobject/object.rb
    CHANGED
    
    | @@ -3,7 +3,7 @@ GObject.load_class :Object | |
| 3 3 | 
             
            module GObject
         | 
| 4 4 | 
             
              # Overrides for GObject, GObject's generic base class.
         | 
| 5 5 | 
             
              class Object
         | 
| 6 | 
            -
                setup_method  | 
| 6 | 
            +
                setup_method 'new'
         | 
| 7 7 |  | 
| 8 8 | 
             
                # TODO: Generate accessor methods from GIR at class definition time
         | 
| 9 9 | 
             
                def method_missing method, *args
         | 
| @@ -20,8 +20,12 @@ module GObject | |
| 20 20 | 
             
                  GObject.signal_connect(self, event, data, &block)
         | 
| 21 21 | 
             
                end
         | 
| 22 22 |  | 
| 23 | 
            -
                 | 
| 24 | 
            -
             | 
| 23 | 
            +
                def signal_connect_after event, data = nil, &block
         | 
| 24 | 
            +
                  GObject.signal_connect_after(self, event, data, &block)
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                setup_instance_method 'get_property'
         | 
| 28 | 
            +
                setup_instance_method 'set_property'
         | 
| 25 29 |  | 
| 26 30 | 
             
                def get_property_extended property_name
         | 
| 27 31 | 
             
                  gvalue = get_property property_name
         | 
    
        data/lib/ffi-gobject/value.rb
    CHANGED
    
    | @@ -14,7 +14,7 @@ module GObject | |
| 14 14 | 
             
                  TYPE_BOXED   => [:get_boxed,         :set_boxed],
         | 
| 15 15 | 
             
                  TYPE_CHAR    => [:get_char,          :set_char],
         | 
| 16 16 | 
             
                  TYPE_DOUBLE  => [:get_double,        :set_double],
         | 
| 17 | 
            -
                  TYPE_ENUM    => [:get_enum_enhanced, : | 
| 17 | 
            +
                  TYPE_ENUM    => [:get_enum_enhanced, :set_enum_enhanced],
         | 
| 18 18 | 
             
                  TYPE_FLAGS   => [:get_flags,         :set_flags],
         | 
| 19 19 | 
             
                  TYPE_FLOAT   => [:get_float,         :set_float],
         | 
| 20 20 | 
             
                  TYPE_GTYPE   => [:get_gtype,         :set_gtype],
         | 
| @@ -116,6 +116,11 @@ module GObject | |
| 116 116 | 
             
                  set_instance val
         | 
| 117 117 | 
             
                end
         | 
| 118 118 |  | 
| 119 | 
            +
                def set_enum_enhanced val
         | 
| 120 | 
            +
                  val = current_gtype_class[val] if val.is_a? Symbol
         | 
| 121 | 
            +
                  set_enum val
         | 
| 122 | 
            +
                end
         | 
| 123 | 
            +
             | 
| 119 124 | 
             
                def get_enum_enhanced
         | 
| 120 125 | 
             
                  current_gtype_class.wrap(get_enum)
         | 
| 121 126 | 
             
                end
         | 
    
        data/lib/ffi-gobject.rb
    CHANGED
    
    | @@ -18,8 +18,7 @@ module GObject | |
| 18 18 | 
             
              def self.type_from_instance_pointer inst_ptr
         | 
| 19 19 | 
             
                return nil if inst_ptr.null?
         | 
| 20 20 | 
             
                klsptr = inst_ptr.get_pointer 0
         | 
| 21 | 
            -
                 | 
| 22 | 
            -
                klsptr.send "get_#{GirFFI::TypeMap::TAG_TYPE_MAP[:GType]}", 0
         | 
| 21 | 
            +
                GirFFI::InOutPointer.new(:GType, klsptr).to_value
         | 
| 23 22 | 
             
              end
         | 
| 24 23 |  | 
| 25 24 | 
             
              def self.type_from_instance instance
         | 
| @@ -54,18 +53,22 @@ module GObject | |
| 54 53 | 
             
                return_gvalue
         | 
| 55 54 | 
             
              end
         | 
| 56 55 |  | 
| 57 | 
            -
              def self.signal_connect object, detailed_signal, data = nil, &block
         | 
| 58 | 
            -
                raise ArgumentError,  | 
| 56 | 
            +
              def self.signal_connect object, detailed_signal, data = nil, after = false, &block
         | 
| 57 | 
            +
                raise ArgumentError, 'Block needed' unless block_given?
         | 
| 59 58 | 
             
                signal_name, _ = detailed_signal.split('::')
         | 
| 60 59 | 
             
                sig_info = object.class.find_signal signal_name
         | 
| 61 60 |  | 
| 62 61 | 
             
                closure = sig_info.wrap_in_closure { |*args| block.call(*args << data) }
         | 
| 63 62 |  | 
| 64 | 
            -
                 | 
| 65 | 
            -
             | 
| 63 | 
            +
                signal_connect_closure object, detailed_signal, closure, after
         | 
| 64 | 
            +
              end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
              def self.signal_connect_after object, detailed_signal, data = nil, &block
         | 
| 67 | 
            +
                signal_connect object, detailed_signal, data, true, &block
         | 
| 66 68 | 
             
              end
         | 
| 67 69 |  | 
| 68 70 | 
             
              # Smells of :reek:LongParameterList: due to the C interface.
         | 
| 71 | 
            +
              # rubocop:disable Metrics/ParameterLists
         | 
| 69 72 | 
             
              def self.param_spec_int name, nick, blurb, minimum, maximum, default_value, flags
         | 
| 70 73 | 
             
                ptr = Lib.g_param_spec_int(name, nick, blurb, minimum, maximum,
         | 
| 71 74 | 
             
                                           default_value, flags)
         | 
| @@ -3,7 +3,7 @@ module GObjectIntrospection | |
| 3 3 | 
             
              # Decendant types will be implemented as needed.
         | 
| 4 4 | 
             
              class IBaseInfo
         | 
| 5 5 | 
             
                def initialize ptr, lib = Lib
         | 
| 6 | 
            -
                  raise ArgumentError,  | 
| 6 | 
            +
                  raise ArgumentError, 'ptr must not be null' if ptr.null?
         | 
| 7 7 |  | 
| 8 8 | 
             
                  unless defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx'
         | 
| 9 9 | 
             
                    ObjectSpace.define_finalizer self, self.class.make_finalizer(lib, ptr)
         | 
| @@ -39,7 +39,7 @@ module GObjectIntrospection | |
| 39 39 | 
             
                def self.build_array_method method, single = nil
         | 
| 40 40 | 
             
                  method = method.to_s
         | 
| 41 41 | 
             
                  single ||= method.to_s[0..-2]
         | 
| 42 | 
            -
                  count = method.sub(/^(get_)?/,  | 
| 42 | 
            +
                  count = method.sub(/^(get_)?/, '\\1n_')
         | 
| 43 43 | 
             
                  class_eval <<-CODE
         | 
| 44 44 | 
             
                    def #{method}
         | 
| 45 45 | 
             
                      (0..(#{count} - 1)).map do |i|
         | 
| @@ -67,7 +67,7 @@ module GObjectIntrospection | |
| 67 67 | 
             
                #
         | 
| 68 68 | 
             
                def self.build_finder_method method, counter = nil, fetcher = nil
         | 
| 69 69 | 
             
                  method = method.to_s
         | 
| 70 | 
            -
                  single = method.sub(/^find_/,  | 
| 70 | 
            +
                  single = method.sub(/^find_/, '')
         | 
| 71 71 | 
             
                  counter ||= "n_#{single}s"
         | 
| 72 72 | 
             
                  fetcher ||= "#{single}"
         | 
| 73 73 | 
             
                  class_eval <<-CODE
         | 
| @@ -21,6 +21,7 @@ require 'ffi-gobject_introspection/i_value_info' | |
| 21 21 | 
             
            require 'ffi-gobject_introspection/i_union_info'
         | 
| 22 22 | 
             
            require 'ffi-gobject_introspection/i_enum_info'
         | 
| 23 23 | 
             
            require 'ffi-gobject_introspection/i_flags_info'
         | 
| 24 | 
            +
            require 'ffi-gobject_introspection/i_unresolved_info'
         | 
| 24 25 |  | 
| 25 26 | 
             
            GObject.type_init
         | 
| 26 27 |  | 
| @@ -30,6 +31,8 @@ module GObjectIntrospection | |
| 30 31 | 
             
              # This class wraps the GIRepository struct.
         | 
| 31 32 | 
             
              class IRepository
         | 
| 32 33 | 
             
                # Map info type to class. Default is IBaseInfo.
         | 
| 34 | 
            +
                # SMELL: This doesn't really belong here, since it is used by IBaseInfo and
         | 
| 35 | 
            +
                # descendants as well.
         | 
| 33 36 | 
             
                TYPEMAP = {
         | 
| 34 37 | 
             
                  invalid:                  IBaseInfo,
         | 
| 35 38 | 
             
                  function:                 IFunctionInfo,
         | 
| @@ -51,7 +54,7 @@ module GObjectIntrospection | |
| 51 54 | 
             
                  field:                    IFieldInfo,
         | 
| 52 55 | 
             
                  arg:                      IArgInfo,
         | 
| 53 56 | 
             
                  type:                     ITypeInfo,
         | 
| 54 | 
            -
                  unresolved:                | 
| 57 | 
            +
                  unresolved:               IUnresolvedInfo
         | 
| 55 58 | 
             
                }
         | 
| 56 59 |  | 
| 57 60 | 
             
                def initialize
         | 
| @@ -1,36 +1,44 @@ | |
| 1 | 
            -
             | 
| 2 | 
            -
             | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 5 | 
            -
                 | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 1 | 
            +
            module GirFFI
         | 
| 2 | 
            +
              module Builders
         | 
| 3 | 
            +
                # Builder that generates code to convert values from C to Ruby. Used by
         | 
| 4 | 
            +
                # argument builders.
         | 
| 5 | 
            +
                class CToRubyConvertor
         | 
| 6 | 
            +
                  def initialize type_info, argument_name, length_arg
         | 
| 7 | 
            +
                    @type_info = type_info
         | 
| 8 | 
            +
                    @argument_name = argument_name
         | 
| 9 | 
            +
                    @length_arg = length_arg
         | 
| 10 | 
            +
                  end
         | 
| 9 11 |  | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 12 | 
            +
                  def conversion
         | 
| 13 | 
            +
                    case @type_info.flattened_tag
         | 
| 14 | 
            +
                    when :utf8, :filename
         | 
| 15 | 
            +
                      "#{@argument_name}.to_utf8"
         | 
| 16 | 
            +
                    else
         | 
| 17 | 
            +
                      "#{@type_info.argument_class_name}.wrap(#{conversion_argument_list})"
         | 
| 18 | 
            +
                    end
         | 
| 19 | 
            +
                  end
         | 
| 18 20 |  | 
| 19 | 
            -
             | 
| 21 | 
            +
                  private
         | 
| 20 22 |  | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
                   | 
| 24 | 
            -
             | 
| 25 | 
            -
                   | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 23 | 
            +
                  def conversion_argument_list
         | 
| 24 | 
            +
                    conversion_arguments.join(', ')
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                  def conversion_arguments
         | 
| 28 | 
            +
                    if @type_info.flattened_tag == :c
         | 
| 29 | 
            +
                      [@type_info.element_type.inspect, array_size, @argument_name]
         | 
| 30 | 
            +
                    else
         | 
| 31 | 
            +
                      @type_info.extra_conversion_arguments.map(&:inspect).push(@argument_name)
         | 
| 32 | 
            +
                    end
         | 
| 33 | 
            +
                  end
         | 
| 28 34 |  | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 35 | 
            +
                  def array_size
         | 
| 36 | 
            +
                    if @length_arg
         | 
| 37 | 
            +
                      @length_arg
         | 
| 38 | 
            +
                    else
         | 
| 39 | 
            +
                      @type_info.array_fixed_size
         | 
| 40 | 
            +
                    end
         | 
| 41 | 
            +
                  end
         | 
| 34 42 | 
             
                end
         | 
| 35 43 | 
             
              end
         | 
| 36 44 | 
             
            end
         | 
| @@ -16,39 +16,47 @@ module GirFFI | |
| 16 16 | 
             
                    @pre_converted_name ||= new_variable
         | 
| 17 17 | 
             
                  end
         | 
| 18 18 |  | 
| 19 | 
            +
                  def out_parameter_name
         | 
| 20 | 
            +
                    @out_parameter_name ||=
         | 
| 21 | 
            +
                      if direction == :inout
         | 
| 22 | 
            +
                        new_variable
         | 
| 23 | 
            +
                      else
         | 
| 24 | 
            +
                        pre_converted_name
         | 
| 25 | 
            +
                      end
         | 
| 26 | 
            +
                  end
         | 
| 27 | 
            +
             | 
| 19 28 | 
             
                  def call_argument_name
         | 
| 20 | 
            -
                    if  | 
| 29 | 
            +
                    if [:in, :inout].include? direction
         | 
| 21 30 | 
             
                      pre_converted_name unless array_arg
         | 
| 22 31 | 
             
                    end
         | 
| 23 32 | 
             
                  end
         | 
| 24 33 |  | 
| 25 34 | 
             
                  def capture_variable_name
         | 
| 26 | 
            -
                    result_name if direction  | 
| 35 | 
            +
                    result_name if [:out, :inout].include? direction unless array_arg
         | 
| 27 36 | 
             
                  end
         | 
| 28 37 |  | 
| 29 38 | 
             
                  def pre_conversion
         | 
| 30 39 | 
             
                    case direction
         | 
| 31 40 | 
             
                    when :in
         | 
| 32 | 
            -
                      [ | 
| 41 | 
            +
                      [ingoing_pre_conversion]
         | 
| 33 42 | 
             
                    when :out
         | 
| 34 | 
            -
                      [ | 
| 43 | 
            +
                      [out_parameter_preparation]
         | 
| 44 | 
            +
                    when :inout
         | 
| 45 | 
            +
                      [out_parameter_preparation, ingoing_pre_conversion]
         | 
| 35 46 | 
             
                    when :error
         | 
| 36 | 
            -
                      [
         | 
| 37 | 
            -
                        "#{pre_converted_name} = #{out_parameter_preparation}",
         | 
| 38 | 
            -
                        "begin"
         | 
| 39 | 
            -
                      ]
         | 
| 47 | 
            +
                      [out_parameter_preparation, 'begin']
         | 
| 40 48 | 
             
                    end
         | 
| 41 49 | 
             
                  end
         | 
| 42 50 |  | 
| 43 51 | 
             
                  def post_conversion
         | 
| 44 52 | 
             
                    case direction
         | 
| 45 | 
            -
                    when :out
         | 
| 53 | 
            +
                    when :out, :inout
         | 
| 46 54 | 
             
                      [outgoing_post_conversion]
         | 
| 47 55 | 
             
                    when :error
         | 
| 48 56 | 
             
                      [
         | 
| 49 57 | 
             
                        "rescue => #{result_name}",
         | 
| 50 58 | 
             
                        outgoing_post_conversion,
         | 
| 51 | 
            -
                         | 
| 59 | 
            +
                        'end'
         | 
| 52 60 | 
             
                      ]
         | 
| 53 61 | 
             
                    else
         | 
| 54 62 | 
             
                      []
         | 
| @@ -61,15 +69,23 @@ module GirFFI | |
| 61 69 | 
             
                    @result_name ||= new_variable
         | 
| 62 70 | 
             
                  end
         | 
| 63 71 |  | 
| 72 | 
            +
                  def pre_convertor_argument
         | 
| 73 | 
            +
                    if direction == :inout
         | 
| 74 | 
            +
                      "#{out_parameter_name}.to_value"
         | 
| 75 | 
            +
                    else
         | 
| 76 | 
            +
                      method_argument_name
         | 
| 77 | 
            +
                    end
         | 
| 78 | 
            +
                  end
         | 
| 79 | 
            +
             | 
| 64 80 | 
             
                  def pre_convertor
         | 
| 65 81 | 
             
                    @pre_convertor ||= if closure?
         | 
| 66 | 
            -
                                         ClosureConvertor.new( | 
| 82 | 
            +
                                         ClosureConvertor.new(pre_convertor_argument)
         | 
| 67 83 | 
             
                                       elsif needs_c_to_ruby_conversion?
         | 
| 68 84 | 
             
                                         CToRubyConvertor.new(type_info,
         | 
| 69 | 
            -
                                                               | 
| 85 | 
            +
                                                              pre_convertor_argument,
         | 
| 70 86 | 
             
                                                              length_argument_name)
         | 
| 71 87 | 
             
                                       else
         | 
| 72 | 
            -
                                         NullConvertor.new( | 
| 88 | 
            +
                                         NullConvertor.new(pre_convertor_argument)
         | 
| 73 89 | 
             
                                       end
         | 
| 74 90 | 
             
                  end
         | 
| 75 91 |  | 
| @@ -77,34 +93,48 @@ module GirFFI | |
| 77 93 | 
             
                    type_info.needs_c_to_ruby_conversion_for_callbacks?
         | 
| 78 94 | 
             
                  end
         | 
| 79 95 |  | 
| 96 | 
            +
                  def ingoing_pre_conversion
         | 
| 97 | 
            +
                    "#{pre_converted_name} = #{pre_convertor.conversion}"
         | 
| 98 | 
            +
                  end
         | 
| 99 | 
            +
             | 
| 80 100 | 
             
                  def outgoing_post_conversion
         | 
| 81 | 
            -
                    "#{ | 
| 101 | 
            +
                    "#{out_parameter_name}.set_value #{post_convertor.conversion}"
         | 
| 82 102 | 
             
                  end
         | 
| 83 103 |  | 
| 84 | 
            -
                  def  | 
| 85 | 
            -
                    @ | 
| 86 | 
            -
             | 
| 87 | 
            -
             | 
| 88 | 
            -
             | 
| 89 | 
            -
             | 
| 104 | 
            +
                  def post_convertor
         | 
| 105 | 
            +
                    @post_convertor ||= if type_info.needs_ruby_to_c_conversion_for_callbacks?
         | 
| 106 | 
            +
                                          RubyToCConvertor.new(type_info, post_convertor_argument)
         | 
| 107 | 
            +
                                        else
         | 
| 108 | 
            +
                                          NullConvertor.new(post_convertor_argument)
         | 
| 109 | 
            +
                                        end
         | 
| 90 110 | 
             
                  end
         | 
| 91 111 |  | 
| 92 | 
            -
                  def  | 
| 93 | 
            -
                     | 
| 94 | 
            -
             | 
| 95 | 
            -
                      "GirFFI::InOutPointer.new(#{type_spec[1].inspect})" \
         | 
| 96 | 
            -
                        ".tap { |ptr| #{method_argument_name}.put_pointer 0, ptr }"
         | 
| 112 | 
            +
                  def post_convertor_argument
         | 
| 113 | 
            +
                    if array_arg
         | 
| 114 | 
            +
                      "#{array_arg.capture_variable_name}.length"
         | 
| 97 115 | 
             
                    else
         | 
| 98 | 
            -
                       | 
| 116 | 
            +
                      result_name
         | 
| 99 117 | 
             
                    end
         | 
| 100 118 | 
             
                  end
         | 
| 101 119 |  | 
| 120 | 
            +
                  def out_parameter_preparation
         | 
| 121 | 
            +
                    type_spec = type_info.tag_or_class
         | 
| 122 | 
            +
                    value = if allocated_by_us?
         | 
| 123 | 
            +
                              "GirFFI::InOutPointer.new(#{type_spec[1].inspect})" \
         | 
| 124 | 
            +
                                ".tap { |ptr| #{method_argument_name}.put_pointer 0, ptr }"
         | 
| 125 | 
            +
                            else
         | 
| 126 | 
            +
                              "GirFFI::InOutPointer.new(#{type_spec.inspect}, #{method_argument_name})"
         | 
| 127 | 
            +
                            end
         | 
| 128 | 
            +
                    "#{out_parameter_name} = #{value}"
         | 
| 129 | 
            +
                  end
         | 
| 130 | 
            +
             | 
| 102 131 | 
             
                  # Check if an out argument needs to be allocated by us, the callee. Since
         | 
| 103 132 | 
             
                  # caller_allocates is false by default, we must also check that the type
         | 
| 104 133 | 
             
                  # is a pointer. For example, an out parameter of type gint8* will always
         | 
| 105 134 | 
             
                  # be allocate by the caller.
         | 
| 106 135 | 
             
                  def allocated_by_us?
         | 
| 107 | 
            -
                     | 
| 136 | 
            +
                    direction == :out &&
         | 
| 137 | 
            +
                      !@arginfo.caller_allocates? &&
         | 
| 108 138 | 
             
                      type_info.pointer? &&
         | 
| 109 139 | 
             
                      ![:object, :zero_terminated].include?(specialized_type_tag)
         | 
| 110 140 | 
             
                  end
         | 
| @@ -1,11 +1,15 @@ | |
| 1 | 
            -
             | 
| 2 | 
            -
             | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 5 | 
            -
                 | 
| 6 | 
            -
             | 
| 1 | 
            +
            module GirFFI
         | 
| 2 | 
            +
              module Builders
         | 
| 3 | 
            +
                # Builder that generates code to convert closure arguments ('user data')
         | 
| 4 | 
            +
                # from C to Ruby. Used by argument builders.
         | 
| 5 | 
            +
                class ClosureConvertor
         | 
| 6 | 
            +
                  def initialize argument_name
         | 
| 7 | 
            +
                    @argument_name = argument_name
         | 
| 8 | 
            +
                  end
         | 
| 7 9 |  | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            +
                  def conversion
         | 
| 11 | 
            +
                    "GirFFI::ArgHelper::OBJECT_STORE.fetch(#{@argument_name})"
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
                end
         | 
| 10 14 | 
             
              end
         | 
| 11 15 | 
             
            end
         | 
| @@ -1,11 +1,15 @@ | |
| 1 | 
            -
             | 
| 2 | 
            -
             | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 5 | 
            -
                 | 
| 6 | 
            -
             | 
| 1 | 
            +
            module GirFFI
         | 
| 2 | 
            +
              module Builders
         | 
| 3 | 
            +
                # Builder that generates code to convert closure arguments ('user data')
         | 
| 4 | 
            +
                # from Ruby to C. Used by argument builders.
         | 
| 5 | 
            +
                class ClosureToPointerConvertor
         | 
| 6 | 
            +
                  def initialize argument_name
         | 
| 7 | 
            +
                    @argument_name = argument_name
         | 
| 8 | 
            +
                  end
         | 
| 7 9 |  | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            +
                  def conversion
         | 
| 11 | 
            +
                    "GirFFI::InPointer.from_closure_data(#{@argument_name})"
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
                end
         | 
| 10 14 | 
             
              end
         | 
| 11 15 | 
             
            end
         | 
| @@ -1,10 +1,14 @@ | |
| 1 | 
            -
             | 
| 2 | 
            -
             | 
| 3 | 
            -
             | 
| 4 | 
            -
                 | 
| 5 | 
            -
             | 
| 1 | 
            +
            module GirFFI
         | 
| 2 | 
            +
              module Builders
         | 
| 3 | 
            +
                # Builds conversion code for the result of a GObject constructor method.
         | 
| 4 | 
            +
                class ConstructorResultConvertor
         | 
| 5 | 
            +
                  def initialize argument_name
         | 
| 6 | 
            +
                    @argument_name = argument_name
         | 
| 7 | 
            +
                  end
         | 
| 6 8 |  | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            +
                  def conversion
         | 
| 10 | 
            +
                    "self.constructor_wrap(#{@argument_name})"
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
                end
         | 
| 9 13 | 
             
              end
         | 
| 10 14 | 
             
            end
         |