Skip to content

Commit fc950bd

Browse files
authored
Merge pull request #102 from sue445/rb_define_variable
Add RbDefineVariable
2 parents d9781bb + 295dd79 commit fc950bd

File tree

5 files changed

+46
-0
lines changed

5 files changed

+46
-0
lines changed

_tools/ruby_h_to_go/ruby_h_to_go.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,14 @@ def generate_go_file(definition:, header_dir:)
128128
end
129129
end
130130

131+
definition[:args].each do |c_arg|
132+
case c_arg[:name]
133+
when "var"
134+
# `var` is reserved in Go
135+
c_arg[:name] = "v"
136+
end
137+
end
138+
131139
go_function_name = snake_to_camel(definition[:function_name])
132140
go_function_args = definition[:args].map do |c_arg|
133141
"#{c_arg[:name]} #{ruby_c_type_to_go_type(c_arg[:type], type: :arg)}"

ruby-internal-variable.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package ruby
2+
3+
/*
4+
#include "ruby.h"
5+
*/
6+
import "C"
7+
8+
// c.f. https://github.com/ruby/ruby/blob/master/include/ruby/internal/variable.h
9+
10+
// RbDefineVariable calls `rb_define_variable` in C
11+
//
12+
// Original definition is following
13+
//
14+
// void rb_define_variable(const char *name, VALUE *var)
15+
func RbDefineVariable(name string, v *VALUE) {
16+
char, clean := string2Char(name)
17+
defer clean()
18+
19+
C.rb_define_variable(char, (*C.VALUE)(v))
20+
}

testdata/dummy/ext/dummy/tests.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ VALUE rb_dummy_tests_rb_ary_push(VALUE self, VALUE ary, VALUE elem);
2929
VALUE rb_dummy_tests_rb_ary_pop(VALUE self, VALUE ary);
3030
VALUE rb_dummy_tests_rb_ary_shift(VALUE self, VALUE ary);
3131
VALUE rb_dummy_tests_rb_ary_unshift(VALUE self, VALUE ary, VALUE elem);
32+
void rb_dummy_tests_rb_define_variable(VALUE self, VALUE name, VALUE v);
3233
*/
3334
import "C"
3435

@@ -255,6 +256,12 @@ func rb_dummy_tests_rb_ary_unshift(_ C.VALUE, ary C.VALUE, elem C.VALUE) C.VALUE
255256
return C.VALUE(ret)
256257
}
257258

259+
//export rb_dummy_tests_rb_define_variable
260+
func rb_dummy_tests_rb_define_variable(_ C.VALUE, name C.VALUE, v C.VALUE) {
261+
strName := ruby.Value2String(ruby.VALUE(name))
262+
ruby.RbDefineVariable(strName, (*ruby.VALUE)(&v))
263+
}
264+
258265
// defineMethodsToDummyTests define methods in Dummy::Tests
259266
func defineMethodsToDummyTests(rb_mDummy ruby.VALUE) {
260267
rb_cTests := ruby.RbDefineClassUnder(rb_mDummy, "Tests", ruby.VALUE(C.rb_cObject))
@@ -287,4 +294,5 @@ func defineMethodsToDummyTests(rb_mDummy ruby.VALUE) {
287294
ruby.RbDefineSingletonMethod(rb_cTests, "rb_ary_pop", C.rb_dummy_tests_rb_ary_pop, 1)
288295
ruby.RbDefineSingletonMethod(rb_cTests, "rb_ary_shift", C.rb_dummy_tests_rb_ary_shift, 1)
289296
ruby.RbDefineSingletonMethod(rb_cTests, "rb_ary_unshift", C.rb_dummy_tests_rb_ary_unshift, 2)
297+
ruby.RbDefineSingletonMethod(rb_cTests, "rb_define_variable", C.rb_dummy_tests_rb_define_variable, 2)
290298
}

testdata/dummy/sig/dummy/tests.rbs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ module Dummy
3636
def self.rb_ary_pop: ([] ary) -> untyped
3737
def self.rb_ary_shift: ([] ary) -> untyped
3838
def self.rb_ary_unshift: ([] ary, untyped elem) -> []
39+
def self.rb_define_variable: (string name, untyped var) -> void
3940

4041
private
4142
def nop_rb_define_private_method: () -> void

testdata/dummy/test/dummy/tests_test.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,5 +170,14 @@ class RbAttrTest < Test::Unit::TestCase
170170
test "#nop_rb_define_protected_method" do
171171
assert { Dummy::Tests.protected_instance_methods(false).include?(:nop_rb_define_protected_method) }
172172
end
173+
174+
# rubocop:disable Style/GlobalVars this is test for global variable
175+
test ".rb_define_variable" do
176+
Dummy::Tests.rb_define_variable("$global_var", 1)
177+
assert { $global_var == 1 }
178+
ensure
179+
$global_var = nil
180+
end
181+
# rubocop:enable Style/GlobalVars
173182
end
174183
end

0 commit comments

Comments
 (0)