@@ -2092,6 +2092,9 @@ gen_send_iseq(jitstate_t *jit, ctx_t *ctx, const struct rb_callinfo *ci, const r
2092
2092
return YJIT_END_BLOCK ;
2093
2093
}
2094
2094
2095
+ const rb_callable_method_entry_t *
2096
+ rb_aliased_callable_method_entry (const rb_callable_method_entry_t * me );
2097
+
2095
2098
static codegen_status_t
2096
2099
gen_send_general (jitstate_t * jit , ctx_t * ctx , struct rb_call_data * cd , rb_iseq_t * block )
2097
2100
{
@@ -2176,54 +2179,61 @@ gen_send_general(jitstate_t *jit, ctx_t *ctx, struct rb_call_data *cd, rb_iseq_t
2176
2179
// Method calls may corrupt types
2177
2180
ctx_clear_local_types (ctx );
2178
2181
2179
- switch (cme -> def -> type ) {
2180
- case VM_METHOD_TYPE_ISEQ :
2181
- return gen_send_iseq (jit , ctx , ci , cme , block , argc );
2182
- case VM_METHOD_TYPE_CFUNC :
2183
- return gen_send_cfunc (jit , ctx , ci , cme , block , argc );
2184
- case VM_METHOD_TYPE_IVAR :
2185
- if (argc != 0 ) {
2186
- // Argument count mismatch. Getters take no arguments.
2187
- GEN_COUNTER_INC (cb , send_getter_arity );
2182
+ // To handle the aliased method case (VM_METHOD_TYPE_ALIAS)
2183
+ while (true) {
2184
+ // switch on the method type
2185
+ switch (cme -> def -> type ) {
2186
+ case VM_METHOD_TYPE_ISEQ :
2187
+ return gen_send_iseq (jit , ctx , ci , cme , block , argc );
2188
+ case VM_METHOD_TYPE_CFUNC :
2189
+ return gen_send_cfunc (jit , ctx , ci , cme , block , argc );
2190
+ case VM_METHOD_TYPE_IVAR :
2191
+ if (argc != 0 ) {
2192
+ // Argument count mismatch. Getters take no arguments.
2193
+ GEN_COUNTER_INC (cb , send_getter_arity );
2194
+ return YJIT_CANT_COMPILE ;
2195
+ }
2196
+ else {
2197
+ mov (cb , REG0 , recv );
2198
+
2199
+ ID ivar_name = cme -> def -> body .attr .id ;
2200
+ return gen_get_ivar (jit , ctx , SEND_MAX_DEPTH , comptime_recv , ivar_name , recv_opnd , side_exit );
2201
+ }
2202
+ case VM_METHOD_TYPE_ATTRSET :
2203
+ GEN_COUNTER_INC (cb , send_ivar_set_method );
2188
2204
return YJIT_CANT_COMPILE ;
2205
+ case VM_METHOD_TYPE_BMETHOD :
2206
+ GEN_COUNTER_INC (cb , send_bmethod );
2207
+ return YJIT_CANT_COMPILE ;
2208
+ case VM_METHOD_TYPE_ZSUPER :
2209
+ GEN_COUNTER_INC (cb , send_zsuper_method );
2210
+ return YJIT_CANT_COMPILE ;
2211
+ case VM_METHOD_TYPE_ALIAS : {
2212
+ // Retrieve the alised method and re-enter the switch
2213
+ cme = rb_aliased_callable_method_entry (cme );
2214
+ continue ;
2189
2215
}
2190
- else {
2191
- mov (cb , REG0 , recv );
2192
-
2193
- ID ivar_name = cme -> def -> body .attr .id ;
2194
- return gen_get_ivar (jit , ctx , SEND_MAX_DEPTH , comptime_recv , ivar_name , recv_opnd , side_exit );
2216
+ case VM_METHOD_TYPE_UNDEF :
2217
+ GEN_COUNTER_INC (cb , send_undef_method );
2218
+ return YJIT_CANT_COMPILE ;
2219
+ case VM_METHOD_TYPE_NOTIMPLEMENTED :
2220
+ GEN_COUNTER_INC (cb , send_not_implemented_method );
2221
+ return YJIT_CANT_COMPILE ;
2222
+ case VM_METHOD_TYPE_OPTIMIZED :
2223
+ GEN_COUNTER_INC (cb , send_optimized_method );
2224
+ return YJIT_CANT_COMPILE ;
2225
+ case VM_METHOD_TYPE_MISSING :
2226
+ GEN_COUNTER_INC (cb , send_missing_method );
2227
+ return YJIT_CANT_COMPILE ;
2228
+ case VM_METHOD_TYPE_REFINED :
2229
+ GEN_COUNTER_INC (cb , send_refined_method );
2230
+ return YJIT_CANT_COMPILE ;
2231
+ // no default case so compiler issues a warning if this is not exhaustive
2195
2232
}
2196
- case VM_METHOD_TYPE_ATTRSET :
2197
- GEN_COUNTER_INC (cb , send_ivar_set_method );
2198
- return YJIT_CANT_COMPILE ;
2199
- case VM_METHOD_TYPE_BMETHOD :
2200
- GEN_COUNTER_INC (cb , send_bmethod );
2201
- return YJIT_CANT_COMPILE ;
2202
- case VM_METHOD_TYPE_ZSUPER :
2203
- GEN_COUNTER_INC (cb , send_zsuper_method );
2204
- return YJIT_CANT_COMPILE ;
2205
- case VM_METHOD_TYPE_ALIAS :
2206
- GEN_COUNTER_INC (cb , send_alias_method );
2207
- return YJIT_CANT_COMPILE ;
2208
- case VM_METHOD_TYPE_UNDEF :
2209
- GEN_COUNTER_INC (cb , send_undef_method );
2210
- return YJIT_CANT_COMPILE ;
2211
- case VM_METHOD_TYPE_NOTIMPLEMENTED :
2212
- GEN_COUNTER_INC (cb , send_not_implemented_method );
2213
- return YJIT_CANT_COMPILE ;
2214
- case VM_METHOD_TYPE_OPTIMIZED :
2215
- GEN_COUNTER_INC (cb , send_optimized_method );
2216
- return YJIT_CANT_COMPILE ;
2217
- case VM_METHOD_TYPE_MISSING :
2218
- GEN_COUNTER_INC (cb , send_missing_method );
2219
- return YJIT_CANT_COMPILE ;
2220
- case VM_METHOD_TYPE_REFINED :
2221
- GEN_COUNTER_INC (cb , send_refined_method );
2222
- return YJIT_CANT_COMPILE ;
2223
- // no default case so compiler issues a warning if this is not exhaustive
2224
- }
2225
2233
2226
- return YJIT_CANT_COMPILE ;
2234
+ // Unreachable
2235
+ RUBY_ASSERT (false);
2236
+ }
2227
2237
}
2228
2238
2229
2239
static codegen_status_t
0 commit comments