mirror of
https://github.com/ruby/ruby.git
synced 2025-08-15 13:39:04 +02:00
Refactor wmap_foreach to pass weakmap_entry
This commit is contained in:
parent
9a9e74389c
commit
e375fa078f
Notes:
git
2024-08-22 14:02:17 +00:00
1 changed files with 25 additions and 19 deletions
44
weakmap.c
44
weakmap.c
|
@ -191,7 +191,7 @@ wmap_allocate(VALUE klass)
|
||||||
}
|
}
|
||||||
|
|
||||||
struct wmap_foreach_data {
|
struct wmap_foreach_data {
|
||||||
void (*func)(VALUE, VALUE, st_data_t);
|
void (*func)(struct weakmap_entry *, st_data_t);
|
||||||
st_data_t arg;
|
st_data_t arg;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -200,11 +200,17 @@ wmap_foreach_i(st_data_t key, st_data_t val, st_data_t arg)
|
||||||
{
|
{
|
||||||
struct wmap_foreach_data *data = (struct wmap_foreach_data *)arg;
|
struct wmap_foreach_data *data = (struct wmap_foreach_data *)arg;
|
||||||
|
|
||||||
VALUE key_obj = *(VALUE *)key;
|
struct weakmap_entry *entry = (struct weakmap_entry *)key;
|
||||||
VALUE val_obj = *(VALUE *)val;
|
RUBY_ASSERT(&entry->val == (VALUE *)val);
|
||||||
|
|
||||||
if (wmap_live_p(key_obj) && wmap_live_p(val_obj)) {
|
if (wmap_live_p(entry->key) && wmap_live_p(entry->val)) {
|
||||||
data->func(key_obj, val_obj, data->arg);
|
VALUE k = entry->key;
|
||||||
|
VALUE v = entry->val;
|
||||||
|
|
||||||
|
data->func(entry, data->arg);
|
||||||
|
|
||||||
|
RB_GC_GUARD(k);
|
||||||
|
RB_GC_GUARD(v);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
wmap_free_entry((VALUE *)key, (VALUE *)val);
|
wmap_free_entry((VALUE *)key, (VALUE *)val);
|
||||||
|
@ -216,7 +222,7 @@ wmap_foreach_i(st_data_t key, st_data_t val, st_data_t arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
wmap_foreach(struct weakmap *w, void (*func)(VALUE, VALUE, st_data_t), st_data_t arg)
|
wmap_foreach(struct weakmap *w, void (*func)(struct weakmap_entry *, st_data_t), st_data_t arg)
|
||||||
{
|
{
|
||||||
struct wmap_foreach_data foreach_data = {
|
struct wmap_foreach_data foreach_data = {
|
||||||
.func = func,
|
.func = func,
|
||||||
|
@ -238,7 +244,7 @@ wmap_inspect_append(VALUE str, VALUE obj)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
wmap_inspect_i(VALUE key, VALUE val, st_data_t data)
|
wmap_inspect_i(struct weakmap_entry *entry, st_data_t data)
|
||||||
{
|
{
|
||||||
VALUE str = (VALUE)data;
|
VALUE str = (VALUE)data;
|
||||||
|
|
||||||
|
@ -250,9 +256,9 @@ wmap_inspect_i(VALUE key, VALUE val, st_data_t data)
|
||||||
RSTRING_PTR(str)[0] = '#';
|
RSTRING_PTR(str)[0] = '#';
|
||||||
}
|
}
|
||||||
|
|
||||||
wmap_inspect_append(str, key);
|
wmap_inspect_append(str, entry->key);
|
||||||
rb_str_cat2(str, " => ");
|
rb_str_cat2(str, " => ");
|
||||||
wmap_inspect_append(str, val);
|
wmap_inspect_append(str, entry->val);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
|
@ -273,9 +279,9 @@ wmap_inspect(VALUE self)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
wmap_each_i(VALUE key, VALUE val, st_data_t _)
|
wmap_each_i(struct weakmap_entry *entry, st_data_t _)
|
||||||
{
|
{
|
||||||
rb_yield_values(2, key, val);
|
rb_yield_values(2, entry->key, entry->val);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -298,9 +304,9 @@ wmap_each(VALUE self)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
wmap_each_key_i(VALUE key, VALUE _val, st_data_t _data)
|
wmap_each_key_i(struct weakmap_entry *entry, st_data_t _data)
|
||||||
{
|
{
|
||||||
rb_yield(key);
|
rb_yield(entry->key);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -323,9 +329,9 @@ wmap_each_key(VALUE self)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
wmap_each_value_i(VALUE _key, VALUE val, st_data_t _data)
|
wmap_each_value_i(struct weakmap_entry *entry, st_data_t _data)
|
||||||
{
|
{
|
||||||
rb_yield(val);
|
rb_yield(entry->val);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -348,11 +354,11 @@ wmap_each_value(VALUE self)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
wmap_keys_i(st_data_t key, st_data_t _, st_data_t arg)
|
wmap_keys_i(struct weakmap_entry *entry, st_data_t arg)
|
||||||
{
|
{
|
||||||
VALUE ary = (VALUE)arg;
|
VALUE ary = (VALUE)arg;
|
||||||
|
|
||||||
rb_ary_push(ary, key);
|
rb_ary_push(ary, entry->key);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -375,11 +381,11 @@ wmap_keys(VALUE self)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
wmap_values_i(st_data_t key, st_data_t val, st_data_t arg)
|
wmap_values_i(struct weakmap_entry *entry, st_data_t arg)
|
||||||
{
|
{
|
||||||
VALUE ary = (VALUE)arg;
|
VALUE ary = (VALUE)arg;
|
||||||
|
|
||||||
rb_ary_push(ary, (VALUE)val);
|
rb_ary_push(ary, entry->val);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue