Skip to content

Commit 76554de

Browse files
committed
Fix static cast and add typenames.
1 parent e390072 commit 76554de

5 files changed

Lines changed: 19 additions & 10 deletions

File tree

lib/ruby-bindgen/visitors/rice/rice.rb

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -951,7 +951,15 @@ def arguments(cursor)
951951
if copyable_type?(param.type)
952952
# Use type_spelling to get fully qualified type name
953953
qualified_type = type_spelling(param.type)
954-
result << " = static_cast<#{qualified_type}>(#{default_value})"
954+
# Can't static_cast to array types (e.g., using StepArray = int[3])
955+
decl = param.type.declaration
956+
is_array_alias = (decl.kind == :cursor_type_alias_decl || decl.kind == :cursor_typedef_decl) &&
957+
[:type_constant_array, :type_incomplete_array].include?(decl.underlying_type.canonical.kind)
958+
if is_array_alias
959+
result << " = #{default_value}"
960+
else
961+
result << " = static_cast<#{qualified_type}>(#{default_value})"
962+
end
955963
end
956964
end
957965
result
@@ -1117,9 +1125,10 @@ def qualify_class_template_typedefs(spelling, class_template)
11171125
return spelling if typedef_info[:names].empty?
11181126

11191127
result = spelling.dup
1128+
qualified_parent = typedef_info[:qualified_parent]
11201129
typedef_info[:names].each do |name|
1121-
# Replace unqualified typedef names (not preceded by :: or word char)
1122-
result = result.gsub(/(?<![:\w])#{Regexp.escape(name)}(?![:\w])/, "#{typedef_info[:qualified_parent]}::#{name}")
1130+
unqualified = /(?<![:\w])#{Regexp.escape(name)}(?![:\w])/
1131+
result = result.gsub(unqualified, "typename #{qualified_parent}::#{name}")
11231132
end
11241133

11251134
result

test/bindings/cpp/classes-rb.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ void Init_Classes()
7272
define_constructor(Constructor<Outer::Inner::GpuMatND, Outer::Inner::GpuMatND::SizeArray, int>(),
7373
Arg("size"), Arg("type")).
7474
define_constructor(Constructor<Outer::Inner::GpuMatND, Outer::Inner::GpuMatND::SizeArray, int, void*, Outer::Inner::GpuMatND::StepArray>(),
75-
Arg("size"), Arg("type"), ArgBuffer("data"), Arg("step") = static_cast<Outer::Inner::GpuMatND::StepArray>(Outer::Inner::GpuMatND::defaultStepArray()));
75+
Arg("size"), Arg("type"), ArgBuffer("data"), Arg("step") = Outer::Inner::GpuMatND::defaultStepArray());
7676

7777
Rice::Data_Type<Outer::Inner::Stream> rb_cOuterInnerStream = define_class_under<Outer::Inner::Stream>(rb_mOuterInner, "Stream").
7878
define_constructor(Constructor<Outer::Inner::Stream>()).

test/bindings/cpp/iterators-rb.ipp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ inline Rice::Data_Type<iter::TemplateContainer<T>> TemplateContainer_instantiate
55
define_constructor(Constructor<iter::TemplateContainer<T>>()).
66
template define_iterator<typename iter::TemplateContainer<T>::iterator(iter::TemplateContainer<T>::*)()>(&iter::TemplateContainer<T>::begin, &iter::TemplateContainer<T>::end, "each").
77
template define_iterator<typename iter::TemplateContainer<T>::const_iterator(iter::TemplateContainer<T>::*)() const>(&iter::TemplateContainer<T>::begin, &iter::TemplateContainer<T>::end, "each_const").
8-
template define_iterator<std::reverse_iterator<iter::TemplateContainer<T>::iterator>(iter::TemplateContainer<T>::*)()>(&iter::TemplateContainer<T>::rbegin, &iter::TemplateContainer<T>::rend, "each_reverse").
9-
template define_iterator<std::reverse_iterator<iter::TemplateContainer<T>::const_iterator>(iter::TemplateContainer<T>::*)() const>(&iter::TemplateContainer<T>::rbegin, &iter::TemplateContainer<T>::rend, "each_reverse_const");
8+
template define_iterator<std::reverse_iterator<typename iter::TemplateContainer<T>::iterator>(iter::TemplateContainer<T>::*)()>(&iter::TemplateContainer<T>::rbegin, &iter::TemplateContainer<T>::rend, "each_reverse").
9+
template define_iterator<std::reverse_iterator<typename iter::TemplateContainer<T>::const_iterator>(iter::TemplateContainer<T>::*)() const>(&iter::TemplateContainer<T>::rbegin, &iter::TemplateContainer<T>::rend, "each_reverse_const");
1010
}
1111

test/bindings/cpp/templates-rb.ipp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ inline Rice::Data_Type<Internal::Data<Rows, Columns>> Data_instantiate(Rice::Mod
55
define_constructor(Constructor<Internal::Data<Rows, Columns>>()).
66
define_constructor(Constructor<Internal::Data<Rows, Columns>, char*>(),
77
Arg("type")).
8-
define_attr("rows", &Internal::Data<Rows, Columns>::Rows).
9-
define_attr("columns", &Internal::Data<Rows, Columns>::Columns).
8+
define_attr("rows", &Internal::Data<Rows, Columns>::rows).
9+
define_attr("columns", &Internal::Data<Rows, Columns>::columns).
1010
template define_method<int(Internal::Data<Rows, Columns>::*)()>("get_rows", &Internal::Data<Rows, Columns>::getRows).
1111
template define_method<int(Internal::Data<Rows, Columns>::*)()>("get_columns", &Internal::Data<Rows, Columns>::getColumns);
1212
}

test/headers/cpp/templates.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ namespace Internal
66
public:
77
Data();
88
Data(char* type);
9-
int Rows;
10-
int Columns;
9+
int rows;
10+
int columns;
1111
int getRows();
1212
int getColumns();
1313
};

0 commit comments

Comments
 (0)