@@ -31,11 +31,13 @@ VALUE rb_example_tests_rb_ary_shift(VALUE self, VALUE ary);
3131VALUE rb_example_tests_rb_ary_unshift(VALUE self, VALUE ary, VALUE elem);
3232void rb_example_tests_rb_define_variable(VALUE self, VALUE name, VALUE v);
3333void rb_example_tests_rb_define_const(VALUE self, VALUE name, VALUE val);
34+ void rb_example_tests_rb_gc_guard(VALUE self);
3435*/
3536import "C"
3637
3738import (
3839 "github.com/ruby-go-gem/go-gem-wrapper/ruby"
40+ "unsafe"
3941)
4042
4143//export rb_example_tests_nop_rb_define_method_id
@@ -269,6 +271,26 @@ func rb_example_tests_rb_define_const(self C.VALUE, name C.VALUE, val C.VALUE) {
269271 ruby .RbDefineConst (ruby .VALUE (self ), strName , ruby .VALUE (val ))
270272}
271273
274+ //export rb_example_tests_rb_gc_guard
275+ func rb_example_tests_rb_gc_guard (_ C.VALUE ) {
276+ // c.f. https://docs.ruby-lang.org/en/master/extension_rdoc.html
277+ s := ruby .RbStrNewCstr ("hello world!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" )
278+
279+ sptr := ruby .RSTRING_PTR (s )
280+ newPtr := unsafe .Add (unsafe .Pointer (sptr ), 6 )
281+ w := C .rb_str_new_cstr ((* C .char )(newPtr ))
282+
283+ ruby .RB_GC_GUARD (s )
284+
285+ newStr := ruby .Value2String ((ruby .VALUE )(w ))
286+
287+ expected := "world!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
288+
289+ if newStr != expected {
290+ ruby .RbRaise (ruby .VALUE (C .rb_eStandardError ), "Expected is %s, but actual is %s" , expected , newStr )
291+ }
292+ }
293+
272294// defineMethodsToExampleTests define methods in Example::Tests
273295func defineMethodsToExampleTests (rb_mExample ruby.VALUE ) {
274296 rb_cTests := ruby .RbDefineClassUnder (rb_mExample , "Tests" , ruby .VALUE (C .rb_cObject ))
@@ -303,4 +325,5 @@ func defineMethodsToExampleTests(rb_mExample ruby.VALUE) {
303325 ruby .RbDefineSingletonMethod (rb_cTests , "rb_ary_unshift" , C .rb_example_tests_rb_ary_unshift , 2 )
304326 ruby .RbDefineSingletonMethod (rb_cTests , "rb_define_variable" , C .rb_example_tests_rb_define_variable , 2 )
305327 ruby .RbDefineSingletonMethod (rb_cTests , "rb_define_const" , C .rb_example_tests_rb_define_const , 2 )
328+ ruby .RbDefineSingletonMethod (rb_cTests , "rb_gc_guard" , C .rb_example_tests_rb_gc_guard , 0 )
306329}
0 commit comments