YJIT: call alloc func directly in new#13219
Conversation
This removes an indirect branch by calling the allocator function from the class directly.
|
|
||
| let allocator = unsafe { rb_get_alloc_func(comptime_recv) }; | ||
| let allocator = allocator.unwrap_or(rb_obj_alloc); | ||
| let obj = asm.ccall(allocator as _, vec![comptime_recv.into()]); |
There was a problem hiding this comment.
When an allocator function is found, it seems to skip the if (rb_obj_class(obj) != rb_class_real(klass)) { rb_raise(rb_eTypeError, "wrong instance allocation"); } check in class_call_alloc_func. Is the error unreachable?
There was a problem hiding this comment.
Wouldn't this only be a problem for T_DATA objects? I don't think they use rb_class_allocate_instance as their allocator.
There was a problem hiding this comment.
I think it's only reachable from a custom allocator which is implemented incorrectly (there's no reason to ever return an object with the wrong class), so I'm not sure if it's necessary to keep.
If it is I suppose we could allowlist just the most common builtin allocators (or even just the T_OBJECT allocator).
There was a problem hiding this comment.
I honestly didn't know when it happens (it'd be nice to have a comment there) and thus asked a question. If the check is useless (on opt_new's rb_obj_alloc call) on the interpreter too, it's fine.
This comment has been minimized.
This comment has been minimized.
|
I think we can revive this if you are still interested. We do something very similar in ZJIT after @byroot's shapes changes |
This removes an indirect branch by calling the allocator function from the class directly.
cc @tenderlove