stage1 实现更多ast2ir 修复bug 提供内置操作
This commit is contained in:
1 parent
ab6e99c958
commit
49ccdec3dd
10 files changed
+396
-76
No files matched your search
@@ -0,0 +1,46 @@
|
||||
#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;
|
||||
}
|
||||
Reference in new issue
Block a user