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
-
#[] ⇒ Object
Retrieves a weakly referenced object with the given key.
-
#[]= ⇒ 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.
- #finalize ⇒ Object private
-
#include? ⇒ Boolean
Returns
true
ifkey
is registered. - #inspect ⇒ Object
-
#key? ⇒ Boolean
Returns
true
ifkey
is registered. -
#keys ⇒ Object
Iterates over keys and objects in a weakly referenced object.
- #length ⇒ Object
-
#member? ⇒ Boolean
Returns
true
ifkey
is registered. - #size ⇒ Object
-
#values ⇒ Object
Iterates over values and objects in a weakly referenced object.
Methods included from Enumerable
#all?, #any?, #chunk, #collect, #collect_concat, #count, #cycle, #detect, #drop, #drop_while, #each_cons, #each_entry, #each_slice, #each_with_index, #each_with_object, #entries, #find, #find_all, #find_index, #first, #flat_map, #grep, #group_by, #inject, #lazy, #map, #max, #max_by, #min, #min_by, #minmax, #minmax_by, #none?, #one?, #partition, #reduce, #reject, #reverse_each, #select, #slice_before, #sort, #sort_by, #take, #take_while, #to_a, #to_h, #zip
Instance Method Details
#[] ⇒ Object
Retrieves a weakly referenced object with the given key
6644 6645 6646 6647 6648 6649 6650 6651 6652 6653 6654 6655 6656 6657 6658 |
# File 'gc.c', line 6644
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 (!is_id_value(objspace, obj)) return Qnil;
if (!is_live_object(objspace, obj)) return Qnil;
return obj;
}
|
#[]= ⇒ Object
Creates a weak reference from the given key to the given value
6628 6629 6630 6631 6632 6633 6634 6635 6636 6637 6638 6639 6640 6641 |
# File 'gc.c', line 6628
static VALUE
wmap_aset(VALUE self, VALUE wmap, VALUE orig)
{
struct weakmap *w;
TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w);
should_be_finalizable(orig);
should_be_finalizable(wmap);
define_final0(orig, w->final);
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
6495 6496 6497 6498 6499 6500 6501 6502 6503 6504 |
# File 'gc.c', line 6495
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
6518 6519 6520 6521 6522 6523 6524 6525 6526 6527 |
# File 'gc.c', line 6518
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
6495 6496 6497 6498 6499 6500 6501 6502 6503 6504 |
# File 'gc.c', line 6495
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
6541 6542 6543 6544 6545 6546 6547 6548 6549 6550 |
# File 'gc.c', line 6541
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;
}
|
#finalize ⇒ Object (private)
6406 6407 6408 6409 6410 6411 6412 6413 6414 6415 6416 6417 6418 6419 6420 6421 6422 6423 6424 6425 6426 6427 6428 6429 6430 6431 6432 6433 6434 6435 |
# File 'gc.c', line 6406
static VALUE
wmap_finalize(VALUE self, VALUE objid)
{
st_data_t orig, wmap, data;
VALUE obj, *rids, i, size;
struct weakmap *w;
TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w);
/* Get reference from object id. */
obj = obj_id_to_ref(objid);
/* obj is original referenced object and/or weak reference. */
orig = (st_data_t)obj;
if (st_delete(w->obj2wmap, &orig, &data)) {
rids = (VALUE *)data;
size = *rids++;
for (i = 0; i < size; ++i) {
wmap = (st_data_t)rids[i];
st_delete(w->wmap2obj, &wmap, NULL);
}
ruby_sized_xfree((VALUE *)data, (size + 1) * sizeof(VALUE));
}
wmap = (st_data_t)obj;
if (st_delete(w->wmap2obj, &wmap, &orig)) {
wmap = (st_data_t)obj;
st_update(w->obj2wmap, orig, wmap_final_func, wmap);
}
return self;
}
|
#include? ⇒ Boolean
Returns true
if key
is registered
6661 6662 6663 6664 6665 |
# File 'gc.c', line 6661
static VALUE
wmap_has_key(VALUE self, VALUE key)
{
return NIL_P(wmap_aref(self, key)) ? Qfalse : Qtrue;
}
|
#inspect ⇒ Object
6466 6467 6468 6469 6470 6471 6472 6473 6474 6475 6476 6477 6478 6479 6480 6481 |
# File 'gc.c', line 6466
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? ⇒ Boolean
Returns true
if key
is registered
6661 6662 6663 6664 6665 |
# File 'gc.c', line 6661
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
6566 6567 6568 6569 6570 6571 6572 6573 6574 6575 6576 6577 |
# File 'gc.c', line 6566
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
6667 6668 6669 6670 6671 6672 6673 6674 6675 6676 6677 6678 6679 6680 |
# File 'gc.c', line 6667
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? ⇒ Boolean
Returns true
if key
is registered
6661 6662 6663 6664 6665 |
# File 'gc.c', line 6661
static VALUE
wmap_has_key(VALUE self, VALUE key)
{
return NIL_P(wmap_aref(self, key)) ? Qfalse : Qtrue;
}
|
#size ⇒ Object
6667 6668 6669 6670 6671 6672 6673 6674 6675 6676 6677 6678 6679 6680 |
# File 'gc.c', line 6667
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
6593 6594 6595 6596 6597 6598 6599 6600 6601 6602 6603 6604 |
# File 'gc.c', line 6593
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;
}
|