ext/cached/ruby-1.9.1/internal/node/global_entry.h in ruby-internal-0.7.3 vs ext/cached/ruby-1.9.1/internal/node/global_entry.h in ruby-internal-0.8.0
- old
+ new
@@ -1,10 +1,96 @@
#ifndef global_entry__h_
#define global_entry__h_
+st_table * rb_global_tbl;
+
+#define gvar_getter_t rb_gvar_getter_t
+#define gvar_setter_t rb_gvar_setter_t
+#define gvar_marker_t rb_gvar_marker_t
+struct trace_var {
+ int removed;
+ void (*func)(VALUE arg, VALUE val);
+ VALUE data;
+ struct trace_var *next;
+};
+struct global_variable {
+ int counter;
+ void *data;
+ gvar_getter_t *getter;
+ gvar_setter_t *setter;
+ gvar_marker_t *marker;
+ int block_trace;
+ struct trace_var *trace;
+};
struct global_entry {
struct global_variable *var;
ID id;
};
+#define undef_getter rb_gvar_undef_getter
+#define undef_setter rb_gvar_undef_setter
+#define undef_marker rb_gvar_undef_marker
+struct global_entry*
+rb_global_entry(ID id)
+{
+ struct global_entry *entry;
+ st_data_t data;
+
+ if (!st_lookup(rb_global_tbl, id, &data)) {
+ struct global_variable *var;
+ entry = ALLOC(struct global_entry);
+ var = ALLOC(struct global_variable);
+ entry->id = id;
+ entry->var = var;
+ var->counter = 1;
+ var->data = 0;
+ var->getter = undef_getter;
+ var->setter = undef_setter;
+ var->marker = undef_marker;
+
+ var->block_trace = 0;
+ var->trace = 0;
+ st_add_direct(rb_global_tbl, id, (st_data_t)entry);
+ }
+ else {
+ entry = (struct global_entry *)data;
+ }
+ return entry;
+}
+VALUE
+undef_getter(ID id, void *data, struct global_variable *var)
+{
+ rb_warning("global variable `%s' not initialized", rb_id2name(id));
+
+ return Qnil;
+}
+void
+undef_setter(VALUE val, ID id, void *data, struct global_variable *var)
+{
+ var->getter = val_getter;
+ var->setter = val_setter;
+ var->marker = val_marker;
+
+ var->data = (void*)val;
+}
+void
+undef_marker(VALUE *var)
+{
+}
+VALUE
+val_getter(ID id, void *data, struct global_variable *var)
+{
+ return (VALUE)data;
+}
+void
+val_setter(VALUE val, ID id, void *data, struct global_variable *var)
+{
+ var->data = (void*)val;
+}
+void
+val_marker(VALUE *var)
+{
+ VALUE data = (VALUE)var;
+ if (data) rb_gc_mark_maybe(data);
+}
#endif