diff options
author | Jean Boussier <[email protected]> | 2023-11-20 17:23:07 +0100 |
---|---|---|
committer | Jean Boussier <[email protected]> | 2023-11-20 18:04:13 +0100 |
commit | ffb1eb37e74334ae85d6bfee07d784a145e23dd8 (patch) | |
tree | 917c04399f32a828aef85cc4d4dcd7433d7b71b2 /proc.c | |
parent | 5278742bf0bfcee343f31bcedea3f14896fa47f9 (diff) |
proc.c: Make Method and UnboundMethod embded
Avoid some needless malloc churn
```
compare-ruby: ruby 3.3.0dev (2023-11-20T02:02:55Z master 701b0650de) [arm64-darwin22]
last_commit=[ruby/prism] feat: add encoding for IBM865 (https://github.com/ruby/prism/pull/1884)
built-ruby: ruby 3.3.0dev (2023-11-20T16:23:07Z embedded-methods e35284bfaa) [arm64-darwin22]
warming up..
| |compare-ruby|built-ruby|
|:------------------------|-----------:|---------:|
|allocate_method | 8.413M| 12.333M|
| | -| 1.47x|
|allocate_unbound_method | 8.083M| 11.607M|
| | -| 1.44x|
```
```
prelude: |
class SomeClass
def foo
end
end
some_object = SomeClass.new
benchmark:
allocate_method: some_object.method(:foo)
allocate_unbound_method: SomeClass.instance_method(:foo)
```
Diffstat (limited to 'proc.c')
-rw-r--r-- | proc.c | 10 |
1 files changed, 5 insertions, 5 deletions
@@ -1600,7 +1600,7 @@ bm_mark_and_move(void *ptr) static size_t bm_memsize(const void *ptr) { - return sizeof(struct METHOD); + return 0; } static const rb_data_type_t method_data_type = { @@ -1611,7 +1611,7 @@ static const rb_data_type_t method_data_type = { bm_memsize, bm_mark_and_move, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED + 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_EMBEDDABLE }; VALUE @@ -1805,8 +1805,8 @@ method_eq(VALUE method, VALUE other) return Qfalse; Check_TypedStruct(method, &method_data_type); - m1 = (struct METHOD *)DATA_PTR(method); - m2 = (struct METHOD *)DATA_PTR(other); + m1 = (struct METHOD *)RTYPEDDATA_GET_DATA(method); + m2 = (struct METHOD *)RTYPEDDATA_GET_DATA(other); klass1 = method_entry_defined_class(m1->me); klass2 = method_entry_defined_class(m2->me); @@ -2222,7 +2222,7 @@ rb_mod_define_method_with_visibility(int argc, VALUE *argv, VALUE mod, const str if (!id) id = rb_to_id(name); if (is_method) { - struct METHOD *method = (struct METHOD *)DATA_PTR(body); + struct METHOD *method = (struct METHOD *)RTYPEDDATA_GET_DATA(body); if (method->me->owner != mod && !RB_TYPE_P(method->me->owner, T_MODULE) && !RTEST(rb_class_inherited_p(mod, method->me->owner))) { if (FL_TEST(method->me->owner, FL_SINGLETON)) { |