refactor(ast): 将AST类型系统重构为规范类型系统
- 将scc_ast_type_t替换为scc_ast_qual_type_t,引入规范类型概念 - 添加scc_ast_canonical_type_t联合体用于表示规范类型 - 修改头文件结构,移除大量内联初始化函数,改为使用AST上下文分配器 - 添加SCC_AST_ALLOC宏用于统一节点分配管理 - 更新builtin类型枚举定义,添加类型计数常量 feat(ast): 引入AST上下文管理器 - 创建scc_ast_ctx_t结构体用于管理AST节点生命周期 - 实现类型池化机制,支持内置类型的统一管理 - 添加canonical类型获取和分配接口 refactor(abi): 适配新的AST类型系统 - 更新头文件包含,从<scc_ir.h>改为<scc_hir.h> - 适配函数参数类型,使用qual_type替代原始type - 使用scc_ast_canon_type()函数获取规范类型进行处理 Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
@@ -123,7 +123,7 @@ static int cmp_type(const void *_key1, const void *_key2, void *userdata) {
|
||||
key2->data.function.params.size) {
|
||||
return 1;
|
||||
}
|
||||
for (usize i = 0; i < key1->data.function.params.size; i++) {
|
||||
scc_vec_foreach(key1->data.function.params, i) {
|
||||
if (key1->data.function.params.data[i] !=
|
||||
key2->data.function.params.data[i]) {
|
||||
return 1;
|
||||
@@ -131,6 +131,20 @@ static int cmp_type(const void *_key1, const void *_key2, void *userdata) {
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
case SCC_HIR_TYPE_STRUCT:
|
||||
case SCC_HIR_TYPE_UNION: {
|
||||
if (key1->data.aggregate.fields.size !=
|
||||
key2->data.aggregate.fields.size) {
|
||||
return 1;
|
||||
}
|
||||
scc_vec_foreach(key1->data.aggregate.fields, i) {
|
||||
if (key1->data.aggregate.fields.data[i] !=
|
||||
key2->data.aggregate.fields.data[i]) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
default:
|
||||
Panic("Unknown key type %d", key1->tag);
|
||||
return 1;
|
||||
|
||||
@@ -429,6 +429,18 @@ void scc_hir_dump_type_linear(scc_hir_dump_t *ctx,
|
||||
scc_tree_dump_append(ctx->dump_ctx, ")");
|
||||
}
|
||||
break;
|
||||
case SCC_HIR_TYPE_STRUCT:
|
||||
case SCC_HIR_TYPE_UNION:
|
||||
scc_tree_dump_append_fmt(ctx->dump_ctx, "%s {",
|
||||
type->tag == SCC_HIR_TYPE_STRUCT ? "struct"
|
||||
: "union");
|
||||
scc_vec_foreach(type->data.aggregate.fields, i) {
|
||||
scc_hir_dump_type_linear(
|
||||
ctx, scc_vec_at(type->data.aggregate.fields, i));
|
||||
scc_tree_dump_append(ctx->dump_ctx, ";");
|
||||
}
|
||||
scc_tree_dump_append(ctx->dump_ctx, "}");
|
||||
break;
|
||||
default:
|
||||
LOG_ERROR("invalid type tag");
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user