Updated MSpec source to 46e80081.
[rbx.git] / spec / subtend / ext / subtend_global.c
blob6a92a5e470bce4ec7adda825102c33409046fdc9
1 #include <ruby.h>
3 static VALUE sb_gv_get(VALUE self, VALUE var) {
4 return rb_gv_get( StringValuePtr(var) );
7 static VALUE sb_gv_set(VALUE self, VALUE var, VALUE val) {
8 return rb_gv_set( StringValuePtr(var), val );
11 VALUE g_var = Qnil;
12 VALUE g_ro_var = Qnil;
13 VALUE g_hooked_var = Qnil;
15 static VALUE sb_define_variable(VALUE self, VALUE var_name, VALUE val) {
16 g_var = val;
17 rb_define_variable(StringValuePtr(var_name), &g_var);
18 return Qnil;
21 static VALUE sb_get_global_value(VALUE self) {
22 return g_var;
25 static VALUE sb_define_readonly_variable(VALUE self, VALUE var_name, VALUE val) {
26 g_ro_var = val;
27 rb_define_readonly_variable(StringValuePtr(var_name), &g_ro_var);
28 return Qnil;
31 void var_2x_setter(VALUE val, ID id, VALUE *var) {
32 *var = INT2NUM(NUM2INT(val) * 2);
35 static VALUE sb_define_hooked_variable(VALUE self, VALUE var_name) {
36 rb_define_hooked_variable(StringValuePtr(var_name), &g_hooked_var, 0, var_2x_setter);
37 return Qnil;
40 void Init_subtend_global() {
41 VALUE cls;
42 cls = rb_define_class("SubtendGlobal", rb_cObject);
44 rb_define_method(cls, "sb_gv_get", sb_gv_get, 1);
45 rb_define_method(cls, "sb_gv_set", sb_gv_set, 2);
46 rb_define_method(cls, "rb_define_variable", sb_define_variable, 2);
47 rb_define_method(cls, "sb_get_global_value", sb_get_global_value, 0);
48 rb_define_method(cls, "rb_define_readonly_variable", sb_define_readonly_variable, 2);
49 rb_define_method(cls, "rb_define_hooked_variable_2x", sb_define_hooked_variable, 1);