Cleanup string format. Using stage_arena
This commit is contained in:
@@ -39,29 +39,24 @@ gen_last_line() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
CORE_Static String
|
CORE_Static String
|
||||||
string_scope_name(Allocator *a, Ast_Scope *scope) {
|
string_scope_name(Ast_Scope *scope) {
|
||||||
String string = {};
|
String string = {};
|
||||||
if (scope->parent_scope) string = string_scope_name(a, scope->parent_scope);
|
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");
|
assert_message(scope->scope_id != 0, "Scope id is equal to 0 which is invalid, scope didn't initialize id");
|
||||||
string = string_fmt(a, "%QS%u_", string, scope->scope_id);
|
string = pctx->fmt("%QS%u_", string, scope->scope_id);
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
|
|
||||||
CORE_Static void
|
CORE_Static void
|
||||||
gen_scope_name(Ast_Scope *scope) {
|
gen_scope_name(Ast_Scope *scope) {
|
||||||
Scratch_Scope scratch(pctx->scratch);
|
gen("%Q", string_scope_name(scope));
|
||||||
String string = string_scope_name(scratch.arena, scope);
|
|
||||||
gen("%.*s", (int)string.len, string.str);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CORE_Static Intern_String
|
CORE_Static Intern_String
|
||||||
get_unique_name(Ast *ast) {
|
get_unique_name(Ast *ast) {
|
||||||
Scratch_Scope _scope(pctx->scratch);
|
String result = string_scope_name(ast->parent_scope);
|
||||||
String result = string_scope_name(pctx->scratch, ast->parent_scope);
|
|
||||||
assert(result.len);
|
assert(result.len);
|
||||||
result = string_fmt(pctx->scratch, "%Q%d", result, ast->pos->line);
|
return pctx->internf("%Q%d", result, ast->pos->line);
|
||||||
Intern_String result2 = pctx->intern(result);
|
|
||||||
return result2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
global String prefixed_string_type;
|
global String prefixed_string_type;
|
||||||
@@ -99,11 +94,10 @@ get_ctype_name_for_type(Ast_Type *type) {
|
|||||||
|
|
||||||
CORE_Static String
|
CORE_Static String
|
||||||
string_simple_decl_prefix(Ast_Type *ast) {
|
string_simple_decl_prefix(Ast_Type *ast) {
|
||||||
Allocator *a = pctx->stage_arena;
|
|
||||||
switch (ast->kind) {
|
switch (ast->kind) {
|
||||||
case TYPE_POINTER: {
|
case TYPE_POINTER: {
|
||||||
String string = string_simple_decl_prefix(ast->base);
|
String string = string_simple_decl_prefix(ast->base);
|
||||||
string = string_fmt(a, "%Q*", string);
|
string = pctx->fmt("%Q*", string);
|
||||||
return string;
|
return string;
|
||||||
} break;
|
} break;
|
||||||
case TYPE_LAMBDA: return {}; break;
|
case TYPE_LAMBDA: return {}; break;
|
||||||
@@ -113,22 +107,22 @@ string_simple_decl_prefix(Ast_Type *ast) {
|
|||||||
} break;
|
} break;
|
||||||
case TYPE_SLICE: {
|
case TYPE_SLICE: {
|
||||||
String string = string_simple_decl_prefix(ast->base);
|
String string = string_simple_decl_prefix(ast->base);
|
||||||
string = string_fmt(a, "Slice%llu ", ast->type_id);
|
string = pctx->fmt("Slice%llu ", ast->type_id);
|
||||||
return string;
|
return string;
|
||||||
} break;
|
} break;
|
||||||
case TYPE_TUPLE: {
|
case TYPE_TUPLE: {
|
||||||
String string = string_fmt(a, "Tuple%llu ", ast->type_id);
|
String string = pctx->fmt("Tuple%llu ", ast->type_id);
|
||||||
return string;
|
return string;
|
||||||
} break;
|
} break;
|
||||||
case TYPE_STRUCT: {
|
case TYPE_STRUCT: {
|
||||||
auto constant = (Ast_Decl *)ast->ast;
|
auto constant = (Ast_Decl *)ast->ast;
|
||||||
auto name = constant->unique_name;
|
auto name = constant->unique_name;
|
||||||
String string = string_fmt(a, "%Q ", name);
|
String string = pctx->fmt("%Q ", name);
|
||||||
String sc = {};
|
String sc = {};
|
||||||
return string_fmt(a, "%Q%Q", sc, string);
|
return pctx->fmt("%Q%Q", sc, string);
|
||||||
} break;
|
} break;
|
||||||
default: {
|
default: {
|
||||||
String string = string_fmt(a, "%s ", get_ctype_name_for_type(ast));
|
String string = pctx->fmt("%s ", get_ctype_name_for_type(ast));
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -137,14 +131,13 @@ string_simple_decl_prefix(Ast_Type *ast) {
|
|||||||
|
|
||||||
CORE_Static String
|
CORE_Static String
|
||||||
string_simple_decl_postfix(Ast_Type *ast) {
|
string_simple_decl_postfix(Ast_Type *ast) {
|
||||||
Allocator *a = pctx->stage_arena;
|
|
||||||
switch (ast->kind) {
|
switch (ast->kind) {
|
||||||
case TYPE_POINTER:
|
case TYPE_POINTER:
|
||||||
return string_simple_decl_postfix(ast->base);
|
return string_simple_decl_postfix(ast->base);
|
||||||
break;
|
break;
|
||||||
case TYPE_ARRAY: {
|
case TYPE_ARRAY: {
|
||||||
String result = string_simple_decl_postfix(ast->arr.base);
|
String result = string_simple_decl_postfix(ast->arr.base);
|
||||||
String string = string_fmt(a, "[%d]%Q", ast->arr.size, result);
|
String string = pctx->fmt("[%d]%Q", ast->arr.size, result);
|
||||||
return string;
|
return string;
|
||||||
} break;
|
} break;
|
||||||
case TYPE_LAMBDA: break;
|
case TYPE_LAMBDA: break;
|
||||||
@@ -160,26 +153,25 @@ string_simple_decl_postfix(Ast_Type *ast) {
|
|||||||
|
|
||||||
CORE_Static String
|
CORE_Static String
|
||||||
string_simple_decl(Ast_Type *ast, Intern_String name = {}) {
|
string_simple_decl(Ast_Type *ast, Intern_String name = {}) {
|
||||||
Allocator *a = pctx->stage_arena;
|
|
||||||
if (ast->kind == TYPE_LAMBDA) {
|
if (ast->kind == TYPE_LAMBDA) {
|
||||||
String prefix = string_simple_decl_prefix(ast->func.ret);
|
String prefix = string_simple_decl_prefix(ast->func.ret);
|
||||||
String string = string_fmt(a, "%Q(*%Q)(", prefix, name);
|
String string = pctx->fmt("%Q(*%Q)(", prefix, name);
|
||||||
For(ast->func.args) {
|
For(ast->func.args) {
|
||||||
String prefix_arg = string_simple_decl_prefix(it);
|
String prefix_arg = string_simple_decl_prefix(it);
|
||||||
string = string_fmt(a, "%Q%Q", string, prefix_arg);
|
string = pctx->fmt("%Q%Q", string, prefix_arg);
|
||||||
if (&it != ast->func.args.end() - 1)
|
if (&it != ast->func.args.end() - 1)
|
||||||
string = string_fmt(a, "%Q, ", string);
|
string = pctx->fmt("%Q, ", string);
|
||||||
}
|
}
|
||||||
string = string_fmt(a, "%Q)", string);
|
string = pctx->fmt("%Q)", string);
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
String string = string_simple_decl_prefix(ast);
|
String string = string_simple_decl_prefix(ast);
|
||||||
if (name.len) {
|
if (name.len) {
|
||||||
string = string_fmt(a, "%Q%Q", string, name);
|
string = pctx->fmt("%Q%Q", string, name);
|
||||||
}
|
}
|
||||||
String postfix = string_simple_decl_postfix(ast);
|
String postfix = string_simple_decl_postfix(ast);
|
||||||
string = string_fmt(a, "%Q%Q", string, postfix);
|
string = pctx->fmt("%Q%Q", string, postfix);
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -919,7 +911,7 @@ compile_to_c_code() {
|
|||||||
For(type->agg.members) {
|
For(type->agg.members) {
|
||||||
genln("");
|
genln("");
|
||||||
// @todo remove intern from gen
|
// @todo remove intern from gen
|
||||||
Intern_String name = pctx->intern(string_fmt(scratch.arena, "m%llu", type->agg.members.get_index(&it)));
|
Intern_String name = pctx->internf("m%llu", type->agg.members.get_index(&it));
|
||||||
gen_simple_decl(it.type, name);
|
gen_simple_decl(it.type, name);
|
||||||
gen(";");
|
gen(";");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -191,6 +191,16 @@ struct Core_Ctx {
|
|||||||
assert(string.len > 0);
|
assert(string.len > 0);
|
||||||
return intern_string(&interns, string);
|
return intern_string(&interns, string);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Intern_String internf(char *str, ...) {
|
||||||
|
STRING_FMT(this->stage_arena, str, result);
|
||||||
|
return intern_string(&interns, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
String fmt(char *str, ...) {
|
||||||
|
STRING_FMT(this->stage_arena, str, result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
CORE_Static String compile_to_c_code();
|
CORE_Static String compile_to_c_code();
|
||||||
|
|||||||
Reference in New Issue
Block a user