stage2 大量优化代码使其自举编译时间大幅缩短
This commit is contained in:
1 parent
e02b0c633a
commit
846f441e3a
38 files changed
+2418
-835
No files matched your search
+11
-10
@@ -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);
|
||||
|
||||
Reference in new issue
Block a user