gir_ffi 0.15.1 → 0.15.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Changelog.md +42 -0
- data/README.md +10 -10
- data/TODO.md +14 -35
- data/docs/Documentation.md +6 -0
- data/docs/Subclassing.md +38 -0
- data/lib/ffi-glib.rb +8 -3
- data/lib/ffi-glib/byte_array.rb +2 -1
- data/lib/ffi-glib/container_class_methods.rb +1 -3
- data/lib/ffi-glib/destroy_notify.rb +2 -2
- data/lib/ffi-glib/hash_table.rb +1 -2
- data/lib/ffi-glib/list.rb +11 -5
- data/lib/ffi-glib/list_methods.rb +12 -0
- data/lib/ffi-glib/s_list.rb +10 -4
- data/lib/ffi-gobject.rb +2 -5
- data/lib/ffi-gobject/object.rb +102 -92
- data/lib/ffi-gobject/object_class.rb +1 -1
- data/lib/ffi-gobject/ruby_closure.rb +1 -1
- data/lib/ffi-gobject/value.rb +108 -117
- data/lib/ffi-gobject_introspection/i_base_info.rb +35 -27
- data/lib/ffi-gobject_introspection/lib.rb +1 -1
- data/lib/gir_ffi-base/gobject/lib.rb +4 -0
- data/lib/gir_ffi/array_element_convertor.rb +2 -3
- data/lib/gir_ffi/boxed_base.rb +13 -11
- data/lib/gir_ffi/builder.rb +3 -4
- data/lib/gir_ffi/builder_helper.rb +10 -2
- data/lib/gir_ffi/builders/base_argument_builder.rb +2 -2
- data/lib/gir_ffi/builders/base_method_builder.rb +1 -1
- data/lib/gir_ffi/builders/base_type_builder.rb +1 -1
- data/lib/gir_ffi/builders/callback_argument_builder.rb +2 -0
- data/lib/gir_ffi/builders/callback_builder.rb +25 -11
- data/lib/gir_ffi/builders/callback_return_value_builder.rb +4 -6
- data/lib/gir_ffi/builders/enum_builder.rb +9 -5
- data/lib/gir_ffi/builders/field_builder.rb +2 -1
- data/lib/gir_ffi/builders/function_builder.rb +1 -1
- data/lib/gir_ffi/builders/interface_builder.rb +3 -1
- data/lib/gir_ffi/builders/mapping_method_builder.rb +1 -1
- data/lib/gir_ffi/builders/marshalling_method_builder.rb +5 -2
- data/lib/gir_ffi/builders/method_template.rb +4 -4
- data/lib/gir_ffi/builders/module_builder.rb +4 -2
- data/lib/gir_ffi/builders/null_argument_builder.rb +0 -2
- data/lib/gir_ffi/builders/null_return_value_builder.rb +0 -2
- data/lib/gir_ffi/builders/object_builder.rb +18 -6
- data/lib/gir_ffi/builders/property_builder.rb +1 -2
- data/lib/gir_ffi/builders/signal_closure_builder.rb +3 -5
- data/lib/gir_ffi/builders/struct_builder.rb +34 -7
- data/lib/gir_ffi/builders/user_defined_builder.rb +8 -1
- data/lib/gir_ffi/builders/vfunc_argument_builder.rb +1 -1
- data/lib/gir_ffi/callback_base.rb +7 -8
- data/lib/gir_ffi/class_base.rb +1 -0
- data/lib/gir_ffi/core.rb +17 -2
- data/lib/gir_ffi/glib_error.rb +1 -2
- data/lib/gir_ffi/in_pointer.rb +7 -0
- data/lib/gir_ffi/object_base.rb +27 -0
- data/lib/gir_ffi/return_value_info.rb +1 -2
- data/lib/gir_ffi/struct_base.rb +1 -9
- data/lib/gir_ffi/struct_like_base.rb +9 -5
- data/lib/gir_ffi/type_map.rb +1 -0
- data/lib/gir_ffi/unintrospectable_type_info.rb +1 -1
- data/lib/gir_ffi/union_base.rb +1 -9
- data/lib/gir_ffi/user_defined_object_info.rb +3 -2
- data/lib/gir_ffi/version.rb +1 -1
- data/lib/gir_ffi/vfunc_implementation.rb +1 -0
- metadata +106 -143
- data/Gemfile +0 -14
- data/Rakefile +0 -9
- data/tasks/test.rake +0 -204
- data/test/base_test_helper.rb +0 -70
- data/test/ffi-glib/array_test.rb +0 -203
- data/test/ffi-glib/byte_array_test.rb +0 -28
- data/test/ffi-glib/bytes_test.rb +0 -61
- data/test/ffi-glib/closure_test.rb +0 -38
- data/test/ffi-glib/destroy_notify_test.rb +0 -18
- data/test/ffi-glib/hash_table_test.rb +0 -68
- data/test/ffi-glib/list_test.rb +0 -86
- data/test/ffi-glib/main_loop_test.rb +0 -53
- data/test/ffi-glib/ptr_array_test.rb +0 -112
- data/test/ffi-glib/ruby_closure_test.rb +0 -62
- data/test/ffi-glib/s_list_test.rb +0 -76
- data/test/ffi-glib/strv_test.rb +0 -60
- data/test/ffi-glib/variant_test.rb +0 -12
- data/test/ffi-gobject/gobject_test.rb +0 -76
- data/test/ffi-gobject/object_class_test.rb +0 -31
- data/test/ffi-gobject/object_test.rb +0 -122
- data/test/ffi-gobject/param_spec_test.rb +0 -32
- data/test/ffi-gobject/value_test.rb +0 -390
- data/test/ffi-gobject_introspection/gobject_type_init_test.rb +0 -26
- data/test/ffi-gobject_introspection/i_base_info_test.rb +0 -52
- data/test/ffi-gobject_introspection/i_constant_info_test.rb +0 -29
- data/test/ffi-gobject_introspection/i_enum_info_test.rb +0 -18
- data/test/ffi-gobject_introspection/i_function_info_test.rb +0 -6
- data/test/ffi-gobject_introspection/i_interface_info_test.rb +0 -23
- data/test/ffi-gobject_introspection/i_object_info_test.rb +0 -49
- data/test/ffi-gobject_introspection/i_property_info_test.rb +0 -47
- data/test/ffi-gobject_introspection/i_registered_type_info_test.rb +0 -27
- data/test/ffi-gobject_introspection/i_repository_test.rb +0 -81
- data/test/ffi-gobject_introspection/i_struct_info_test.rb +0 -23
- data/test/ffi-gobject_introspection/i_type_info_test.rb +0 -30
- data/test/ffi-gobject_introspection/i_union_info_test.rb +0 -17
- data/test/ffi-gobject_introspection/i_vfunc_info_test.rb +0 -41
- data/test/ffi-gobject_introspection/lib_test.rb +0 -13
- data/test/ffi-gobject_introspection/strv_test.rb +0 -46
- data/test/ffi-gobject_test.rb +0 -151
- data/test/gir_ffi/allocation_helper_test.rb +0 -36
- data/test/gir_ffi/arg_helper_test.rb +0 -139
- data/test/gir_ffi/boolean_test.rb +0 -43
- data/test/gir_ffi/boxed_base_test.rb +0 -65
- data/test/gir_ffi/builder_test.rb +0 -322
- data/test/gir_ffi/builders/argument_builder_test.rb +0 -651
- data/test/gir_ffi/builders/base_argument_builder_test.rb +0 -6
- data/test/gir_ffi/builders/callback_argument_builder_test.rb +0 -126
- data/test/gir_ffi/builders/callback_builder_test.rb +0 -117
- data/test/gir_ffi/builders/callback_return_value_builder_test.rb +0 -81
- data/test/gir_ffi/builders/constant_builder_test.rb +0 -6
- data/test/gir_ffi/builders/constructor_builder_test.rb +0 -37
- data/test/gir_ffi/builders/enum_builder_test.rb +0 -23
- data/test/gir_ffi/builders/field_builder_test.rb +0 -134
- data/test/gir_ffi/builders/function_builder_test.rb +0 -550
- data/test/gir_ffi/builders/initializer_builder_test.rb +0 -54
- data/test/gir_ffi/builders/interface_builder_test.rb +0 -32
- data/test/gir_ffi/builders/module_builder_test.rb +0 -43
- data/test/gir_ffi/builders/object_builder_test.rb +0 -98
- data/test/gir_ffi/builders/property_builder_test.rb +0 -158
- data/test/gir_ffi/builders/registered_type_builder_test.rb +0 -54
- data/test/gir_ffi/builders/return_value_builder_test.rb +0 -433
- data/test/gir_ffi/builders/signal_closure_builder_test.rb +0 -197
- data/test/gir_ffi/builders/struct_builder_test.rb +0 -93
- data/test/gir_ffi/builders/unintrospectable_boxed_builder_test.rb +0 -29
- data/test/gir_ffi/builders/unintrospectable_builder_test.rb +0 -84
- data/test/gir_ffi/builders/union_builder_test.rb +0 -28
- data/test/gir_ffi/builders/user_defined_builder_test.rb +0 -524
- data/test/gir_ffi/builders/vfunc_argument_builder_test.rb +0 -101
- data/test/gir_ffi/builders/vfunc_builder_test.rb +0 -241
- data/test/gir_ffi/callback_base_test.rb +0 -22
- data/test/gir_ffi/class_base_test.rb +0 -166
- data/test/gir_ffi/core_test.rb +0 -98
- data/test/gir_ffi/enum_base_test.rb +0 -43
- data/test/gir_ffi/error_type_info_test.rb +0 -50
- data/test/gir_ffi/ffi_ext/pointer_test.rb +0 -20
- data/test/gir_ffi/g_type_test.rb +0 -31
- data/test/gir_ffi/in_pointer_test.rb +0 -203
- data/test/gir_ffi/info_ext/i_callable_info_test.rb +0 -26
- data/test/gir_ffi/info_ext/i_callback_info_test.rb +0 -21
- data/test/gir_ffi/info_ext/i_field_info_test.rb +0 -37
- data/test/gir_ffi/info_ext/i_function_info_test.rb +0 -74
- data/test/gir_ffi/info_ext/i_signal_info_test.rb +0 -32
- data/test/gir_ffi/info_ext/i_type_info_test.rb +0 -711
- data/test/gir_ffi/info_ext/i_unresolved_info_test.rb +0 -19
- data/test/gir_ffi/info_ext/safe_constant_name_test.rb +0 -26
- data/test/gir_ffi/info_ext/safe_function_name_test.rb +0 -26
- data/test/gir_ffi/interface_base_test.rb +0 -20
- data/test/gir_ffi/method_stubber_test.rb +0 -65
- data/test/gir_ffi/object_base_test.rb +0 -64
- data/test/gir_ffi/object_store_test.rb +0 -41
- data/test/gir_ffi/receiver_argument_info_test.rb +0 -33
- data/test/gir_ffi/sized_array_test.rb +0 -206
- data/test/gir_ffi/struct_base_test.rb +0 -23
- data/test/gir_ffi/struct_like_base_test.rb +0 -167
- data/test/gir_ffi/type_map_test.rb +0 -17
- data/test/gir_ffi/unintrospectable_type_info_test.rb +0 -121
- data/test/gir_ffi/union_base_test.rb +0 -23
- data/test/gir_ffi/user_defined_object_info_test.rb +0 -119
- data/test/gir_ffi/user_defined_property_info_test.rb +0 -39
- data/test/gir_ffi/variable_name_generator_test.rb +0 -18
- data/test/gir_ffi/version_test.rb +0 -9
- data/test/gir_ffi/zero_terminated_test.rb +0 -108
- data/test/gir_ffi_test_helper.rb +0 -84
- data/test/integration/callback_exceptions_test.rb +0 -59
- data/test/integration/derived_classes_test.rb +0 -53
- data/test/integration/generated_everything_test.rb +0 -452
- data/test/integration/generated_gimarshallingtests_test.rb +0 -3096
- data/test/integration/generated_gio_test.rb +0 -116
- data/test/integration/generated_glib_test.rb +0 -10
- data/test/integration/generated_gobject_test.rb +0 -124
- data/test/integration/generated_gst_test.rb +0 -38
- data/test/integration/generated_gtk_source_test.rb +0 -32
- data/test/integration/generated_gtop_test.rb +0 -22
- data/test/integration/generated_pango_ft2_test.rb +0 -17
- data/test/integration/generated_pango_test.rb +0 -24
- data/test/integration/generated_regress_test.rb +0 -4038
- data/test/integration/generated_secret_test.rb +0 -14
- data/test/integration/generated_utility_test.rb +0 -174
- data/test/integration/generated_warnlib_test.rb +0 -43
- data/test/integration/method_lookup_test.rb +0 -34
- data/test/introspection_test_helper.rb +0 -93
- data/test/lib/Makefile.am +0 -110
- data/test/lib/autogen.sh +0 -4
- data/test/lib/configure.ac +0 -34
- data/test/lib/m4/jhflags.m4 +0 -21
- data/test/minitest/stats_plugin.rb +0 -30
data/lib/gir_ffi/builder.rb
CHANGED
@@ -23,9 +23,8 @@ module GirFFI
|
|
23
23
|
fund = GObject.type_fundamental gtype
|
24
24
|
if fund == GObject::TYPE_BOXED
|
25
25
|
UnintrospectableBoxedInfo.new gtype
|
26
|
-
elsif fund == GObject::TYPE_OBJECT
|
27
|
-
|
28
|
-
elsif fund >= GObject::TYPE_RESERVED_USER_FIRST
|
26
|
+
elsif fund == GObject::TYPE_OBJECT ||
|
27
|
+
fund >= GObject::TYPE_RESERVED_USER_FIRST
|
29
28
|
UnintrospectableTypeInfo.new gtype
|
30
29
|
else
|
31
30
|
raise "Unable to handle type #{GObject.type_name gtype}"
|
@@ -47,7 +46,7 @@ module GirFFI
|
|
47
46
|
end
|
48
47
|
Builders::ModuleBuilder.new(module_name,
|
49
48
|
namespace: namespace,
|
50
|
-
version:
|
49
|
+
version: version).generate
|
51
50
|
end
|
52
51
|
|
53
52
|
# TODO: Move elsewhere, perhaps to FunctionBuilder.
|
@@ -11,8 +11,16 @@ module GirFFI
|
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
-
def get_or_define_class(namespace, name, parent)
|
15
|
-
optionally_define_constant(namespace, name)
|
14
|
+
def get_or_define_class(namespace, name, parent = nil)
|
15
|
+
klass = optionally_define_constant(namespace, name) do
|
16
|
+
parent ||= yield
|
17
|
+
Class.new parent
|
18
|
+
end
|
19
|
+
if parent && klass.superclass != parent
|
20
|
+
raise "Expected #{klass} to have superclass #{parent}, found #{klass.superclass}"
|
21
|
+
end
|
22
|
+
|
23
|
+
klass
|
16
24
|
end
|
17
25
|
|
18
26
|
def get_or_define_module(parent, name)
|
@@ -59,7 +59,7 @@ module GirFFI
|
|
59
59
|
@argument_builder_collection ||=
|
60
60
|
ArgumentBuilderCollection.new(return_value_builder, argument_builders,
|
61
61
|
error_argument_builder: error_argument,
|
62
|
-
receiver_builder:
|
62
|
+
receiver_builder: receiver_builder)
|
63
63
|
end
|
64
64
|
|
65
65
|
def error_argument
|
@@ -16,6 +16,20 @@ module GirFFI
|
|
16
16
|
klass.class_eval mapping_method_definition, __FILE__, __LINE__
|
17
17
|
end
|
18
18
|
|
19
|
+
def mapping_method_definition
|
20
|
+
MappingMethodBuilder.for_callback(info).method_definition
|
21
|
+
end
|
22
|
+
|
23
|
+
def argument_ffi_types
|
24
|
+
@argument_ffi_types ||= @info.argument_ffi_types
|
25
|
+
end
|
26
|
+
|
27
|
+
def return_ffi_type
|
28
|
+
@return_ffi_type ||= @info.return_ffi_type
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
19
33
|
def setup_callback
|
20
34
|
optionally_define_constant klass, :Callback do
|
21
35
|
lib.callback callback_sym, argument_ffi_types, return_ffi_type
|
@@ -23,24 +37,24 @@ module GirFFI
|
|
23
37
|
end
|
24
38
|
|
25
39
|
def klass
|
26
|
-
@klass ||= get_or_define_class
|
40
|
+
@klass ||= get_or_define_class container_module, @classname, CallbackBase
|
27
41
|
end
|
28
42
|
|
29
|
-
def
|
30
|
-
|
43
|
+
def container_module
|
44
|
+
@container_module ||=
|
45
|
+
if @info.container
|
46
|
+
type_info = @info.container
|
47
|
+
field_info = type_info.container
|
48
|
+
container_class_info = field_info.container
|
49
|
+
namespace_module.const_get container_class_info.safe_name
|
50
|
+
else
|
51
|
+
namespace_module
|
52
|
+
end
|
31
53
|
end
|
32
54
|
|
33
55
|
def callback_sym
|
34
56
|
@classname.to_sym
|
35
57
|
end
|
36
|
-
|
37
|
-
def argument_ffi_types
|
38
|
-
@argument_ffi_types ||= @info.argument_ffi_types
|
39
|
-
end
|
40
|
-
|
41
|
-
def return_ffi_type
|
42
|
-
@return_ffi_type ||= @info.return_ffi_type
|
43
|
-
end
|
44
58
|
end
|
45
59
|
end
|
46
60
|
end
|
@@ -9,11 +9,7 @@ module GirFFI
|
|
9
9
|
# callbacks.
|
10
10
|
class CallbackReturnValueBuilder < BaseReturnValueBuilder
|
11
11
|
def post_conversion
|
12
|
-
|
13
|
-
optional_outgoing_ref + base_post_conversion
|
14
|
-
else
|
15
|
-
[]
|
16
|
-
end
|
12
|
+
optional_outgoing_ref + base_post_conversion
|
17
13
|
end
|
18
14
|
|
19
15
|
private
|
@@ -35,7 +31,9 @@ module GirFFI
|
|
35
31
|
end
|
36
32
|
|
37
33
|
def base_post_conversion
|
38
|
-
if
|
34
|
+
if !has_post_conversion?
|
35
|
+
[]
|
36
|
+
elsif specialized_type_tag == :object
|
39
37
|
["#{post_converted_name} = #{post_convertor.conversion}.to_ptr"]
|
40
38
|
else
|
41
39
|
["#{post_converted_name} = #{post_convertor.conversion}"]
|
@@ -16,7 +16,7 @@ module GirFFI
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def value_spec
|
19
|
-
|
19
|
+
value_infos.map do |vinfo|
|
20
20
|
val = GirFFI::ArgHelper.cast_uint32_to_int32(vinfo.value)
|
21
21
|
[vinfo.name.to_sym, val]
|
22
22
|
end.flatten
|
@@ -42,7 +42,7 @@ module GirFFI
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def setup_value_constants
|
45
|
-
|
45
|
+
value_infos.each do |vinfo|
|
46
46
|
optionally_define_constant klass, vinfo.constant_name do
|
47
47
|
vinfo.value
|
48
48
|
end
|
@@ -51,9 +51,9 @@ module GirFFI
|
|
51
51
|
|
52
52
|
def setup_inspect
|
53
53
|
klass.instance_eval <<-RUBY, __FILE__, __LINE__ + 1
|
54
|
-
def self.inspect
|
55
|
-
"#{@namespace}::#{@classname}"
|
56
|
-
end
|
54
|
+
def self.inspect # def self.inspect
|
55
|
+
"#{@namespace}::#{@classname}" # "GFoo::Bar"
|
56
|
+
end # end
|
57
57
|
RUBY
|
58
58
|
end
|
59
59
|
|
@@ -64,6 +64,10 @@ module GirFFI
|
|
64
64
|
def superclass
|
65
65
|
EnumBase
|
66
66
|
end
|
67
|
+
|
68
|
+
def value_infos
|
69
|
+
@value_infos ||= info.values
|
70
|
+
end
|
67
71
|
end
|
68
72
|
end
|
69
73
|
end
|
@@ -58,7 +58,8 @@ module GirFFI
|
|
58
58
|
private
|
59
59
|
|
60
60
|
def pointer_to_value_conversion
|
61
|
-
PointerValueConvertor.new(field_type_tag)
|
61
|
+
PointerValueConvertor.new(field_type_tag)
|
62
|
+
.pointer_to_value(field_ptr, field_offset)
|
62
63
|
end
|
63
64
|
|
64
65
|
def field_offset
|
@@ -39,7 +39,7 @@ module GirFFI
|
|
39
39
|
def receiver_call_argument
|
40
40
|
container_type_info = ReceiverTypeInfo.new(container_info)
|
41
41
|
if @info.instance_ownership_transfer == :everything &&
|
42
|
-
|
42
|
+
container_type_info.flattened_tag == :object
|
43
43
|
"self.ref"
|
44
44
|
else
|
45
45
|
"self"
|
@@ -8,7 +8,9 @@ module GirFFI
|
|
8
8
|
# Implements the creation of a module representing an Interface.
|
9
9
|
class InterfaceBuilder < RegisteredTypeBuilder
|
10
10
|
def interface_struct
|
11
|
-
@interface_struct ||=
|
11
|
+
@interface_struct ||=
|
12
|
+
StructBuilder.new(iface_struct_info,
|
13
|
+
superclass: GObject::TypeInterface).build_class
|
12
14
|
end
|
13
15
|
|
14
16
|
private
|
@@ -12,13 +12,16 @@ module GirFFI
|
|
12
12
|
# handler. This method converts arguments from C to Ruby, and the
|
13
13
|
# result from Ruby to C.
|
14
14
|
class MarshallingMethodBuilder < BaseMethodBuilder
|
15
|
-
def self.for_signal(
|
15
|
+
def self.for_signal(info)
|
16
|
+
container_info = info.container
|
17
|
+
container_type_info = ReceiverTypeInfo.new(container_info)
|
18
|
+
receiver_info = ReceiverArgumentInfo.new(container_type_info)
|
16
19
|
new receiver_info, info
|
17
20
|
end
|
18
21
|
|
19
22
|
def initialize(receiver_info, info)
|
20
23
|
super(info, ClosureReturnValueBuilder,
|
21
|
-
receiver_info:
|
24
|
+
receiver_info: receiver_info,
|
22
25
|
argument_builder_class: ClosureArgumentBuilder)
|
23
26
|
end
|
24
27
|
|
@@ -18,10 +18,10 @@ module GirFFI
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def method_definition
|
21
|
-
code = "def #{qualified_method_name}"
|
22
|
-
code
|
23
|
-
method_lines.each { |line| code
|
24
|
-
code
|
21
|
+
code = +"def #{qualified_method_name}"
|
22
|
+
code << "(#{method_arguments.join(', ')})" if method_arguments.any?
|
23
|
+
method_lines.each { |line| code << "\n #{line}" }
|
24
|
+
code << "\nend\n"
|
25
25
|
end
|
26
26
|
|
27
27
|
private
|
@@ -43,7 +43,7 @@ module GirFFI
|
|
43
43
|
def find_namespaced_class_info(classname)
|
44
44
|
name = classname.to_s
|
45
45
|
info = gir.find_by_name(@namespace, name) ||
|
46
|
-
|
46
|
+
gir.find_by_name(@namespace, name.sub(/^./, &:downcase))
|
47
47
|
unless info
|
48
48
|
raise NameError,
|
49
49
|
"Class #{classname} not found in namespace #{@namespace}"
|
@@ -88,7 +88,9 @@ module GirFFI
|
|
88
88
|
lib.extend FFI::Library
|
89
89
|
lib.extend FFI::BitMasks
|
90
90
|
lib.ffi_lib_flags :global, :lazy
|
91
|
-
|
91
|
+
if shared_library_specification
|
92
|
+
lib.ffi_lib(*shared_library_specification.split(/,/))
|
93
|
+
end
|
92
94
|
end
|
93
95
|
|
94
96
|
def shared_library_specification
|
@@ -18,6 +18,10 @@ module GirFFI
|
|
18
18
|
ObjectBase
|
19
19
|
end
|
20
20
|
|
21
|
+
def object_class_struct
|
22
|
+
GObject::TypeClass
|
23
|
+
end
|
24
|
+
|
21
25
|
def ancestor_infos
|
22
26
|
[]
|
23
27
|
end
|
@@ -32,7 +36,16 @@ module GirFFI
|
|
32
36
|
end
|
33
37
|
|
34
38
|
def object_class_struct
|
35
|
-
@object_class_struct ||=
|
39
|
+
@object_class_struct ||=
|
40
|
+
begin
|
41
|
+
parent_struct = parent_builder.object_class_struct
|
42
|
+
if object_class_struct_info
|
43
|
+
StructBuilder.new(object_class_struct_info,
|
44
|
+
superclass: parent_struct).build_class
|
45
|
+
else
|
46
|
+
parent_struct
|
47
|
+
end
|
48
|
+
end
|
36
49
|
end
|
37
50
|
|
38
51
|
def ancestor_infos
|
@@ -48,8 +61,7 @@ module GirFFI
|
|
48
61
|
protected
|
49
62
|
|
50
63
|
def object_class_struct_info
|
51
|
-
@object_class_struct_info ||=
|
52
|
-
info.class_struct || parent_builder.object_class_struct_info
|
64
|
+
@object_class_struct_info ||= info.class_struct
|
53
65
|
end
|
54
66
|
|
55
67
|
private
|
@@ -107,9 +119,9 @@ module GirFFI
|
|
107
119
|
return if vfunc_name == invoker_name
|
108
120
|
|
109
121
|
klass.class_eval <<-DEF, __FILE__, __LINE__ + 1
|
110
|
-
def #{vfunc_name} *args, &block
|
111
|
-
#{invoker_name}(*args, &block)
|
112
|
-
end
|
122
|
+
def #{vfunc_name} *args, &block # def foo *args, &block
|
123
|
+
#{invoker_name}(*args, &block) # foo_invoker *args, &block
|
124
|
+
end # end
|
113
125
|
DEF
|
114
126
|
end
|
115
127
|
|
@@ -11,8 +11,7 @@ module GirFFI
|
|
11
11
|
module Builders
|
12
12
|
# Method builder used for the creation of property getter methods.
|
13
13
|
class PropertyGetterBuilder
|
14
|
-
attr_reader :info
|
15
|
-
attr_reader :return_value_builder
|
14
|
+
attr_reader :info, :return_value_builder
|
16
15
|
|
17
16
|
def initialize(info, return_value_builder)
|
18
17
|
@return_value_builder = return_value_builder
|
@@ -18,13 +18,11 @@ module GirFFI
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def marshaller_definition
|
21
|
-
|
22
|
-
receiver_info = ReceiverArgumentInfo.new(container_type_info)
|
23
|
-
|
24
|
-
MarshallingMethodBuilder.for_signal(receiver_info,
|
25
|
-
info).method_definition
|
21
|
+
MarshallingMethodBuilder.for_signal(info).method_definition
|
26
22
|
end
|
27
23
|
|
24
|
+
private
|
25
|
+
|
28
26
|
def klass
|
29
27
|
@klass ||= get_or_define_class container_class, @classname, GObject::RubyClosure
|
30
28
|
end
|
@@ -10,21 +10,48 @@ module GirFFI
|
|
10
10
|
class StructBuilder < RegisteredTypeBuilder
|
11
11
|
include StructLike
|
12
12
|
|
13
|
+
def initialize(info, superclass: nil)
|
14
|
+
@superclass = superclass
|
15
|
+
super info
|
16
|
+
end
|
17
|
+
|
18
|
+
def superclass
|
19
|
+
@superclass ||= if info.gtype_struct?
|
20
|
+
gtype_struct_parent
|
21
|
+
elsif GObject.type_fundamental(info.gtype) == GObject::TYPE_BOXED
|
22
|
+
BoxedBase
|
23
|
+
else
|
24
|
+
StructBase
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
13
30
|
def layout_superclass
|
14
31
|
GirFFI::Struct
|
15
32
|
end
|
16
33
|
|
17
|
-
def
|
18
|
-
|
19
|
-
|
20
|
-
return parent_field_type.tag_or_class if info.gtype_struct?
|
21
|
-
return BoxedBase if GObject.type_fundamental(info.gtype) == GObject::TYPE_BOXED
|
34
|
+
def klass
|
35
|
+
@klass ||= get_or_define_class(namespace_module, @classname) { superclass }
|
36
|
+
end
|
22
37
|
|
23
|
-
|
38
|
+
def parent_info
|
39
|
+
@parent_info ||= parent_field_type&.interface
|
24
40
|
end
|
25
41
|
|
26
42
|
def parent_field_type
|
27
|
-
fields.first
|
43
|
+
fields.first&.field_type
|
44
|
+
end
|
45
|
+
|
46
|
+
def gtype_struct_parent
|
47
|
+
full_name = info.full_type_name
|
48
|
+
if full_name == "GObject::InitiallyUnownedClass"
|
49
|
+
GObject::ObjectClass
|
50
|
+
else
|
51
|
+
raise "Unable to calculate parent class for #{full_name}" unless parent_info
|
52
|
+
|
53
|
+
Builder.build_class parent_info
|
54
|
+
end
|
28
55
|
end
|
29
56
|
end
|
30
57
|
end
|