summaryrefslogtreecommitdiff
path: root/spec/ruby/optional/capi/ext/globals_spec.c
blob: 20dea1a05adaf3bbac552c7383139892ef753d38 (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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#include "ruby.h"
#include "rubyspec.h"

#ifdef __cplusplus
extern "C" {
#endif

VALUE g_hooked_var;

VALUE var_2x_getter(ID id, VALUE *data) {
  return *data;
}

void var_2x_setter(VALUE val, ID id, VALUE *var) {
  *var = INT2NUM(NUM2INT(val) * 2);
}

static VALUE sb_define_hooked_variable(VALUE self, VALUE var_name) {
  rb_define_hooked_variable(StringValuePtr(var_name), &g_hooked_var, var_2x_getter, var_2x_setter);
  return Qnil;
}

static VALUE sb_define_hooked_variable_default_accessors(VALUE self, VALUE var_name) {
  rb_define_hooked_variable(StringValuePtr(var_name), &g_hooked_var, (rb_gvar_getter_t*) NULL, (rb_gvar_setter_t*) NULL);
  return Qnil;
}

static VALUE sb_define_hooked_variable_null_var(VALUE self, VALUE var_name) {
    rb_define_hooked_variable(StringValuePtr(var_name), NULL, (rb_gvar_getter_t*) NULL, (rb_gvar_setter_t*) NULL);
    return Qnil;
}

VALUE g_ro_var;

static VALUE sb_define_readonly_variable(VALUE self, VALUE var_name, VALUE val) {
  g_ro_var = val;
  rb_define_readonly_variable(StringValuePtr(var_name), &g_ro_var);
  return Qnil;
}

VALUE g_var;

static VALUE sb_get_global_value(VALUE self) {
  return g_var;
}

static VALUE sb_define_variable(VALUE self, VALUE var_name, VALUE val) {
  g_var = val;
  rb_define_variable(StringValuePtr(var_name), &g_var);
  return Qnil;
}

long virtual_var_storage;

VALUE incrementing_getter(ID id, VALUE *data) {
  return LONG2FIX(virtual_var_storage++);
}

void incrementing_setter(VALUE val, ID id, VALUE *data) {
  virtual_var_storage = FIX2LONG(val);
}

static VALUE sb_define_virtual_variable_default_accessors(VALUE self, VALUE name) {
  rb_define_virtual_variable(StringValuePtr(name), (rb_gvar_getter_t*) NULL, (rb_gvar_setter_t*) NULL);
  return Qnil;
}

static VALUE sb_define_virtual_variable_incrementing_accessors(VALUE self, VALUE name) {
  rb_define_virtual_variable(StringValuePtr(name), incrementing_getter, incrementing_setter);
  return Qnil;
}

static VALUE sb_f_global_variables(VALUE self) {
  return rb_f_global_variables();
}

static VALUE sb_gv_get(VALUE self, VALUE var) {
  return rb_gv_get(StringValuePtr(var));
}

static VALUE sb_gv_set(VALUE self, VALUE var, VALUE val) {
  return rb_gv_set(StringValuePtr(var), val);
}

static VALUE global_spec_rb_stdin(VALUE self) {
  return rb_stdin;
}

static VALUE global_spec_rb_stdout(VALUE self) {
  return rb_stdout;
}

static VALUE global_spec_rb_stderr(VALUE self) {
  return rb_stderr;
}

static VALUE global_spec_rb_defout(VALUE self) {
  return rb_defout;
}

static VALUE global_spec_rb_fs(VALUE self) {
  return rb_fs;
}

static VALUE global_spec_rb_rs(VALUE self) {
  return rb_rs;
}

static VALUE global_spec_rb_default_rs(VALUE self) {
  return rb_default_rs;
}

static VALUE global_spec_rb_output_rs(VALUE self) {
  return rb_output_rs;
}

static VALUE global_spec_rb_output_fs(VALUE self) {
  return rb_output_fs;
}

static VALUE global_spec_rb_lastline_set(VALUE self, VALUE line) {
  rb_lastline_set(line);
  return Qnil;
}

static VALUE global_spec_rb_lastline_get(VALUE self) {
  return rb_lastline_get();
}

void Init_globals_spec(void) {
  VALUE cls = rb_define_class("CApiGlobalSpecs", rb_cObject);
  g_hooked_var = Qnil;
  rb_define_method(cls, "rb_define_hooked_variable_2x", sb_define_hooked_variable, 1);
  rb_define_method(cls, "rb_define_hooked_variable_default_accessors", sb_define_hooked_variable_default_accessors, 1);
  rb_define_method(cls, "rb_define_hooked_variable_null_var", sb_define_hooked_variable_null_var, 1);
  g_ro_var = Qnil;
  rb_define_method(cls, "rb_define_readonly_variable", sb_define_readonly_variable, 2);
  g_var = Qnil;
  rb_define_method(cls, "rb_define_variable", sb_define_variable, 2);
  rb_define_method(cls, "rb_define_virtual_variable_default_accessors", sb_define_virtual_variable_default_accessors, 1);
  rb_define_method(cls, "rb_define_virtual_variable_incrementing_accessors", sb_define_virtual_variable_incrementing_accessors, 1);
  rb_define_method(cls, "sb_get_global_value", sb_get_global_value, 0);
  rb_define_method(cls, "rb_f_global_variables", sb_f_global_variables, 0);
  rb_define_method(cls, "sb_gv_get", sb_gv_get, 1);
  rb_define_method(cls, "sb_gv_set", sb_gv_set, 2);
  rb_define_method(cls, "rb_stdin", global_spec_rb_stdin, 0);
  rb_define_method(cls, "rb_stdout", global_spec_rb_stdout, 0);
  rb_define_method(cls, "rb_stderr", global_spec_rb_stderr, 0);
  rb_define_method(cls, "rb_defout", global_spec_rb_defout, 0);
  rb_define_method(cls, "rb_fs", global_spec_rb_fs, 0);
  rb_define_method(cls, "rb_rs", global_spec_rb_rs, 0);
  rb_define_method(cls, "rb_default_rs", global_spec_rb_default_rs, 0);
  rb_define_method(cls, "rb_output_rs", global_spec_rb_output_rs, 0);
  rb_define_method(cls, "rb_output_fs", global_spec_rb_output_fs, 0);
  rb_define_method(cls, "rb_lastline_set", global_spec_rb_lastline_set, 1);
  rb_define_method(cls, "rb_lastline_get", global_spec_rb_lastline_get, 0);
}

#ifdef __cplusplus
}
#endif