Skip to content

Commit dc8eccf

Browse files
committed
Fix rb_find_file_ext
1 parent b7d62a5 commit dc8eccf

File tree

4 files changed

+63
-9
lines changed

4 files changed

+63
-9
lines changed

_tools/ruby_h_to_go/lib/ruby_h_to_go/function_definition.rb

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ def generate_go_content
5656

5757
casted_go_args = []
5858
char_var_count = args.count { |c_arg| c_arg.type == "char" && c_arg.pointer == :ref }
59+
chars_var_count = args.count { |c_arg| c_arg.type == "char" && c_arg.pointer == :str_array }
5960

6061
before_call_function_lines = []
6162
after_call_function_lines = []
@@ -67,18 +68,18 @@ def generate_go_content
6768
when "char"
6869
# c_arg is string
6970
if char_var_count >= 2
70-
char_var_name = "char#{snake_to_camel(c_arg.go_name)}"
71+
chars_var_name = "char#{snake_to_camel(c_arg.go_name)}"
7172
clean_var_name = "cleanChar#{c_arg.go_name}"
7273
else
73-
char_var_name = "char"
74+
chars_var_name = "char"
7475
clean_var_name = "clean"
7576
end
7677

77-
go_function_lines << "#{char_var_name}, #{clean_var_name} := string2Char(#{c_arg.go_name})"
78+
go_function_lines << "#{chars_var_name}, #{clean_var_name} := string2Char(#{c_arg.go_name})"
7879
go_function_lines << "defer #{clean_var_name}()"
7980
go_function_lines << ""
8081

81-
casted_go_args << char_var_name.to_s
82+
casted_go_args << chars_var_name.to_s
8283
when "void"
8384
# c_arg is pointer
8485
casted_go_args << c_arg.go_name
@@ -93,6 +94,20 @@ def generate_go_content
9394
end
9495
when :function
9596
casted_go_args << "toCFunctionPointer(#{c_arg.go_name})"
97+
when :str_array
98+
if chars_var_count >= 2
99+
chars_var_name = "chars#{snake_to_camel(c_arg.go_name)}"
100+
clean_var_name = "cleanChars#{c_arg.go_name}"
101+
else
102+
chars_var_name = "chars"
103+
clean_var_name = "cleanChars"
104+
end
105+
106+
go_function_lines << "#{chars_var_name}, #{clean_var_name} := strings2Chars(#{c_arg.go_name})"
107+
go_function_lines << "defer #{clean_var_name}()"
108+
go_function_lines << ""
109+
110+
casted_go_args << chars_var_name
96111
else
97112
casted_go_args << c_arg.cast_to_cgo
98113
end

_tools/ruby_h_to_go/lib/ruby_h_to_go/generator_helper.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,12 @@ def cast_to_cgo_type(typename)
111111
# @param pointer_length [Integer]
112112
# @return [String]
113113
def ruby_pointer_c_type_to_go_type(typename, pos:, pointer:, pointer_length:)
114-
if pointer == :sref
114+
case pointer
115+
when :sref
115116
go_type_name = ruby_c_type_to_go_type(typename, pos:, pointer: nil)
116117
return "#{"*" * pointer_length}#{go_type_name}"
118+
when :str_array
119+
return "[]string"
117120
end
118121

119122
case typename

_tools/ruby_h_to_go/spec/ruby_h_to_go/function_definition_spec.rb

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,42 @@
398398

399399
it { should eq go_content }
400400
end
401+
402+
context "rb_find_file_ext" do
403+
let(:definition) do
404+
RubyHeaderParser::FunctionDefinition.new(
405+
name: "rb_find_file_ext",
406+
definition: "int rb_find_file_ext(VALUE *feature, const char *const *exts)",
407+
typeref: typedef(type: "int"),
408+
args: [
409+
argument(type: "VALUE", name: "feature", pointer: :ref),
410+
argument(type: "char", name: "exts", pointer: :str_array),
411+
],
412+
)
413+
end
414+
415+
let(:go_content) do
416+
<<~GO
417+
// RbFindFileExt calls `rb_find_file_ext` in C
418+
//
419+
// Original definition is following
420+
//
421+
// int rb_find_file_ext(VALUE *feature, const char *const *exts)
422+
func RbFindFileExt(feature *VALUE, exts []string) int {
423+
chars, cleanChars := strings2Chars(exts)
424+
defer cleanChars()
425+
426+
var cFeature C.VALUE
427+
ret := int(C.rb_find_file_ext(&cFeature, chars))
428+
*feature = VALUE(cFeature)
429+
return ret
430+
}
431+
432+
GO
433+
end
434+
435+
it { should eq go_content }
436+
end
401437
end
402438

403439
describe "#go_function_name" do

ruby/function_generated.go

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

0 commit comments

Comments
 (0)