Class: ObjectSpace::WeakMap
Overview
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.
Instance Method Summary collapse
-
#[](wmap) ⇒ Object
Retrieves a weakly referenced object with the given key.
-
#[]=(wmap, orig) ⇒ Object
Creates a weak reference from the given key to the given value.
-
#each ⇒ Object
Iterates over keys and objects in a weakly referenced object.
-
#each_key ⇒ Object
Iterates over keys and objects in a weakly referenced object.
-
#each_pair ⇒ Object
Iterates over keys and objects in a weakly referenced object.
-
#each_value ⇒ Object
Iterates over keys and objects in a weakly referenced object.
-
#include?(key) ⇒ Boolean
Returns
trueifkeyis registered. - #inspect ⇒ Object
-
#key?(key) ⇒ Boolean
Returns
trueifkeyis registered. -
#keys ⇒ Object
Iterates over keys and objects in a weakly referenced object.
-
#length ⇒ Object
Returns the number of referenced objects.
-
#member?(key) ⇒ Boolean
Returns
trueifkeyis registered. -
#size ⇒ Object
Returns the number of referenced objects.
-
#values ⇒ Object
Iterates over values and objects in a weakly referenced object.
Methods included from Enumerable
#all?, #any?, #chain, #chunk, #chunk_while, #collect, #collect_concat, #count, #cycle, #detect, #drop, #drop_while, #each_cons, #each_entry, #each_slice, #each_with_index, #each_with_object, #entries, #filter, #filter_map, #find, #find_all, #find_index, #first, #flat_map, #grep, #grep_v, #group_by, #inject, #lazy, #map, #max, #max_by, #min, #min_by, #minmax, #minmax_by, #none?, #one?, #partition, #reduce, #reject, #reverse_each, #select, #slice_after, #slice_before, #slice_when, #sort, #sort_by, #sum, #take, #take_while, #tally, #to_a, #to_h, #uniq, #zip
Instance Method Details
#[](wmap) ⇒ Object
Retrieves a weakly referenced object with the given key
10689 10690 10691 10692 10693 10694 10695 10696 10697 10698 10699 10700 10701 10702 |
# File 'gc.c', line 10689 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; } |
#[]=(wmap, orig) ⇒ Object
Creates a weak reference from the given key to the given value
10670 10671 10672 10673 10674 10675 10676 10677 10678 10679 10680 10681 10682 10683 10684 10685 10686 |
# File 'gc.c', line 10670 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 ⇒ Object
Iterates over keys and objects in a weakly referenced object
10537 10538 10539 10540 10541 10542 10543 10544 10545 10546 |
# File 'gc.c', line 10537 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 ⇒ Object
Iterates over keys and objects in a weakly referenced object
10560 10561 10562 10563 10564 10565 10566 10567 10568 10569 |
# File 'gc.c', line 10560 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 ⇒ Object
Iterates over keys and objects in a weakly referenced object
10537 10538 10539 10540 10541 10542 10543 10544 10545 10546 |
# File 'gc.c', line 10537 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 ⇒ Object
Iterates over keys and objects in a weakly referenced object
10583 10584 10585 10586 10587 10588 10589 10590 10591 10592 |
# File 'gc.c', line 10583 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?(key) ⇒ Boolean
Returns true if key is registered
10705 10706 10707 10708 10709 |
# File 'gc.c', line 10705 static VALUE wmap_has_key(VALUE self, VALUE key) { return NIL_P(wmap_aref(self, key)) ? Qfalse : Qtrue; } |
#inspect ⇒ Object
10508 10509 10510 10511 10512 10513 10514 10515 10516 10517 10518 10519 10520 10521 10522 10523 |
# File 'gc.c', line 10508 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?(key) ⇒ Boolean
Returns true if key is registered
10705 10706 10707 10708 10709 |
# File 'gc.c', line 10705 static VALUE wmap_has_key(VALUE self, VALUE key) { return NIL_P(wmap_aref(self, key)) ? Qfalse : Qtrue; } |
#keys ⇒ Object
Iterates over keys and objects in a weakly referenced object
10608 10609 10610 10611 10612 10613 10614 10615 10616 10617 10618 10619 |
# File 'gc.c', line 10608 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 ⇒ Object
Returns the number of referenced objects
10712 10713 10714 10715 10716 10717 10718 10719 10720 10721 10722 10723 10724 10725 |
# File 'gc.c', line 10712 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?(key) ⇒ Boolean
Returns true if key is registered
10705 10706 10707 10708 10709 |
# File 'gc.c', line 10705 static VALUE wmap_has_key(VALUE self, VALUE key) { return NIL_P(wmap_aref(self, key)) ? Qfalse : Qtrue; } |
#size ⇒ Object
Returns the number of referenced objects
10712 10713 10714 10715 10716 10717 10718 10719 10720 10721 10722 10723 10724 10725 |
# File 'gc.c', line 10712 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 ⇒ Object
Iterates over values and objects in a weakly referenced object
10635 10636 10637 10638 10639 10640 10641 10642 10643 10644 10645 10646 |
# File 'gc.c', line 10635 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; } |