Skip to content

Commit 5d2dc13

Browse files
authored
Merge pull request #415 from mvz/fix-segfault-in-static-vfuncs
Ensure class structs are initialized
2 parents 1199890 + 9d90f6a commit 5d2dc13

3 files changed

Lines changed: 9 additions & 6 deletions

File tree

‎lib/gir_ffi/builders/object_builder.rb‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ def setup_class
6464
setup_layout
6565
setup_constants
6666
stub_methods
67+
ensure_class_struct_initialized
6768
setup_property_accessors
6869
setup_vfunc_invokers
6970
setup_interfaces
@@ -99,6 +100,13 @@ def parent_ancestor_infos
99100
@parent_ancestor_infos ||= parent_builder.ancestor_infos
100101
end
101102

103+
# If the class struct is not initialized, calling some functions may lead
104+
# to a segfault (for example, for GIMarshallingTests::Object.vfunc_static_name),
105+
# or an incorrect return value (for example, for Regress::TestBoxedC#name_conflict).
106+
def ensure_class_struct_initialized
107+
klass.class_struct
108+
end
109+
102110
def setup_property_accessors
103111
eligible_properties.each do |prop|
104112
PropertyBuilder.new(prop).build

‎lib/gir_ffi/object_base.rb‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ def self.install_property(param_spec)
101101

102102
def self.install_vfunc_implementation(name, implementation = nil)
103103
if const_defined? :GIR_FFI_BUILDER, false
104-
raise "Installing a property in a class that is already set up is not supported"
104+
raise "Installing a vfunc in a class that is already set up is not supported"
105105
end
106106

107107
prepare_user_defined_class

‎test/integration/generated_regress_test.rb‎

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1899,11 +1899,6 @@ def make_derived_instance
18991899
end
19001900

19011901
it "defines callback type Matrix in the metaclass namespace" do
1902-
# Make sure Regress::TestObjClass exists
1903-
# NOTE: Perhaps gtype struct classes should be stored out of the way in
1904-
# some other namespace.
1905-
Regress::TestObj.class_struct
1906-
19071902
_(Regress::TestObjClass.const_defined?(:Matrix)).must_equal true
19081903
_(Regress.const_defined?(:Matrix)).must_equal false
19091904
end

0 commit comments

Comments
 (0)