stage1 vm abi更新 修复更多问题
This commit is contained in:
1 parent
09d05e3a34
commit
f6a0bce9f0
6 files changed
+124
-60
No files matched your search
+25
-12
@@ -260,7 +260,12 @@ static inline void sema_push_scope(spl_sema_t *sema) {
|
||||
}
|
||||
|
||||
static inline void sema_pop_scope(spl_sema_t *sema) {
|
||||
sema->scope->current_scope = sema->store_scope;
|
||||
spl_scope_id_t cur = sema->scope->current_scope;
|
||||
if (cur != 0 && cur < vec_size(sema->scope->scopes)) {
|
||||
sema->scope->current_scope = vec_at(sema->scope->scopes, cur).parent;
|
||||
} else {
|
||||
sema->scope->current_scope = sema->store_scope;
|
||||
}
|
||||
}
|
||||
|
||||
static spl_lang_type_id_t sema_for_elem_type(spl_sema_t *sema, spl_lang_type_id_t lang_tid) {
|
||||
@@ -869,18 +874,23 @@ static spl_lang_type_id_t sema_coerce(spl_sema_t *sema, spl_ast_node_ref_t ref,
|
||||
}
|
||||
|
||||
case SPL_AST_EXPR_BLOCK: {
|
||||
sema_push_scope(sema);
|
||||
for (usize i = 0; i < vec_size(n->block.stmts); ++i)
|
||||
sema_infer(sema, vec_at(n->block.stmts, i));
|
||||
spl_lang_type_id_t r = 0;
|
||||
if (n->block.tail_expr) {
|
||||
spl_lang_type_id_t t = sema_coerce(sema, n->block.tail_expr, expected);
|
||||
if (!t)
|
||||
if (!t) {
|
||||
sema_pop_scope(sema);
|
||||
return 0;
|
||||
n->resolved_lang_tid = t;
|
||||
return t;
|
||||
}
|
||||
r = t;
|
||||
} else {
|
||||
r = spl_lang_make_unit(sema->type);
|
||||
}
|
||||
spl_lang_type_id_t u = spl_lang_make_unit(sema->type);
|
||||
n->resolved_lang_tid = u;
|
||||
return u;
|
||||
sema_pop_scope(sema);
|
||||
n->resolved_lang_tid = r;
|
||||
return r;
|
||||
}
|
||||
|
||||
default:
|
||||
@@ -1218,11 +1228,12 @@ static spl_lang_type_id_t sema_infer(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
||||
if (!sema_coerce(sema, vec_at(n->call.args, i), pt))
|
||||
return 0;
|
||||
}
|
||||
/* varargs:默认提升到 isize */
|
||||
|
||||
if (has_varargs) {
|
||||
spl_lang_type_id_t vt = spl_lang_make_int(sema->type, sizeof(void *) * 8, 1);
|
||||
for (usize i = fixed; i < nargs; ++i)
|
||||
sema_coerce(sema, vec_at(n->call.args, i), vt);
|
||||
for (usize i = fixed; i < nargs; ++i) {
|
||||
if (!sema_infer(sema, vec_at(n->call.args, i)))
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
spl_lang_type_id_t ret = fn->extra.fn.ret;
|
||||
@@ -1495,11 +1506,13 @@ static spl_lang_type_id_t sema_infer(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
||||
|
||||
/* ---------- BLOCK ---------- */
|
||||
case SPL_AST_EXPR_BLOCK: {
|
||||
sema_push_scope(sema);
|
||||
spl_lang_type_id_t last = 0;
|
||||
for (usize i = 0; i < vec_size(n->block.stmts); ++i)
|
||||
last = sema_infer(sema, vec_at(n->block.stmts, i));
|
||||
sema_infer(sema, vec_at(n->block.stmts, i));
|
||||
if (n->block.tail_expr)
|
||||
last = sema_infer(sema, n->block.tail_expr);
|
||||
sema_pop_scope(sema);
|
||||
n->resolved_lang_tid = last;
|
||||
return last;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user