Core: Remove AST_Tuple, repurpose VAR_UNPACK (buggy probably)
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user