stage2 大量优化代码使其自举编译时间大幅缩短

This commit is contained in:
zzy committed 2026-09-20 09:33:20 +08:00
1 parent e02b0c633a
commit 846f441e3a
38 files changed
+2418 -835

No files matched your search

+11 -10
View File
@@ -764,8 +764,7 @@ static void sema_collect_signatures(spl_sema_t *sema) {
spl_def_node_t *d = &vec_at(sema->type->def_table, i);
/* Nested imports share def_table, but each module has its own scope.
* Resolve other modules' signatures only when processing their AST. */
if (d->owner_ast == sema->ast && d->kind == SPL_DEF_FN &&
d->state == SPL_DECL_UNRESOLVED)
if (d->owner_ast == sema->ast && d->kind == SPL_DEF_FN && d->state == SPL_DECL_UNRESOLVED)
sema_eval_decl(sema, i);
}
}
@@ -830,14 +829,14 @@ static spl_lang_type_id_t sema_infer_type_context(spl_sema_t *sema, spl_ast_node
spl_symbol_t symbol;
if (!spl_scope_find(sema->scope, n->ident.name, &symbol) ||
symbol.kind != SPL_SYMBOL_KIND_TYPE) {
spl_diag_error(sema->diag, SPL_DIAG_KIND_TYPE_MISMATCH, &n->dbg,
"`%s` is not a type", n->ident.name);
spl_diag_error(sema->diag, SPL_DIAG_KIND_TYPE_MISMATCH, &n->dbg, "`%s` is not a type",
n->ident.name);
return 0;
}
spl_def_node_t *def = spl_def_node(sema->type, symbol.node);
if (!sema_def_is_type(def)) {
spl_diag_error(sema->diag, SPL_DIAG_KIND_TYPE_MISMATCH, &n->dbg,
"`%s` is not a type", n->ident.name);
spl_diag_error(sema->diag, SPL_DIAG_KIND_TYPE_MISMATCH, &n->dbg, "`%s` is not a type",
n->ident.name);
return 0;
}
n->resolved_def_id = symbol.node;
@@ -880,16 +879,15 @@ static spl_lang_type_id_t sema_infer_type_context(spl_sema_t *sema, spl_ast_node
spl_lang_type_id_vec_t elements;
vec_init(elements);
for (usize i = 0; i < vec_size(n->tuple.elems); ++i) {
spl_lang_type_id_t element =
sema_infer_type_context(sema, vec_at(n->tuple.elems, i));
spl_lang_type_id_t element = sema_infer_type_context(sema, vec_at(n->tuple.elems, i));
if (!element) {
vec_free(elements);
return 0;
}
vec_push(elements, element);
}
spl_lang_type_id_t result = spl_lang_make_tuple(
sema->type, vec_unsafe_get_data(elements), vec_size(elements));
spl_lang_type_id_t result =
spl_lang_make_tuple(sema->type, vec_unsafe_get_data(elements), vec_size(elements));
vec_free(elements);
n->resolved_lang_tid = result;
return result;
@@ -2866,6 +2864,7 @@ void spl_sema_dump(spl_sema_t *sema) {
printf("Scopes:\n");
for (usize i = 1; i < vec_size(sema->scope->scopes); ++i) {
spl_scope_node_t *scope = &vec_at(sema->scope->scopes, i);
Assert(scope != NULL);
printf("scope[%zu] parent=%zu\n", i, scope->parent);
/* 按符号名排序输出:与哈希表内部布局解耦,保证确定顺序。 */
@@ -2873,6 +2872,7 @@ void spl_sema_dump(spl_sema_t *sema) {
spl_sema_sym_t *arr = nsyms ? malloc(nsyms * sizeof(*arr)) : NULL;
usize k = 0;
map_for(scope->symbols, j) {
Assert(arr != NULL);
arr[k].key = unsafe_map_at(scope->symbols, j).key;
arr[k].sym = unsafe_map_at(scope->symbols, j).val;
k++;
@@ -2880,6 +2880,7 @@ void spl_sema_dump(spl_sema_t *sema) {
if (arr && nsyms > 1)
qsort(arr, nsyms, sizeof(*arr), spl_sema_sym_cmp);
for (k = 0; k < nsyms; ++k) {
Assert(arr != NULL);
printf(" %s -> def`%s`#%zu\n", arr[k].key, arr[k].sym.name, arr[k].sym.node);
}
free(arr);