summaryrefslogtreecommitdiff
path: root/enumerator.c
diff options
context:
space:
mode:
authorPeter Zhu <peter@peterzhu.ca>2023-11-20 11:28:36 -0500
committerPeter Zhu <peter@peterzhu.ca>2023-11-20 18:59:01 -0500
commita182b2c5e1dbdbe8960912f8bac076d997a74e65 (patch)
treee19ac316b7c4a36f4be9560d72de6b28c9a49b21 /enumerator.c
parentad033207435b8e18f12c70643afbf68725948230 (diff)
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 ```
Diffstat (limited to 'enumerator.c')
-rw-r--r--enumerator.c16
1 files changed, 4 insertions, 12 deletions
diff --git a/enumerator.c b/enumerator.c
index 0e010c14c2..98432df93d 100644
--- a/enumerator.c
+++ b/enumerator.c
@@ -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;