Core: Remove AST_Tuple, repurpose VAR_UNPACK (buggy probably)

This commit is contained in:
Krzosa Karol
2023-04-21 22:49:15 +02:00
parent 108ec6121e
commit bbd8b0ab91
12 changed files with 92 additions and 238 deletions

View File

@@ -72,7 +72,6 @@ get_ctype_name_for_type(Ast_Type *type) {
case TYPE_U16: return "uint16_t";
case TYPE_U32: return "uint32_t";
case TYPE_U64: return "uint64_t";
case TYPE_TUPLE: return "Tuple";
case TYPE_TYPE: return "int64_t";
case TYPE_INCOMPLETE: {
@@ -105,10 +104,6 @@ string_simple_decl_prefix(Ast_Type *ast) {
string = pctx->fmt("Slice%llu ", ast->type_id);
return string;
} break;
case TYPE_TUPLE: {
String string = pctx->fmt("Tuple%llu ", ast->type_id);
return string;
} break;
case TYPE_UNION:
case TYPE_STRUCT: {
auto constant = (Ast_Decl *)ast->ast;
@@ -189,6 +184,7 @@ get_type_postfix(Ast_Type *type) {
case TYPE_U8:
case TYPE_UCHAR:
case TYPE_U16:
case TYPE_UINT:
case TYPE_U32: return "U"_s; break;
case TYPE_SHORT:
@@ -585,39 +581,8 @@ gen_ast(Ast *ast) {
}
CASE(RETURN, Return) {
if (is_tuple(node->resolved_type)) {
Scoped_Arena scratch(pctx->scratch);
Intern_String tuple_name = get_unique_name();
gen_simple_decl(node->resolved_type, tuple_name);
gen(";");
int i = 0;
For(node->expr) {
// We cant assign to array in C so we need a special case
if (is_array(it->resolved_type)) {
genln("MemoryCopy(&%Q.m%d, ", tuple_name, i);
gen_expr(it);
gen(", sizeof(%Q.m%d));", tuple_name, i);
}
else {
genln("%Q.m%d = ", tuple_name, i);
gen_expr(it);
gen(";");
}
i += 1;
}
gen_line(node);
genln("return %Q;", tuple_name);
return;
}
assert(node->expr.len <= 1);
gen("return ");
For(node->expr) gen_expr(it);
gen_expr(node->expr);
gen(";");
BREAK();
}
@@ -814,10 +779,10 @@ gen_ast(Ast *ast) {
}
CASE(VAR_UNPACK, Var_Unpack) {
For(node->vars)
Ast_Type *t = node->resolved_type;
For(node->vars) {
gen_ast(it);
Scoped_Arena scratch(pctx->scratch);
}
Intern_String var_name = get_unique_name();
gen_simple_decl(node->resolved_type, var_name);
@@ -827,7 +792,12 @@ gen_ast(Ast *ast) {
int i = 0;
For(node->vars) {
gen("MemoryCopy((void *)&%Q, (void *)&%Q.m%d, sizeof(%Q));", it->name, var_name, i++, it->name);
Ast_Resolved_Member &m = t->agg.members[i];
char *p = "&";
if (is_array(m.type)) p = "";
gen("MemoryCopy((void *)%s%Q, (void *)%s%Q.%Q, sizeof(%Q));", p, it->name, p, var_name, m.name, it->name);
i = +1;
}
BREAK();
}
@@ -926,10 +896,8 @@ int printf(const char *format, ...);
}
}
// Generate slice and tuple types
// Generate slice types
For2(pctx->all_types, type) {
Scoped_Arena scratch(pctx->scratch);
if (type->kind == TYPE_SLICE) {
genln("typedef struct Slice%llu{", type->type_id);
global_indent++;
@@ -940,20 +908,6 @@ int printf(const char *format, ...);
global_indent--;
genln("} Slice%llu;", type->type_id);
}
else if (type->kind == TYPE_TUPLE) {
genln("typedef struct Tuple%llu{", type->type_id);
global_indent++;
For(type->agg.members) {
genln("");
// @todo remove intern from gen
Intern_String name = pctx->internf("m%llu", type->agg.members.get_index(it));
gen_simple_decl(it.type, name);
gen(";");
}
global_indent--;
genln("} Tuple%llu;", type->type_id);
}
}
Intern_String intern_main = pctx->intern("main"_s);
@@ -994,12 +948,15 @@ int printf(const char *format, ...);
}
// Generate type info
genln("int64_t type_infos_len = %d;", length(&pctx->all_types));
genln("int type_infos_len = %d;", length(&pctx->all_types));
genln("Type_Info *type_infos = (Type_Info[]){");
global_indent++;
int i = 0;
For2(pctx->all_types, t) {
if (t->kind == TYPE_POLYMORPH) continue;
// if (t->kind == TYPE_VARGS) continue;
if (i++ != t->type_id) {
compiler_error(0, "Internal compiler error: type info array is inconsistent");
}
genln("{/*%Q*/", typestring(t));
global_indent += 1;
@@ -1042,9 +999,11 @@ int printf(const char *format, ...);
global_indent -= 1;
genln("}");
} break;
case AST_ENUM: {
// todo;
} break;
default: {
}
// invalid_default_case;
}
end_of_switch:;
global_indent -= 1;