Implement Enumerator objects on VWA

This commit implements Enumerator objects on VWA. This speeds allocations
and decreases memory usage.

```
require "benchmark"

ary = []

puts(Benchmark.measure do
  10_000_000.times do
    u = ary.to_enum
  end
end)

puts `ps -o rss= -p #{$$}`
```

Before:

```
  1.500774   0.002717   1.503491 (  1.506791)
 18512
```

After:

```
  0.892580   0.002539   0.895119 (  0.897642)
 16480
```
This commit is contained in:
Peter Zhu 2023-11-20 11:28:36 -05:00
parent ad03320743
commit a182b2c5e1

View File

@ -256,23 +256,15 @@ struct enum_product {
VALUE rb_cArithSeq;
#define enumerator_free RUBY_TYPED_DEFAULT_FREE
static size_t
enumerator_memsize(const void *p)
{
return sizeof(struct enumerator);
}
static const rb_data_type_t enumerator_data_type = {
"enumerator",
{
REFS_LIST_PTR(enumerator_refs),
enumerator_free,
enumerator_memsize,
RUBY_TYPED_DEFAULT_FREE,
NULL, // Nothing allocated externally, so don't need a memsize function
NULL,
},
0, NULL, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_DECL_MARKING
0, NULL, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_DECL_MARKING | RUBY_TYPED_EMBEDDABLE
};
static struct enumerator *
@ -1909,7 +1901,7 @@ lazy_add_method(VALUE obj, int argc, VALUE *argv, VALUE args, VALUE memo,
rb_ary_push(new_procs, entry_obj);
new_obj = enumerator_init_copy(enumerator_allocate(rb_cLazy), obj);
new_e = DATA_PTR(new_obj);
new_e = RTYPEDDATA_GET_DATA(new_obj);
new_e->obj = new_generator;
new_e->procs = new_procs;