Skip to content

Commit 4df9fde

Browse files
authored
Merge pull request #145 from sue445/rb_block_proc
[WIP] Fix rb_block_proc
2 parents 347e3c8 + a9f0659 commit 4df9fde

18 files changed

+131
-237
lines changed

_tools/ruby_h_to_go/exe/ruby_h_to_go

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,27 +8,51 @@
88

99
require "optparse"
1010
require "fileutils"
11+
require "tmpdir"
1112

1213
require_relative "../lib/ruby_h_to_go"
1314

14-
header_dir = nil
15+
header_file = nil
16+
include_paths = nil
1517
dist_dir = nil
18+
dist_preprocessed_header_file = nil
19+
20+
DEFAULT_RUBY_HEADER_FILE = File.join(RbConfig::CONFIG["rubyhdrdir"], "ruby.h")
21+
22+
DEFAULT_INCLUDE_PATHS = [
23+
RbConfig::CONFIG["rubyarchhdrdir"],
24+
RbConfig::CONFIG["rubyhdrdir"],
25+
].freeze
1626

17-
DEFAULT_RUBY_HEADER_DIR = RbConfig::CONFIG["rubyhdrdir"]
1827
DEFAULT_DIST_DIR = File.expand_path("../dist", __dir__)
1928

29+
DEFAULT_DIST_PREPROCESSED_HEADER_FILE = File.join(Dir.tmpdir, "ruby_preprocessed.h")
30+
2031
opt = OptionParser.new
21-
opt.on("-H", "--header-dir HEADER_DIR", "ruby header dir (default: #{DEFAULT_RUBY_HEADER_DIR})") { |v| header_dir = v }
32+
opt.on("-H", "--header-file HEADER_FILE", "ruby header file (default: #{DEFAULT_RUBY_HEADER_FILE})") do |v|
33+
header_file = v
34+
end
35+
36+
opt.on("-I", "--include-path path1,path2", Array, "include paths (default: #{DEFAULT_INCLUDE_PATHS})") do |v|
37+
include_paths = v
38+
end
2239

2340
opt.on("-D", "--dist-dir DIST_DIR", "dist dir for auto-generated Go code (default: #{DEFAULT_DIST_DIR})") do |v|
2441
dist_dir = v
2542
end
2643

44+
opt.on("-p", "--dist-dir DIST_DIR",
45+
"dist preprocessed ruby header file (default: #{DEFAULT_DIST_PREPROCESSED_HEADER_FILE})") do |v|
46+
dist_preprocessed_header_file = v
47+
end
48+
2749
opt.parse!(ARGV)
2850

2951
# Use default header file and include paths
30-
header_dir ||= DEFAULT_RUBY_HEADER_DIR
52+
header_file ||= DEFAULT_RUBY_HEADER_FILE
53+
include_paths ||= DEFAULT_INCLUDE_PATHS
3154

3255
dist_dir ||= DEFAULT_DIST_DIR
56+
dist_preprocessed_header_file ||= DEFAULT_DIST_PREPROCESSED_HEADER_FILE
3357

34-
RubyHToGo::Cli.new(header_dir:, dist_dir:).perform
58+
RubyHToGo::Cli.new(header_file:, include_paths:, dist_dir:, dist_preprocessed_header_file:).perform

_tools/ruby_h_to_go/lib/ruby_h_to_go/argument_definition.rb

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,6 @@
33
module RubyHToGo
44
# Proxy class for generating argument in go function
55
class ArgumentDefinition
6-
# @!attribute [r] header_dir
7-
# @return [String]
8-
attr_reader :header_dir
9-
106
extend Forwardable
117

128
def_delegators :@definition, :==, :type, :type=, :name, :name=, :pointer, :pointer=, :pointer?, :length, :length=
@@ -15,9 +11,8 @@ class ArgumentDefinition
1511

1612
# @param definition [RubyHeaderParser::ArgumentDefinition]
1713
# @param header_dir [String]
18-
def initialize(definition:, header_dir:)
14+
def initialize(definition:)
1915
@definition = definition
20-
@header_dir = header_dir
2116
end
2217

2318
C_NAME_TO_GO_NAME = {

_tools/ruby_h_to_go/lib/ruby_h_to_go/cli.rb

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,31 @@
33
module RubyHToGo
44
# client for ruby_h_to_go
55
class Cli
6-
# @!attribute [r] header_dir
6+
# @!attribute [r] header_file
77
# @return [String]
8-
attr_reader :header_dir
8+
attr_reader :header_file
9+
10+
# @!attribute [r] include_paths
11+
# @return [Array<String>]
12+
attr_reader :include_paths
913

1014
# @!attribute [r] dist_dir
1115
# @return [String]
1216
attr_reader :dist_dir
1317

14-
# @param header_dir [String]
18+
# @!attribute [r] dist_preprocessed_header_file
19+
# @return [String]
20+
attr_reader :dist_preprocessed_header_file
21+
22+
# @param header_file [String] path to ruby.h
23+
# @param include_paths [Array<String>]
1524
# @param dist_dir [String]
16-
def initialize(header_dir:, dist_dir:)
17-
@header_dir = header_dir
25+
# @param dist_preprocessed_header_file [String]
26+
def initialize(header_file:, include_paths:, dist_dir:, dist_preprocessed_header_file:)
27+
@header_file = header_file
28+
@include_paths = include_paths
1829
@dist_dir = dist_dir
30+
@dist_preprocessed_header_file = dist_preprocessed_header_file
1931
end
2032

2133
def perform
@@ -26,48 +38,46 @@ def perform
2638
write_function_definitions_to_go_file
2739

2840
copy_go_files
29-
remove_unused_imports
30-
go_fmt
41+
42+
# FIXME: Enable after
43+
# remove_unused_imports
44+
# go_fmt
3145
end
3246

3347
private
3448

3549
# @return [RubyHeaderParser::Parser]
3650
def parser
37-
@parser ||= RubyHeaderParser::Parser.new(header_dir)
51+
@parser ||= RubyHeaderParser::Parser.new(header_file:, include_paths:, dist_preprocessed_header_file:)
3852
end
3953

4054
def write_type_definitions_to_go_file
4155
type_definitions = parser.extract_type_definitions.map do |definition|
42-
RubyHToGo::TypeDefinition.new(definition:, header_dir:)
56+
RubyHToGo::TypeDefinition.new(definition:)
4357
end
4458

4559
type_definitions.each do |definition|
46-
next unless target_header_file?(definition.filepath)
47-
4860
definition.write_go_file(dist_dir)
4961
end
5062
end
5163

5264
def write_struct_definitions_to_go_file
5365
struct_definitions = parser.extract_struct_definitions.map do |definition|
54-
RubyHToGo::StructDefinition.new(definition:, header_dir:)
66+
RubyHToGo::StructDefinition.new(definition:)
5567
end
5668

5769
struct_definitions.each do |definition|
58-
next unless target_header_file?(definition.filepath)
59-
6070
definition.write_go_file(dist_dir)
6171
end
6272
end
6373

6474
def write_function_definitions_to_go_file
6575
function_definitions = parser.extract_function_definitions.map do |definition|
66-
RubyHToGo::FunctionDefinition.new(definition:, header_dir:)
76+
RubyHToGo::FunctionDefinition.new(definition:)
6777
end
6878

6979
static_inline_function_definitions = parser.extract_static_inline_function_definitions.map do |definition|
70-
RubyHToGo::FunctionDefinition.new(definition:, header_dir:)
80+
RubyHToGo::FunctionDefinition.new(definition:)
7181
end
7282

7383
static_inline_function_definitions.each do |static_inline_function_definition|
@@ -77,8 +87,6 @@ def write_function_definitions_to_go_file
7787
end
7888

7989
function_definitions.each do |definition|
80-
next unless target_header_file?(definition.filepath)
81-
8290
definition.write_go_file(dist_dir)
8391
end
8492
end
@@ -115,11 +123,5 @@ def go_fmt
115123
system("go fmt", exception: true)
116124
end
117125
end
118-
119-
# @param filename [String]
120-
# @return [Boolean]
121-
def target_header_file?(filename)
122-
File.extname(filename) == ".h"
123-
end
124126
end
125127
end

_tools/ruby_h_to_go/lib/ruby_h_to_go/function_definition.rb

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,36 +3,31 @@
33
module RubyHToGo
44
# Proxy class for generating go function
55
class FunctionDefinition
6-
# @!attribute [r] header_dir
7-
# @return [String]
8-
attr_reader :header_dir
9-
106
extend Forwardable
117

12-
def_delegators :@definition, :==, :name, :name=, :definition, :definition=, :filepath, :filepath=
8+
def_delegators :@definition, :==, :name, :name=, :definition, :definition=
139

1410
include GeneratorHelper
1511

1612
# @param definition [RubyHeaderParser::FunctionDefinition]
17-
def initialize(definition:, header_dir:)
13+
def initialize(definition:)
1814
@definition = definition
19-
@header_dir = header_dir
2015
end
2116

2217
# @return [RubyHToGo::TyperefDefinition]
2318
def typeref
24-
@typeref ||= RubyHToGo::TyperefDefinition.new(definition: @definition.typeref, header_dir:)
19+
@typeref ||= RubyHToGo::TyperefDefinition.new(definition: @definition.typeref)
2520
end
2621

2722
# @return [Array<RubyHToGo::ArgumentDefinition>]
2823
def args
29-
@args ||= @definition.args.map { |arg| RubyHToGo::ArgumentDefinition.new(definition: arg, header_dir:) }
24+
@args ||= @definition.args.map { |arg| RubyHToGo::ArgumentDefinition.new(definition: arg) }
3025
end
3126

3227
# Write definition as go file
3328
# @param [String] dist_dir
3429
def write_go_file(dist_dir)
35-
go_file_path = File.join(dist_dir, generate_go_file_name(header_dir:, ruby_header_file: filepath))
30+
go_file_path = File.join(dist_dir, "function_generated.go")
3631

3732
generate_initial_go_file(go_file_path)
3833

@@ -48,16 +43,12 @@ def generate_go_content
4843

4944
go_function_typeref = typeref.go_function_typeref
5045

51-
github_url = generate_include_github_url(header_dir:, ruby_header_file: filepath)
52-
5346
go_function_lines = [
5447
"// #{go_function_name} calls `#{name}` in C",
5548
"//",
5649
"// Original definition is following",
5750
"//",
5851
"//\t#{definition}",
59-
"//",
60-
"// ref. #{github_url}",
6152
]
6253

6354
go_function_lines << "func #{go_function_name}(#{go_function_args.join(", ")}) #{go_function_typeref} {"

_tools/ruby_h_to_go/lib/ruby_h_to_go/generator_helper.rb

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,6 @@
33
module RubyHToGo
44
# helper methods for generating go code
55
module GeneratorHelper
6-
# @param header_dir [String]
7-
# @param ruby_header_file [String]
8-
# @return [String]
9-
def generate_go_file_name(header_dir:, ruby_header_file:)
10-
ruby_header_file.delete_prefix(header_dir + File::SEPARATOR).gsub(File::SEPARATOR, "_").
11-
gsub(/\.h$/, "_generated.go")
12-
end
13-
14-
# Generate GitHub url in https://github.com/ruby/ruby
15-
# @param header_dir [String]
16-
# @param ruby_header_file [String]
17-
# @return [String]
18-
def generate_include_github_url(header_dir:, ruby_header_file:)
19-
file = ruby_header_file.delete_prefix(header_dir + File::SEPARATOR)
20-
"https://github.com/ruby/ruby/blob/master/include/#{file}"
21-
end
22-
236
# @param str [String]
247
# @return [String]
258
def snake_to_camel(str)

_tools/ruby_h_to_go/lib/ruby_h_to_go/struct_definition.rb

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,21 @@
33
module RubyHToGo
44
# Proxy class for generating go type
55
class StructDefinition
6-
# @!attribute [r] header_dir
7-
# @return [String]
8-
attr_reader :header_dir
9-
106
extend Forwardable
117

12-
def_delegators :@definition, :==, :name, :name=, :filepath, :filepath=
8+
def_delegators :@definition, :==, :name, :name=
139

1410
include GeneratorHelper
1511

1612
# @param definition [RubyHeaderParser::StructDefinition]
17-
# @param header_dir [String]
18-
def initialize(definition:, header_dir:)
13+
def initialize(definition:)
1914
@definition = definition
20-
@header_dir = header_dir
2115
end
2216

2317
# Write definition as go file
2418
# @param [String] dist_dir
2519
def write_go_file(dist_dir)
26-
go_file_path = File.join(dist_dir, generate_go_file_name(header_dir:, ruby_header_file: filepath))
20+
go_file_path = File.join(dist_dir, "struct_generated.go")
2721

2822
generate_initial_go_file(go_file_path)
2923

@@ -34,14 +28,10 @@ def write_go_file(dist_dir)
3428

3529
# @return [String]
3630
def generate_go_content
37-
github_url = generate_include_github_url(header_dir:, ruby_header_file: filepath)
38-
3931
go_type_name = snake_to_camel(name)
4032

4133
<<~GO
4234
// #{go_type_name} is a type for passing `C.#{name}` in and out of package
43-
//
44-
// ref. #{github_url}
4535
type #{go_type_name} C.#{name}
4636
4737
GO

_tools/ruby_h_to_go/lib/ruby_h_to_go/type_definition.rb

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,21 @@
33
module RubyHToGo
44
# Proxy class for generating go type
55
class TypeDefinition
6-
# @!attribute [r] header_dir
7-
# @return [String]
8-
attr_reader :header_dir
9-
106
extend Forwardable
117

12-
def_delegators :@definition, :==, :name, :name=, :filepath, :filepath=
8+
def_delegators :@definition, :==, :name, :name=
139

1410
include GeneratorHelper
1511

1612
# @param definition [RubyHeaderParser::TypeDefinition]
17-
def initialize(definition:, header_dir:)
13+
def initialize(definition:)
1814
@definition = definition
19-
@header_dir = header_dir
2015
end
2116

2217
# Write definition as go file
2318
# @param [String] dist_dir
2419
def write_go_file(dist_dir)
25-
go_file_path = File.join(dist_dir, generate_go_file_name(header_dir:, ruby_header_file: filepath))
20+
go_file_path = File.join(dist_dir, "type_generated.go")
2621

2722
generate_initial_go_file(go_file_path)
2823

@@ -33,14 +28,10 @@ def write_go_file(dist_dir)
3328

3429
# @return [String]
3530
def generate_go_content
36-
github_url = generate_include_github_url(header_dir:, ruby_header_file: filepath)
37-
3831
go_type_name = snake_to_camel(name)
3932

4033
<<~GO
4134
// #{go_type_name} is a type for passing `C.#{name}` in and out of package
42-
//
43-
// ref. #{github_url}
4435
type #{go_type_name} C.#{name}
4536
4637
GO

_tools/ruby_h_to_go/lib/ruby_h_to_go/typeref_definition.rb

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,15 @@
33
module RubyHToGo
44
# Proxy class for generating typeref in go function
55
class TyperefDefinition
6-
# @!attribute [r] header_dir
7-
# @return [String]
8-
attr_reader :header_dir
9-
106
extend Forwardable
117

128
def_delegators :@definition, :==, :type, :type=, :pointer, :pointer=, :pointer?
139

1410
include GeneratorHelper
1511

1612
# @param definition [RubyHeaderParser::TyperefDefinition]
17-
def initialize(definition:, header_dir:)
13+
def initialize(definition:)
1814
@definition = definition
19-
@header_dir = header_dir
2015
end
2116

2217
# @return [String]

0 commit comments

Comments
 (0)