#include "spl_intrin.h" static const spl_intrin_info_t g_intrin_table[] = { [SPL_INTRIN_NONE] = {0}, [SPL_INTRIN_SIZEOF] = {"@sizeof", SPL_INTRIN_SIZEOF, SPL_INTRIN_FORM_CALL, 1, 1, SPL_INTRIN_RESULT_USIZE}, [SPL_INTRIN_ALIGNOF] = {"@alignof", SPL_INTRIN_ALIGNOF, SPL_INTRIN_FORM_CALL, 1, 1, SPL_INTRIN_RESULT_USIZE}, [SPL_INTRIN_ASSERT] = {"@assert", SPL_INTRIN_ASSERT, SPL_INTRIN_FORM_CALL, 1, 2, SPL_INTRIN_RESULT_UNIT}, [SPL_INTRIN_LEN] = {"len", SPL_INTRIN_LEN, SPL_INTRIN_FORM_FIELD, 0, 0, SPL_INTRIN_RESULT_USIZE}, }; static const usize g_intrin_count = sizeof(g_intrin_table) / sizeof(g_intrin_table[0]); const spl_intrin_info_t *spl_intrin_info(spl_intrin_t kind) { if ((usize)kind >= g_intrin_count) return NULL; return &g_intrin_table[kind]; } spl_intrin_t spl_intrin_lookup_call(const char *name) { if (!name) return SPL_INTRIN_NONE; const char *n = name[0] == '@' ? name + 1 : name; for (usize i = 1; i < g_intrin_count; ++i) { const spl_intrin_info_t *d = &g_intrin_table[i]; if (d->form != SPL_INTRIN_FORM_CALL) continue; const char *dn = d->name[0] == '@' ? d->name + 1 : d->name; if (strcmp(dn, n) == 0) return d->kind; } return SPL_INTRIN_NONE; } spl_intrin_t spl_intrin_lookup_field(spl_lang_type_kind_t recv_kind, const char *field) { if (!field) return SPL_INTRIN_NONE; if (strcmp(field, "len") == 0) { if (recv_kind == SPL_LANG_TYPE_ARRAY || recv_kind == SPL_LANG_TYPE_SLICE) return SPL_INTRIN_LEN; } return SPL_INTRIN_NONE; }