Skip to content

Commit

Permalink
Add spec for rb_gc_register_address() called before the assignment
Browse files Browse the repository at this point in the history
  • Loading branch information
eregon committed Nov 7, 2022
1 parent 083dea5 commit 3f30a50
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 6 deletions.
17 changes: 17 additions & 0 deletions optional/capi/ext/gc_spec.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ extern "C" {

VALUE registered_tagged_value;
VALUE registered_reference_value;
VALUE registered_before_rb_gc_register_address;
VALUE registered_before_rb_global_variable;

static VALUE registered_tagged_address(VALUE self) {
return registered_tagged_value;
Expand All @@ -16,6 +18,14 @@ static VALUE registered_reference_address(VALUE self) {
return registered_reference_value;
}

static VALUE get_registered_before_rb_gc_register_address(VALUE self) {
return registered_before_rb_gc_register_address;
}

static VALUE get_registered_before_rb_global_variable(VALUE self) {
return registered_before_rb_global_variable;
}

static VALUE gc_spec_rb_gc_enable(VALUE self) {
return rb_gc_enable();
}
Expand Down Expand Up @@ -50,9 +60,16 @@ void Init_gc_spec(void) {

rb_gc_register_address(&registered_tagged_value);
rb_gc_register_address(&registered_reference_value);
rb_gc_register_address(&registered_before_rb_gc_register_address);
rb_global_variable(&registered_before_rb_global_variable);

registered_before_rb_gc_register_address = rb_str_new_cstr("registered before rb_gc_register_address()");
registered_before_rb_global_variable = rb_str_new_cstr("registered before rb_global_variable()");

rb_define_method(cls, "registered_tagged_address", registered_tagged_address, 0);
rb_define_method(cls, "registered_reference_address", registered_reference_address, 0);
rb_define_method(cls, "registered_before_rb_gc_register_address", get_registered_before_rb_gc_register_address, 0);
rb_define_method(cls, "registered_before_rb_global_variable", get_registered_before_rb_global_variable, 0);
rb_define_method(cls, "rb_gc_enable", gc_spec_rb_gc_enable, 0);
rb_define_method(cls, "rb_gc_disable", gc_spec_rb_gc_disable, 0);
rb_define_method(cls, "rb_gc", gc_spec_rb_gc, 0);
Expand Down
25 changes: 19 additions & 6 deletions optional/capi/gc_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,28 @@
@f = CApiGCSpecs.new
end

it "correctly gets the value from a registered address" do
@f.registered_tagged_address.should == 10
@f.registered_tagged_address.should equal(@f.registered_tagged_address)
@f.registered_reference_address.should == "Globally registered data"
@f.registered_reference_address.should equal(@f.registered_reference_address)
describe "rb_gc_register_address" do
it "correctly gets the value from a registered address" do
@f.registered_tagged_address.should == 10
@f.registered_tagged_address.should equal(@f.registered_tagged_address)
@f.registered_reference_address.should == "Globally registered data"
@f.registered_reference_address.should equal(@f.registered_reference_address)
end

it "keeps the value alive even if the value is assigned after rb_gc_register_address() is called" do
GC.start
@f.registered_before_rb_gc_register_address.should == "registered before rb_gc_register_address()"
end
end

describe "rb_gc_enable" do
describe "rb_global_variable" do
it "keeps the value alive even if the value is assigned after rb_global_variable() is called" do
GC.start
@f.registered_before_rb_global_variable.should == "registered before rb_global_variable()"
end
end

describe "rb_gc_enable" do
after do
GC.enable
end
Expand Down

0 comments on commit 3f30a50

Please sign in to comment.