Unique names for polymorphic types

This commit is contained in:
Krzosa Karol
2023-04-01 11:43:26 +02:00
parent b14979d754
commit 9e077d4d88
3 changed files with 32 additions and 24 deletions

View File

@@ -41,27 +41,6 @@ gen_last_line() {
} }
} }
CORE_Static String
string_scope_name(Ast_Scope *scope) {
String string = {};
if (scope->parent_scope) string = string_scope_name(scope->parent_scope);
assert_message(scope->scope_id != 0, "Scope id is equal to 0 which is invalid, scope didn't initialize id");
string = pctx->fmt("%QS%u_", string, scope->scope_id);
return string;
}
CORE_Static void
gen_scope_name(Ast_Scope *scope) {
gen("%Q", string_scope_name(scope));
}
CORE_Static Intern_String
get_unique_name(Ast *ast) {
String result = string_scope_name(ast->parent_scope);
assert(result.len);
return pctx->internf("%Q%d", result, ast->pos->line);
}
global String prefixed_string_type; global String prefixed_string_type;
CORE_Static const char * CORE_Static const char *
get_ctype_name_for_type(Ast_Type *type) { get_ctype_name_for_type(Ast_Type *type) {
@@ -565,7 +544,7 @@ gen_ast(Ast *ast) {
if (is_tuple(node->resolved_type)) { if (is_tuple(node->resolved_type)) {
Scoped_Arena scratch(pctx->scratch); Scoped_Arena scratch(pctx->scratch);
Intern_String tuple_name = get_unique_name(node); Intern_String tuple_name = get_unique_name();
gen_simple_decl(node->resolved_type, tuple_name); gen_simple_decl(node->resolved_type, tuple_name);
gen(";"); gen(";");
@@ -804,7 +783,7 @@ gen_ast(Ast *ast) {
Scoped_Arena scratch(pctx->scratch); Scoped_Arena scratch(pctx->scratch);
Intern_String var_name = get_unique_name(node); Intern_String var_name = get_unique_name();
gen_simple_decl(node->resolved_type, var_name); gen_simple_decl(node->resolved_type, var_name);
gen(" = "); gen(" = ");
gen_expr(node->expr); gen_expr(node->expr);

View File

@@ -1,4 +1,18 @@
CORE_Static Intern_String
get_unique_name() {
static uint64_t counter;
static char char_counter;
if (char_counter == 0 || char_counter > 'Z') char_counter = 'A';
return pctx->internf("%c%uUnique", char_counter++, counter++);
}
CORE_Static Intern_String
get_unique_name_for_decl(Ast_Decl *decl) {
static char char_counter;
if (char_counter == 0 || char_counter > 'Z') char_counter = 'A';
return pctx->internf("%c%u_%Q", char_counter++, decl->di, decl->name);
}
#define ast_create_copy(parent_scope, T, ast) (T *)ast__create_copy(parent_scope, sizeof(T), ast) #define ast_create_copy(parent_scope, T, ast) (T *)ast__create_copy(parent_scope, sizeof(T), ast)
Ast *ast__create_copy(Ast_Scope *parent_scope, size_t size, Ast *ast) { Ast *ast__create_copy(Ast_Scope *parent_scope, size_t size, Ast *ast) {
@@ -297,6 +311,9 @@ Ast_Decl *get_or_instantiate_polymorph_type(Token *pos, Ast_Decl *poly, Array<As
unset_flag(result->flags, AST_POLYMORPH); unset_flag(result->flags, AST_POLYMORPH);
result->type_val = type_incomplete(result); result->type_val = type_incomplete(result);
result->polymorph_hash = hash; result->polymorph_hash = hash;
assert(result->di != poly->di);
result->name = get_unique_name_for_decl(result);
poly->polymorphs.add(result); poly->polymorphs.add(result);
} }

View File

@@ -24,9 +24,21 @@ Array :: struct($T: Type)
len: int len: int
cap: int cap: int
make_array :: (a: *int, count: int): Array(int)
result := Array(int) {
data = a,
len = count,
cap = count
}
return result
main :: (argc: int, argv: **char): int main :: (argc: int, argv: **char): int
array: Array(int) buff: *int
array: Array(int) = {len = 10, cap = 10, data = buff}
second_array: Array(int) second_array: Array(int)
third_array: Array(int) third_array: Array(int)
fourth: Array(F32)
fifth: Array(F32)
return 0 return 0