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