Skip to content

Commit ed12dcb

Browse files
committed
Fixed cannot use _cgo1 (variable of type *_Ctype_char) as **_Ctype_char value in argument to _Cfunc_rb_feature_provided
1 parent 93fe67c commit ed12dcb

File tree

4 files changed

+51
-11
lines changed

4 files changed

+51
-11
lines changed

_tools/ruby_h_to_go/lib/ruby_h_to_go/argument_definition.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def go_name
3535

3636
# @return [String]
3737
def go_function_arg
38-
"#{go_name} #{ruby_c_type_to_go_type(type, pointer:, pos: :arg)}"
38+
"#{go_name} #{ruby_c_type_to_go_type(type, pointer:, pointer_length: length, pos: :arg)}"
3939
end
4040

4141
# @return [String]
@@ -45,6 +45,8 @@ def cast_to_cgo
4545
return "toCArray[#{ruby_c_type_to_go_type(type)}, #{cast_to_cgo_type(type)}](#{go_name})"
4646
when :ref_array
4747
return "toCArray[*#{ruby_c_type_to_go_type(type)}, *#{cast_to_cgo_type(type)}](#{go_name})"
48+
when :sref
49+
return "(#{"*" * length}#{cast_to_cgo_type(type)})(unsafe.Pointer(#{go_name}))"
4850
end
4951

5052
"#{cast_to_cgo_type(type)}(#{go_name})"

_tools/ruby_h_to_go/lib/ruby_h_to_go/generator_helper.rb

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,10 @@ def generate_initial_go_file(go_file_path)
4040
# @param typename [String]
4141
# @param pos [Symbol,nil] :arg, :typeref, :return
4242
# @param pointer [Symbol,nil] Whether pointer hint
43+
# @param pointer_length [Integer]
4344
# @return [String]
44-
def ruby_c_type_to_go_type(typename, pos: nil, pointer: nil)
45-
return ruby_pointer_c_type_to_go_type(typename, pos:, pointer:) if pointer
45+
def ruby_c_type_to_go_type(typename, pos: nil, pointer: nil, pointer_length: 0)
46+
return ruby_pointer_c_type_to_go_type(typename, pos:, pointer:, pointer_length:) if pointer
4647

4748
case typename
4849
when "unsigned int", "unsigned long"
@@ -107,8 +108,14 @@ def cast_to_cgo_type(typename)
107108
# @param typename [String]
108109
# @param pos [Symbol,nil] :arg, :typeref, :return
109110
# @param pointer [Symbol,nil] Whether pointer hint
111+
# @param pointer_length [Integer]
110112
# @return [String]
111-
def ruby_pointer_c_type_to_go_type(typename, pos:, pointer:)
113+
def ruby_pointer_c_type_to_go_type(typename, pos:, pointer:, pointer_length:)
114+
if pointer == :sref
115+
go_type_name = ruby_c_type_to_go_type(typename, pos:, pointer: nil)
116+
return "#{"*" * pointer_length}#{go_type_name}"
117+
end
118+
112119
case typename
113120
when "char", "const char"
114121
if pointer == :ref

_tools/ruby_h_to_go/spec/ruby_h_to_go/function_definition_spec.rb

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,40 @@
364364

365365
it { should eq go_content }
366366
end
367+
368+
context "rb_feature_provided" do
369+
let(:definition) do
370+
RubyHeaderParser::FunctionDefinition.new(
371+
name: "rb_feature_provided",
372+
definition: "int rb_feature_provided(const char *feature, const char **loading)",
373+
typeref: typedef(type: "int"),
374+
args: [
375+
argument(type: "char", name: "feature", pointer: :ref),
376+
argument(type: "char", name: "loading", pointer: :sref, length: 2),
377+
],
378+
)
379+
end
380+
381+
let(:go_content) do
382+
<<~GO
383+
// RbFeatureProvided calls `rb_feature_provided` in C
384+
//
385+
// Original definition is following
386+
//
387+
// int rb_feature_provided(const char *feature, const char **loading)
388+
func RbFeatureProvided(feature string, loading **Char) int {
389+
char, clean := string2Char(feature)
390+
defer clean()
391+
392+
ret := int(C.rb_feature_provided(char, (**C.char)(unsafe.Pointer(loading))))
393+
return ret
394+
}
395+
396+
GO
397+
end
398+
399+
it { should eq go_content }
400+
end
367401
end
368402

369403
describe "#go_function_name" do

ruby/function_generated.go

Lines changed: 4 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)