Skip to content

Support new overload for ObjCRuntime.Selector.GetHandle in the AOT compiler #82717

Open
@rolfbjarne

Description

@rolfbjarne

The AOT compiler supports inlining calls to Selector.GetHandle(string):

} else if (((!strcmp (cmethod_klass_image->assembly->aname.name, "Xamarin.iOS") ||
!strcmp (cmethod_klass_image->assembly->aname.name, "Xamarin.TVOS") ||
!strcmp (cmethod_klass_image->assembly->aname.name, "Xamarin.MacCatalyst") ||
!strcmp (cmethod_klass_image->assembly->aname.name, "Xamarin.Mac") ||
!strcmp (cmethod_klass_image->assembly->aname.name, "Microsoft.iOS") ||
!strcmp (cmethod_klass_image->assembly->aname.name, "Microsoft.tvOS") ||
!strcmp (cmethod_klass_image->assembly->aname.name, "Microsoft.MacCatalyst") ||
!strcmp (cmethod_klass_image->assembly->aname.name, "Microsoft.macOS")) &&
!strcmp (cmethod_klass_name_space, "ObjCRuntime") &&
!strcmp (cmethod_klass_name, "Selector"))
) {
if ((cfg->backend->have_objc_get_selector || cfg->compile_llvm) &&
!strcmp (cmethod->name, "GetHandle") && fsig->param_count == 1 &&
(args [0]->opcode == OP_GOT_ENTRY || args [0]->opcode == OP_AOTCONST) &&
cfg->compile_aot) {
MonoInst *pi;
MonoJumpInfoToken *ji;
char *s;
if (args [0]->opcode == OP_GOT_ENTRY) {
pi = (MonoInst *)args [0]->inst_p1;
g_assert (pi->opcode == OP_PATCH_INFO);
g_assert (GPOINTER_TO_INT (pi->inst_p1) == MONO_PATCH_INFO_LDSTR);
ji = (MonoJumpInfoToken *)pi->inst_p0;
} else {
g_assert (GPOINTER_TO_INT (args [0]->inst_p1) == MONO_PATCH_INFO_LDSTR);
ji = (MonoJumpInfoToken *)args [0]->inst_p0;
}
NULLIFY_INS (args [0]);
s = mono_ldstr_utf8 (ji->image, mono_metadata_token_index (ji->token), cfg->error);
return_val_if_nok (cfg->error, NULL);
MONO_INST_NEW (cfg, ins, OP_OBJC_GET_SELECTOR);
ins->dreg = mono_alloc_ireg (cfg);
// FIXME: Leaks
ins->inst_p0 = s;
MONO_ADD_INS (cfg->cbb, ins);
return ins;
}

and we'd like to add a new overload: Selector.GetHandle(ReadOnlySpan<byte>), where the constant value would be a UTF8 string:

Selector.GetHandle ("mySelector"u8);

And where the call to the new overload would also be optimized.

Would this be possible to implement?

CC @vargaz

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions