diff options
Diffstat (limited to 'spec/ruby/optional/capi/ext/gc_spec.c')
-rw-r--r-- | spec/ruby/optional/capi/ext/gc_spec.c | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/spec/ruby/optional/capi/ext/gc_spec.c b/spec/ruby/optional/capi/ext/gc_spec.c new file mode 100644 index 0000000000..05341bb01d --- /dev/null +++ b/spec/ruby/optional/capi/ext/gc_spec.c @@ -0,0 +1,72 @@ +#include "ruby.h" +#include "rubyspec.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef HAVE_RB_GC_REGISTER_ADDRESS +VALUE registered_tagged_value; +VALUE registered_reference_value; + +static VALUE registered_tagged_address(VALUE self) { + return registered_tagged_value; +} + +static VALUE registered_reference_address(VALUE self) { + return registered_reference_value; +} +#endif + +#ifdef HAVE_RB_GC_ENABLE +static VALUE gc_spec_rb_gc_enable() { + return rb_gc_enable(); +} +#endif + +#ifdef HAVE_RB_GC_DISABLE +static VALUE gc_spec_rb_gc_disable() { + return rb_gc_disable(); +} +#endif + +#ifdef HAVE_RB_GC +static VALUE gc_spec_rb_gc() { + rb_gc(); + return Qnil; +} +#endif + + +void Init_gc_spec(void) { + VALUE cls; + cls = rb_define_class("CApiGCSpecs", rb_cObject); + +#ifdef HAVE_RB_GC_REGISTER_ADDRESS + registered_tagged_value = INT2NUM(10); + registered_reference_value = rb_str_new2("Globally registered data"); + + rb_gc_register_address(®istered_tagged_value); + rb_gc_register_address(®istered_reference_value); + + rb_define_method(cls, "registered_tagged_address", registered_tagged_address, 0); + rb_define_method(cls, "registered_reference_address", registered_reference_address, 0); +#endif + +#ifdef HAVE_RB_GC_ENABLE + rb_define_method(cls, "rb_gc_enable", gc_spec_rb_gc_enable, 0); +#endif + +#ifdef HAVE_RB_GC_DISABLE + rb_define_method(cls, "rb_gc_disable", gc_spec_rb_gc_disable, 0); +#endif + +#ifdef HAVE_RB_GC + rb_define_method(cls, "rb_gc", gc_spec_rb_gc, 0); +#endif + +} + +#ifdef __cplusplus +} +#endif |