Skip to content

Commit 118bfc5

Browse files
eregonandrykonchin
authored andcommitted
Expand specs for rb_global_variable()
* See oracle/truffleruby#3478 (comment)
1 parent 632adc5 commit 118bfc5

File tree

2 files changed

+77
-8
lines changed

2 files changed

+77
-8
lines changed

optional/capi/ext/gc_spec.c

+48-6
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,12 @@ extern "C" {
88
VALUE registered_tagged_value;
99
VALUE registered_reference_value;
1010
VALUE registered_before_rb_gc_register_address;
11-
VALUE registered_before_rb_global_variable;
11+
VALUE registered_before_rb_global_variable_string;
12+
VALUE registered_before_rb_global_variable_bignum;
13+
VALUE registered_before_rb_global_variable_float;
14+
VALUE registered_after_rb_global_variable_string;
15+
VALUE registered_after_rb_global_variable_bignum;
16+
VALUE registered_after_rb_global_variable_float;
1217
VALUE rb_gc_register_address_outside_init;
1318

1419
static VALUE registered_tagged_address(VALUE self) {
@@ -23,8 +28,28 @@ static VALUE get_registered_before_rb_gc_register_address(VALUE self) {
2328
return registered_before_rb_gc_register_address;
2429
}
2530

26-
static VALUE get_registered_before_rb_global_variable(VALUE self) {
27-
return registered_before_rb_global_variable;
31+
static VALUE get_registered_before_rb_global_variable_string(VALUE self) {
32+
return registered_before_rb_global_variable_string;
33+
}
34+
35+
static VALUE get_registered_before_rb_global_variable_bignum(VALUE self) {
36+
return registered_before_rb_global_variable_bignum;
37+
}
38+
39+
static VALUE get_registered_before_rb_global_variable_float(VALUE self) {
40+
return registered_before_rb_global_variable_float;
41+
}
42+
43+
static VALUE get_registered_after_rb_global_variable_string(VALUE self) {
44+
return registered_after_rb_global_variable_string;
45+
}
46+
47+
static VALUE get_registered_after_rb_global_variable_bignum(VALUE self) {
48+
return registered_after_rb_global_variable_bignum;
49+
}
50+
51+
static VALUE get_registered_after_rb_global_variable_float(VALUE self) {
52+
return registered_after_rb_global_variable_float;
2853
}
2954

3055
static VALUE gc_spec_rb_gc_register_address(VALUE self) {
@@ -71,17 +96,34 @@ void Init_gc_spec(void) {
7196
rb_gc_register_address(&registered_tagged_value);
7297
rb_gc_register_address(&registered_reference_value);
7398
rb_gc_register_address(&registered_before_rb_gc_register_address);
74-
rb_global_variable(&registered_before_rb_global_variable);
99+
rb_global_variable(&registered_before_rb_global_variable_string);
100+
rb_global_variable(&registered_before_rb_global_variable_bignum);
101+
rb_global_variable(&registered_before_rb_global_variable_float);
75102

76103
registered_tagged_value = INT2NUM(10);
77104
registered_reference_value = rb_str_new2("Globally registered data");
78105
registered_before_rb_gc_register_address = rb_str_new_cstr("registered before rb_gc_register_address()");
79-
registered_before_rb_global_variable = rb_str_new_cstr("registered before rb_global_variable()");
106+
107+
registered_before_rb_global_variable_string = rb_str_new_cstr("registered before rb_global_variable()");
108+
registered_before_rb_global_variable_bignum = LONG2NUM(INT64_MAX);
109+
registered_before_rb_global_variable_float = DBL2NUM(3.14);
110+
111+
registered_after_rb_global_variable_string = rb_str_new_cstr("registered after rb_global_variable()");
112+
rb_global_variable(&registered_after_rb_global_variable_string);
113+
registered_after_rb_global_variable_bignum = LONG2NUM(INT64_MAX);
114+
rb_global_variable(&registered_after_rb_global_variable_bignum);
115+
registered_after_rb_global_variable_float = DBL2NUM(6.28);
116+
rb_global_variable(&registered_after_rb_global_variable_float);
80117

81118
rb_define_method(cls, "registered_tagged_address", registered_tagged_address, 0);
82119
rb_define_method(cls, "registered_reference_address", registered_reference_address, 0);
83120
rb_define_method(cls, "registered_before_rb_gc_register_address", get_registered_before_rb_gc_register_address, 0);
84-
rb_define_method(cls, "registered_before_rb_global_variable", get_registered_before_rb_global_variable, 0);
121+
rb_define_method(cls, "registered_before_rb_global_variable_string", get_registered_before_rb_global_variable_string, 0);
122+
rb_define_method(cls, "registered_before_rb_global_variable_bignum", get_registered_before_rb_global_variable_bignum, 0);
123+
rb_define_method(cls, "registered_before_rb_global_variable_float", get_registered_before_rb_global_variable_float, 0);
124+
rb_define_method(cls, "registered_after_rb_global_variable_string", get_registered_after_rb_global_variable_string, 0);
125+
rb_define_method(cls, "registered_after_rb_global_variable_bignum", get_registered_after_rb_global_variable_bignum, 0);
126+
rb_define_method(cls, "registered_after_rb_global_variable_float", get_registered_after_rb_global_variable_float, 0);
85127
rb_define_method(cls, "rb_gc_register_address", gc_spec_rb_gc_register_address, 0);
86128
rb_define_method(cls, "rb_gc_unregister_address", gc_spec_rb_gc_unregister_address, 0);
87129
rb_define_method(cls, "rb_gc_enable", gc_spec_rb_gc_enable, 0);

optional/capi/gc_spec.rb

+29-2
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,36 @@
2727
end
2828

2929
describe "rb_global_variable" do
30-
it "keeps the value alive even if the value is assigned after rb_global_variable() is called" do
30+
before :all do
3131
GC.start
32-
@f.registered_before_rb_global_variable.should == "registered before rb_global_variable()"
32+
end
33+
34+
describe "keeps the value alive even if the value is assigned after rb_global_variable() is called" do
35+
it "for a string" do
36+
@f.registered_before_rb_global_variable_string.should == "registered before rb_global_variable()"
37+
end
38+
39+
it "for a bignum" do
40+
@f.registered_before_rb_global_variable_bignum.should == 2**63 - 1
41+
end
42+
43+
it "for a Float" do
44+
@f.registered_before_rb_global_variable_float.should == 3.14
45+
end
46+
end
47+
48+
describe "keeps the value alive when the value is assigned before rb_global_variable() is called" do
49+
it "for a string" do
50+
@f.registered_after_rb_global_variable_string.should == "registered after rb_global_variable()"
51+
end
52+
53+
it "for a bignum" do
54+
@f.registered_after_rb_global_variable_bignum.should == 2**63 - 1
55+
end
56+
57+
it "for a Float" do
58+
@f.registered_after_rb_global_variable_float.should == 6.28
59+
end
3360
end
3461
end
3562

0 commit comments

Comments
 (0)