summaryrefslogtreecommitdiff
path: root/spec/ruby/optional/capi/ext/gc_spec.c
blob: 1392bc6ee668da462b9b5aad42f3c4675eb3782c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include "ruby.h"
#include "rubyspec.h"

#ifdef __cplusplus
extern "C" {
#endif

VALUE registered_tagged_value;
VALUE registered_reference_value;
VALUE registered_before_rb_gc_register_address;
VALUE registered_before_rb_global_variable_string;
VALUE registered_before_rb_global_variable_bignum;
VALUE registered_before_rb_global_variable_float;
VALUE registered_after_rb_global_variable_string;
VALUE registered_after_rb_global_variable_bignum;
VALUE registered_after_rb_global_variable_float;
VALUE rb_gc_register_address_outside_init;

static VALUE registered_tagged_address(VALUE self) {
  return registered_tagged_value;
}

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_string(VALUE self) {
  return registered_before_rb_global_variable_string;
}

static VALUE get_registered_before_rb_global_variable_bignum(VALUE self) {
  return registered_before_rb_global_variable_bignum;
}

static VALUE get_registered_before_rb_global_variable_float(VALUE self) {
  return registered_before_rb_global_variable_float;
}

static VALUE get_registered_after_rb_global_variable_string(VALUE self) {
  return registered_after_rb_global_variable_string;
}

static VALUE get_registered_after_rb_global_variable_bignum(VALUE self) {
  return registered_after_rb_global_variable_bignum;
}

static VALUE get_registered_after_rb_global_variable_float(VALUE self) {
  return registered_after_rb_global_variable_float;
}

static VALUE gc_spec_rb_gc_register_address(VALUE self) {
  rb_gc_register_address(&rb_gc_register_address_outside_init);
  rb_gc_register_address_outside_init = rb_str_new_cstr("rb_gc_register_address() outside Init_");
  return rb_gc_register_address_outside_init;
}

static VALUE gc_spec_rb_gc_unregister_address(VALUE self) {
  rb_gc_unregister_address(&rb_gc_register_address_outside_init);
  return Qnil;
}

static VALUE gc_spec_rb_gc_enable(VALUE self) {
  return rb_gc_enable();
}

static VALUE gc_spec_rb_gc_disable(VALUE self) {
  return rb_gc_disable();
}

static VALUE gc_spec_rb_gc(VALUE self) {
  rb_gc();
  return Qnil;
}

static VALUE gc_spec_rb_gc_latest_gc_info(VALUE self, VALUE hash_or_key) {
  return rb_gc_latest_gc_info(hash_or_key);
}

static VALUE gc_spec_rb_gc_adjust_memory_usage(VALUE self, VALUE diff) {
  rb_gc_adjust_memory_usage(NUM2SSIZET(diff));
  return Qnil;
}

static VALUE gc_spec_rb_gc_register_mark_object(VALUE self, VALUE obj) {
  rb_gc_register_mark_object(obj);
  return Qnil;
}

void Init_gc_spec(void) {
  VALUE cls = rb_define_class("CApiGCSpecs", rb_cObject);

  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_string);
  rb_global_variable(&registered_before_rb_global_variable_bignum);
  rb_global_variable(&registered_before_rb_global_variable_float);

  registered_tagged_value    = INT2NUM(10);
  registered_reference_value = rb_str_new2("Globally registered data");
  registered_before_rb_gc_register_address = rb_str_new_cstr("registered before rb_gc_register_address()");

  registered_before_rb_global_variable_string = rb_str_new_cstr("registered before rb_global_variable()");
  registered_before_rb_global_variable_bignum = LL2NUM(INT64_MAX);
  registered_before_rb_global_variable_float = DBL2NUM(3.14);

  registered_after_rb_global_variable_string = rb_str_new_cstr("registered after rb_global_variable()");
  rb_global_variable(&registered_after_rb_global_variable_string);
  registered_after_rb_global_variable_bignum = LL2NUM(INT64_MAX);
  rb_global_variable(&registered_after_rb_global_variable_bignum);
  registered_after_rb_global_variable_float = DBL2NUM(6.28);
  rb_global_variable(&registered_after_rb_global_variable_float);

  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_string", get_registered_before_rb_global_variable_string, 0);
  rb_define_method(cls, "registered_before_rb_global_variable_bignum", get_registered_before_rb_global_variable_bignum, 0);
  rb_define_method(cls, "registered_before_rb_global_variable_float", get_registered_before_rb_global_variable_float, 0);
  rb_define_method(cls, "registered_after_rb_global_variable_string", get_registered_after_rb_global_variable_string, 0);
  rb_define_method(cls, "registered_after_rb_global_variable_bignum", get_registered_after_rb_global_variable_bignum, 0);
  rb_define_method(cls, "registered_after_rb_global_variable_float", get_registered_after_rb_global_variable_float, 0);
  rb_define_method(cls, "rb_gc_register_address", gc_spec_rb_gc_register_address, 0);
  rb_define_method(cls, "rb_gc_unregister_address", gc_spec_rb_gc_unregister_address, 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);
  rb_define_method(cls, "rb_gc_adjust_memory_usage", gc_spec_rb_gc_adjust_memory_usage, 1);
  rb_define_method(cls, "rb_gc_register_mark_object", gc_spec_rb_gc_register_mark_object, 1);
  rb_define_method(cls, "rb_gc_latest_gc_info", gc_spec_rb_gc_latest_gc_info, 1);
}

#ifdef __cplusplus
}
#endif