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
true
ifkey
is registered. - #inspect ⇒ Object
-
#key?(key) ⇒ Boolean
Returns
true
ifkey
is 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
true
ifkey
is 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;
}
|