In Files

  • gc.c

Class/Module Index [+]

ObjectSpace::WeakMap

An ObjectSpace::WeakMap object holds references to any objects, but those objects can get garbage collected.

This class is mostly used internally by WeakRef, please use lib/weakref.rb for the public interface.

Public Instance Methods

[](p1) click to toggle source

Retrieves a weakly referenced object with the given key

 static VALUE wmap_aref(VALUE self, VALUE wmap) { st_data_t data; VALUE obj; struct weakmap *w; rb_objspace_t *objspace = &rb_objspace; TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w); if (!st_lookup(w->wmap2obj, (st_data_t)wmap, &data)) return Qnil; obj = (VALUE)data; if (!wmap_live_p(objspace, obj)) return Qnil; return obj; } 
[]=(p1, p2) click to toggle source

Creates a weak reference from the given key to the given value

 static VALUE wmap_aset(VALUE self, VALUE wmap, VALUE orig) { struct weakmap *w; TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w); if (FL_ABLE(orig)) { define_final0(orig, w->final); } if (FL_ABLE(wmap)) { define_final0(wmap, w->final); } st_update(w->obj2wmap, (st_data_t)orig, wmap_aset_update, wmap); st_insert(w->wmap2obj, (st_data_t)wmap, (st_data_t)orig); return nonspecial_obj_id(orig); } 
each() click to toggle source

Iterates over keys and objects in a weakly referenced object

 static VALUE wmap_each(VALUE self) { struct weakmap *w; rb_objspace_t *objspace = &rb_objspace; TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w); st_foreach(w->wmap2obj, wmap_each_i, (st_data_t)objspace); return self; } 
each_key() click to toggle source

Iterates over keys and objects in a weakly referenced object

 static VALUE wmap_each_key(VALUE self) { struct weakmap *w; rb_objspace_t *objspace = &rb_objspace; TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w); st_foreach(w->wmap2obj, wmap_each_key_i, (st_data_t)objspace); return self; } 
each_pair() click to toggle source

Iterates over keys and objects in a weakly referenced object

 static VALUE wmap_each(VALUE self) { struct weakmap *w; rb_objspace_t *objspace = &rb_objspace; TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w); st_foreach(w->wmap2obj, wmap_each_i, (st_data_t)objspace); return self; } 
each_value() click to toggle source

Iterates over keys and objects in a weakly referenced object

 static VALUE wmap_each_value(VALUE self) { struct weakmap *w; rb_objspace_t *objspace = &rb_objspace; TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w); st_foreach(w->wmap2obj, wmap_each_value_i, (st_data_t)objspace); return self; } 
include?(p1) click to toggle source

Returns true if key is registered

 static VALUE wmap_has_key(VALUE self, VALUE key) { return NIL_P(wmap_aref(self, key)) ? Qfalse : Qtrue; } 
inspect() click to toggle source
 static VALUE wmap_inspect(VALUE self) { VALUE str; VALUE c = rb_class_name(CLASS_OF(self)); struct weakmap *w; TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w); str = rb_sprintf("-<%"PRIsVALUE":%p", c, (void *)self); if (w->wmap2obj) { st_foreach(w->wmap2obj, wmap_inspect_i, str); } RSTRING_PTR(str)[0] = '#'; rb_str_cat2(str, ">"); return str; } 
key?(p1) click to toggle source

Returns true if key is registered

 static VALUE wmap_has_key(VALUE self, VALUE key) { return NIL_P(wmap_aref(self, key)) ? Qfalse : Qtrue; } 
keys() click to toggle source

Iterates over keys and objects in a weakly referenced object

 static VALUE wmap_keys(VALUE self) { struct weakmap *w; struct wmap_iter_arg args; TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w); args.objspace = &rb_objspace; args.value = rb_ary_new(); st_foreach(w->wmap2obj, wmap_keys_i, (st_data_t)&args); return args.value; } 
length() click to toggle source

Returns the number of referenced objects

 static VALUE wmap_size(VALUE self) { struct weakmap *w; st_index_t n; TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w); n = w->wmap2obj->num_entries; #if SIZEOF_ST_INDEX_T <= SIZEOF_LONG return ULONG2NUM(n); #else return ULL2NUM(n); #endif } 
member?(p1) click to toggle source

Returns true if key is registered

 static VALUE wmap_has_key(VALUE self, VALUE key) { return NIL_P(wmap_aref(self, key)) ? Qfalse : Qtrue; } 
size() click to toggle source

Returns the number of referenced objects

 static VALUE wmap_size(VALUE self) { struct weakmap *w; st_index_t n; TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w); n = w->wmap2obj->num_entries; #if SIZEOF_ST_INDEX_T <= SIZEOF_LONG return ULONG2NUM(n); #else return ULL2NUM(n); #endif } 
values() click to toggle source

Iterates over values and objects in a weakly referenced object

 static VALUE wmap_values(VALUE self) { struct weakmap *w; struct wmap_iter_arg args; TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w); args.objspace = &rb_objspace; args.value = rb_ary_new(); st_foreach(w->wmap2obj, wmap_values_i, (st_data_t)&args); return args.value; }