Move interns into Core_Ctx

This commit is contained in:
Krzosa Karol
2023-01-01 14:23:59 +01:00
parent 647958b72d
commit 34928e3977
5 changed files with 103 additions and 103 deletions

View File

@@ -1,13 +1,14 @@
CORE_Static void CORE_Static void
core_init_compiler(Core_Ctx *ctx, Allocator *allocator) { core_init_compiler(Core_Ctx *ctx, Allocator *allocator) {
ctx->init_ctx_time_begin = os_time();
pctx = ctx;
ctx->emit_type_info = true; ctx->emit_type_info = true;
ctx->emit_line_directives = true; ctx->emit_line_directives = true;
ctx->color_codes_enabled = true; ctx->color_codes_enabled = true;
ctx->same_scope_token = { SAME_SCOPE }; ctx->same_scope_token = { SAME_SCOPE };
ctx->init_ctx_time_begin = os_time();
pctx = ctx;
ctx->perm_push_only = make_push_arena(allocator); ctx->perm_push_only = make_push_arena(allocator);
ctx->perm = &ctx->perm_push_only; ctx->perm = &ctx->perm_push_only;
ctx->scratch = allocate_scratch_arena(ctx->perm, mib(1)); ctx->scratch = allocate_scratch_arena(ctx->perm, mib(1));
@@ -24,49 +25,49 @@ core_init_compiler(Core_Ctx *ctx, Allocator *allocator) {
/*#import meta /*#import meta
for i in meta.keywords: for i in meta.keywords:
print(f'keyword_{i.lower()} = ctx->intern("{i}"_s);') print(f'pctx->keyword_{i.lower()} = pctx->intern("{i}"_s);')
print(f'ctx->interns.first_keyword = keyword_{meta.keywords[0].lower()}.str;') print(f'pctx->interns.first_keyword = keyword_{meta.keywords[0].lower()}.str;')
print(f'ctx->interns.last_keyword = keyword_{meta.keywords[-1].lower()}.str;') print(f'pctx->interns.last_keyword = keyword_{meta.keywords[-1].lower()}.str;')
for i in meta.interns: for i in meta.interns:
print(f'intern_{i.lower()} = ctx->intern("{i}"_s);') print(f'pctx->intern_{i.lower()} = pctx->intern("{i}"_s);')
index = 0 index = 0
for i in meta.token_simple_expr: for i in meta.token_simple_expr:
if i[1] != "SPECIAL": if i[1] != "SPECIAL":
print(f'op_info_table[{index}].op = ctx->intern("{i[1]}"_s);') print(f'op_info_table[{index}].op = pctx->intern("{i[1]}"_s);')
index += 1 index += 1
*/ */
keyword_struct = ctx->intern("struct"_s); pctx->keyword_struct = ctx->intern("struct"_s);
keyword_union = ctx->intern("union"_s); pctx->keyword_union = ctx->intern("union"_s);
keyword_true = ctx->intern("true"_s); pctx->keyword_true = ctx->intern("true"_s);
keyword_default = ctx->intern("default"_s); pctx->keyword_default = ctx->intern("default"_s);
keyword_break = ctx->intern("break"_s); pctx->keyword_break = ctx->intern("break"_s);
keyword_false = ctx->intern("false"_s); pctx->keyword_false = ctx->intern("false"_s);
keyword_return = ctx->intern("return"_s); pctx->keyword_return = ctx->intern("return"_s);
keyword_switch = ctx->intern("switch"_s); pctx->keyword_switch = ctx->intern("switch"_s);
keyword_assert = ctx->intern("Assert"_s); pctx->keyword_assert = ctx->intern("Assert"_s);
keyword_if = ctx->intern("if"_s); pctx->keyword_if = ctx->intern("if"_s);
keyword_elif = ctx->intern("elif"_s); pctx->keyword_elif = ctx->intern("elif"_s);
keyword_pass = ctx->intern("pass"_s); pctx->keyword_pass = ctx->intern("pass"_s);
keyword_else = ctx->intern("else"_s); pctx->keyword_else = ctx->intern("else"_s);
keyword_for = ctx->intern("for"_s); pctx->keyword_for = ctx->intern("for"_s);
keyword_enum = ctx->intern("enum"_s); pctx->keyword_enum = ctx->intern("enum"_s);
ctx->interns.first_keyword = keyword_struct.str; pctx->interns.first_keyword = pctx->keyword_struct.str;
ctx->interns.last_keyword = keyword_enum.str; pctx->interns.last_keyword = pctx->keyword_enum.str;
intern_typeof = ctx->intern("TypeOf"_s); pctx->intern_typeof = ctx->intern("TypeOf"_s);
intern_sizeof = ctx->intern("SizeOf"_s); pctx->intern_sizeof = ctx->intern("SizeOf"_s);
intern_len = ctx->intern("Len"_s); pctx->intern_len = ctx->intern("Len"_s);
intern_alignof = ctx->intern("AlignOf"_s); pctx->intern_alignof = ctx->intern("AlignOf"_s);
intern_foreign = ctx->intern("foreign"_s); pctx->intern_foreign = ctx->intern("foreign"_s);
intern_strict = ctx->intern("strict"_s); pctx->intern_strict = ctx->intern("strict"_s);
intern_void = ctx->intern("void"_s); pctx->intern_void = ctx->intern("void"_s);
intern_flag = ctx->intern("flag"_s); pctx->intern_flag = ctx->intern("flag"_s);
intern_it = ctx->intern("it"_s); pctx->intern_it = ctx->intern("it"_s);
intern_load = ctx->intern("load"_s); pctx->intern_load = ctx->intern("load"_s);
intern_import = ctx->intern("import"_s); pctx->intern_import = ctx->intern("import"_s);
intern_link = ctx->intern("link"_s); pctx->intern_link = ctx->intern("link"_s);
op_info_table[0].op = ctx->intern("*"_s); op_info_table[0].op = ctx->intern("*"_s);
op_info_table[1].op = ctx->intern("/"_s); op_info_table[1].op = ctx->intern("/"_s);
op_info_table[2].op = ctx->intern("%"_s); op_info_table[2].op = ctx->intern("%"_s);

View File

@@ -96,6 +96,39 @@ struct Core_Ctx{
Token same_scope_token; Token same_scope_token;
Token null_token; Token null_token;
/*#import meta
for i in meta.keywords: print(f'Intern_String keyword_{i.lower()};')
for i in meta.interns: print(f'Intern_String intern_{i.lower()};')
*/
Intern_String keyword_struct;
Intern_String keyword_union;
Intern_String keyword_true;
Intern_String keyword_default;
Intern_String keyword_break;
Intern_String keyword_false;
Intern_String keyword_return;
Intern_String keyword_switch;
Intern_String keyword_assert;
Intern_String keyword_if;
Intern_String keyword_elif;
Intern_String keyword_pass;
Intern_String keyword_else;
Intern_String keyword_for;
Intern_String keyword_enum;
Intern_String intern_typeof;
Intern_String intern_sizeof;
Intern_String intern_len;
Intern_String intern_alignof;
Intern_String intern_foreign;
Intern_String intern_strict;
Intern_String intern_void;
Intern_String intern_flag;
Intern_String intern_it;
Intern_String intern_load;
Intern_String intern_import;
Intern_String intern_link;
/*END*/
Intern_String intern(String string){ Intern_String intern(String string){
assert(string.len > 0); assert(string.len > 0);

View File

@@ -3,40 +3,6 @@ thread_local Core_Ctx *pctx;
Allocator *bigint_allocator; Allocator *bigint_allocator;
global S64 bigint_allocation_count; global S64 bigint_allocation_count;
/*#import meta
for i in meta.keywords: print(f'Intern_String keyword_{i.lower()};')
for i in meta.interns: print(f'Intern_String intern_{i.lower()};')
*/
Intern_String keyword_struct;
Intern_String keyword_union;
Intern_String keyword_true;
Intern_String keyword_default;
Intern_String keyword_break;
Intern_String keyword_false;
Intern_String keyword_return;
Intern_String keyword_switch;
Intern_String keyword_assert;
Intern_String keyword_if;
Intern_String keyword_elif;
Intern_String keyword_pass;
Intern_String keyword_else;
Intern_String keyword_for;
Intern_String keyword_enum;
Intern_String intern_typeof;
Intern_String intern_sizeof;
Intern_String intern_len;
Intern_String intern_alignof;
Intern_String intern_foreign;
Intern_String intern_strict;
Intern_String intern_void;
Intern_String intern_flag;
Intern_String intern_it;
Intern_String intern_load;
Intern_String intern_import;
Intern_String intern_link;
/*END*/
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Type globals // Type globals
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------

View File

@@ -282,7 +282,7 @@ parse_stmt_scope(Ast_Scope *scope_defined_outside = 0){
do{ do{
Token *token = token_get(); Token *token = token_get();
if(token_match_keyword(keyword_return)){ if(token_match_keyword(pctx->keyword_return)){
Array<Ast_Expr *> expr = {scratch}; Array<Ast_Expr *> expr = {scratch};
if(!token_is_scope()) { if(!token_is_scope()) {
do{ do{
@@ -293,22 +293,22 @@ parse_stmt_scope(Ast_Scope *scope_defined_outside = 0){
scope->stmts.add(ast_return(token, expr)); scope->stmts.add(ast_return(token, expr));
} }
else if(token_match_keyword(keyword_break)){ else if(token_match_keyword(pctx->keyword_break)){
scope->stmts.add(ast_break(token)); scope->stmts.add(ast_break(token));
} }
else if(token_match_keyword(keyword_pass)){ else if(token_match_keyword(pctx->keyword_pass)){
scope->stmts.add(ast_pass(token)); scope->stmts.add(ast_pass(token));
} }
else if(token_match_keyword(keyword_switch)){ else if(token_match_keyword(pctx->keyword_switch)){
Ast_Switch *result = ast_new(Ast_Switch, AST_SWITCH, token, AST_STMT); Ast_Switch *result = ast_new(Ast_Switch, AST_SWITCH, token, AST_STMT);
result->value = parse_expr(); result->value = parse_expr();
result->cases = {scratch}; result->cases = {scratch};
token_expect(OPEN_SCOPE); token_expect(OPEN_SCOPE);
do{ do{
if(token_match_keyword(keyword_default)){ if(token_match_keyword(pctx->keyword_default)){
result->default_scope = parse_stmt_scope(); result->default_scope = parse_stmt_scope();
continue; continue;
} }
@@ -332,7 +332,7 @@ parse_stmt_scope(Ast_Scope *scope_defined_outside = 0){
scope->stmts.add(result); scope->stmts.add(result);
} }
else if(token_match_keyword(keyword_assert)){ else if(token_match_keyword(pctx->keyword_assert)){
token_expect(TK_OpenParen); token_expect(TK_OpenParen);
Ast_Expr *expr = parse_expr(); Ast_Expr *expr = parse_expr();
Intern_String message = {}; Intern_String message = {};
@@ -344,7 +344,7 @@ parse_stmt_scope(Ast_Scope *scope_defined_outside = 0){
scope->stmts.add(ast_runtime_assert(token, expr, message)); scope->stmts.add(ast_runtime_assert(token, expr, message));
} }
else if(token_match_pound(keyword_assert)){ else if(token_match_pound(pctx->keyword_assert)){
token_expect(TK_OpenParen); token_expect(TK_OpenParen);
Ast_Expr *expr = parse_expr(); Ast_Expr *expr = parse_expr();
Intern_String message = {}; Intern_String message = {};
@@ -356,7 +356,7 @@ parse_stmt_scope(Ast_Scope *scope_defined_outside = 0){
scope->stmts.add(ast_constant_assert(token, expr, message)); scope->stmts.add(ast_constant_assert(token, expr, message));
} }
else if(token_match_keyword(keyword_for)){ else if(token_match_keyword(pctx->keyword_for)){
Ast_Scope *for_scope = begin_stmt_scope(scratch, token_get()); Ast_Scope *for_scope = begin_stmt_scope(scratch, token_get());
Ast_Expr *init = 0; Ast_Expr *init = 0;
Ast_Expr *cond = 0; Ast_Expr *cond = 0;
@@ -382,7 +382,7 @@ parse_stmt_scope(Ast_Scope *scope_defined_outside = 0){
scope->stmts.add(ast_for(token, init, cond, iter, for_scope)); scope->stmts.add(ast_for(token, init, cond, iter, for_scope));
} }
else if(token_match_keyword(keyword_if)){ else if(token_match_keyword(pctx->keyword_if)){
Array<Ast_If_Node *> if_nodes = {scratch}; Array<Ast_If_Node *> if_nodes = {scratch};
Ast_Expr *expr = parse_expr(); Ast_Expr *expr = parse_expr();
Ast_Expr *init_val = parse_init_stmt(expr); Ast_Expr *init_val = parse_init_stmt(expr);
@@ -396,19 +396,19 @@ parse_stmt_scope(Ast_Scope *scope_defined_outside = 0){
Ast_If_Node *if_node = ast_if_node(token, init_val, expr, if_block); Ast_If_Node *if_node = ast_if_node(token, init_val, expr, if_block);
if_nodes.add(if_node); if_nodes.add(if_node);
while(token_is(SAME_SCOPE) && (token_is_keyword(keyword_elif, 1) || (token_is_keyword(keyword_else, 1)))){ while(token_is(SAME_SCOPE) && (token_is_keyword(pctx->keyword_elif, 1) || (token_is_keyword(pctx->keyword_else, 1)))){
token_next(); token_next();
token = token_get(); token = token_get();
if(token_match_keyword(keyword_elif)){ if(token_match_keyword(pctx->keyword_elif)){
assert(token->intern_val == keyword_elif); assert(token->intern_val == pctx->keyword_elif);
Ast_Expr *expr = parse_expr(); Ast_Expr *expr = parse_expr();
Ast_Scope *else_if_block = parse_stmt_scope(); Ast_Scope *else_if_block = parse_stmt_scope();
Ast_If_Node *if_node = ast_if_node(token, 0, expr, else_if_block); Ast_If_Node *if_node = ast_if_node(token, 0, expr, else_if_block);
if_nodes.add(if_node); if_nodes.add(if_node);
} }
else{ else{
token_match_keyword(keyword_else); token_match_keyword(pctx->keyword_else);
assert(token->intern_val == keyword_else); assert(token->intern_val == pctx->keyword_else);
Ast_Scope *else_block = parse_stmt_scope(); Ast_Scope *else_block = parse_stmt_scope();
Ast_If_Node *if_node = ast_if_node(token, 0, 0, else_block); Ast_If_Node *if_node = ast_if_node(token, 0, 0, else_block);
if_nodes.add(if_node); if_nodes.add(if_node);
@@ -494,7 +494,7 @@ parse_lambda(Token *token){
ret.add(typespec); ret.add(typespec);
}while(token_match(TK_Comma)); }while(token_match(TK_Comma));
} }
else ret.add(ast_ident(token, intern_void)); else ret.add(ast_ident(token, pctx->intern_void));
Ast_Scope *scope = token_is(OPEN_SCOPE) ? parse_stmt_scope() : 0; Ast_Scope *scope = token_is(OPEN_SCOPE) ? parse_stmt_scope() : 0;
Ast_Lambda *result = ast_lambda(token, params, ret, scope); Ast_Lambda *result = ast_lambda(token, params, ret, scope);
@@ -612,9 +612,9 @@ parse_expr(S64 min_bp){
}break; }break;
case TK_Keyword: { case TK_Keyword: {
if(token->intern_val == keyword_true) if(token->intern_val == pctx->keyword_true)
left = ast_bool(token, 1); left = ast_bool(token, 1);
else if(token->intern_val == keyword_false) else if(token->intern_val == pctx->keyword_false)
left = ast_bool(token, 0); left = ast_bool(token, 0);
else compiler_error(token, "Unexpected keyword: [%s]", token->intern_val.str); else compiler_error(token, "Unexpected keyword: [%s]", token->intern_val.str);
}break; }break;
@@ -717,7 +717,7 @@ parse_enum(Token *pos){
Scratch_Arena *scratch = pctx->scratch; Scratch_Arena *scratch = pctx->scratch;
Scratch_Scope __scope(scratch); Scratch_Scope __scope(scratch);
Ast_Expr *typespec = parse_optional_type(); Ast_Expr *typespec = parse_optional_type();
Token *flag = token_match_pound(intern_flag); Token *flag = token_match_pound(pctx->intern_flag);
token_match(OPEN_SCOPE); token_match(OPEN_SCOPE);
Ast_Scope *scope = begin_decl_scope(scratch, token_get()); Ast_Scope *scope = begin_decl_scope(scratch, token_get());
@@ -845,18 +845,18 @@ parse_decl(B32 is_global){
Token *tname = token_get(); Token *tname = token_get();
if(token_match(TK_Identifier, TK_DoubleColon)){ if(token_match(TK_Identifier, TK_DoubleColon)){
if(token_match_pound(intern_foreign)){ if(token_match_pound(pctx->intern_foreign)){
set_flag(flags, AST_FOREIGN); set_flag(flags, AST_FOREIGN);
} else if(token_match_pound(intern_strict)){ } else if(token_match_pound(pctx->intern_strict)){
set_flag(flags, AST_STRICT); set_flag(flags, AST_STRICT);
} }
// @note parse struct binding // @note parse struct binding
if(token_match_keyword(keyword_struct)){ if(token_match_keyword(pctx->keyword_struct)){
result = parse_struct(tname); result = parse_struct(tname);
} }
else if(token_match_keyword(keyword_enum)){ else if(token_match_keyword(pctx->keyword_enum)){
result = parse_enum(tname); result = parse_enum(tname);
} }
@@ -914,7 +914,7 @@ parse_decl(B32 is_global){
else if(token_match(TK_Identifier, TK_Colon)){ else if(token_match(TK_Identifier, TK_Colon)){
Ast_Expr *typespec = parse_expr(); Ast_Expr *typespec = parse_expr();
Ast_Expr *expr = parse_assign_expr(); Ast_Expr *expr = parse_assign_expr();
if(token_match_pound(intern_foreign)) if(token_match_pound(pctx->intern_foreign))
set_flag(flags, AST_FOREIGN); set_flag(flags, AST_FOREIGN);
result = ast_var(tname, typespec, tname->intern_val, expr); result = ast_var(tname, typespec, tname->intern_val, expr);
@@ -952,13 +952,13 @@ parse_file(Ast_File *file){
pctx->currently_parsed_scope = file; pctx->currently_parsed_scope = file;
lex_restream(pctx, file->filecontent, file->absolute_file_path); lex_restream(pctx, file->filecontent, file->absolute_file_path);
while (token_expect(SAME_SCOPE)) { while (token_expect(SAME_SCOPE)) {
if (token_match_pound(intern_load)) { if (token_match_pound(pctx->intern_load)) {
parse_load(true); parse_load(true);
continue; continue;
} else if (token_match_pound(intern_import)) { } else if (token_match_pound(pctx->intern_import)) {
parse_import(true); parse_import(true);
continue; continue;
} else if (token_match_pound(intern_link)) { } else if (token_match_pound(pctx->intern_link)) {
Token *file = token_expect(TK_StringLit); Token *file = token_expect(TK_StringLit);
add(pctx->perm, &pctx->files_to_link, file); add(pctx->perm, &pctx->files_to_link, file);
continue; continue;

View File

@@ -810,7 +810,7 @@ resolve_stmt(Ast *ast, Ast_Type *ret){
Ast_Decl *var = ast_new(Ast_Decl, AST_VAR, node->cond->pos, AST_DECL); Ast_Decl *var = ast_new(Ast_Decl, AST_VAR, node->cond->pos, AST_DECL);
var->state = DECL_RESOLVED; var->state = DECL_RESOLVED;
var->type = type_pointer(op.type->base); var->type = type_pointer(op.type->base);
var->name = intern_it; var->name = pctx->intern_it;
insert_into_scope(node->scope, var); insert_into_scope(node->scope, var);
node->array_traversal_var = var; node->array_traversal_var = var;
} }
@@ -1440,7 +1440,7 @@ resolve_expr(Ast_Expr *ast, Resolve_Flag flags, Ast_Type *compound_and_const_str
} }
CASE(CALL, Call){ CASE(CALL, Call){
if(expr_atom_is_equal_intern(node->name, intern_sizeof)){ if(expr_atom_is_equal_intern(node->name, pctx->intern_sizeof)){
Ast_Expr *expr = unpack_ast_call_expr_for_builtin(node); Ast_Expr *expr = unpack_ast_call_expr_for_builtin(node);
Operand name = resolve_expr(expr, inherit_flag(flags, AST_CANT_BE_NULL), 0, field_access_scope); Operand name = resolve_expr(expr, inherit_flag(flags, AST_CANT_BE_NULL), 0, field_access_scope);
@@ -1458,7 +1458,7 @@ resolve_expr(Ast_Expr *ast, Resolve_Flag flags, Ast_Type *compound_and_const_str
return operand_const_rvalue(v); return operand_const_rvalue(v);
} }
else if(expr_atom_is_equal_intern(node->name, intern_typeof)){ else if(expr_atom_is_equal_intern(node->name, pctx->intern_typeof)){
Ast_Expr *expr = unpack_ast_call_expr_for_builtin(node); Ast_Expr *expr = unpack_ast_call_expr_for_builtin(node);
Operand name = resolve_expr(expr, inherit_flag(flags, AST_CANT_BE_NULL), 0, field_access_scope); Operand name = resolve_expr(expr, inherit_flag(flags, AST_CANT_BE_NULL), 0, field_access_scope);
@@ -1470,7 +1470,7 @@ resolve_expr(Ast_Expr *ast, Resolve_Flag flags, Ast_Type *compound_and_const_str
return result; return result;
} }
else if(expr_atom_is_equal_intern(node->name, intern_alignof)){ else if(expr_atom_is_equal_intern(node->name, pctx->intern_alignof)){
Ast_Expr *expr = unpack_ast_call_expr_for_builtin(node); Ast_Expr *expr = unpack_ast_call_expr_for_builtin(node);
Operand name = resolve_expr(expr, inherit_flag(flags, AST_CANT_BE_NULL), 0, field_access_scope); Operand name = resolve_expr(expr, inherit_flag(flags, AST_CANT_BE_NULL), 0, field_access_scope);
node->kind = AST_ALIGN_OF; node->kind = AST_ALIGN_OF;
@@ -1486,7 +1486,7 @@ resolve_expr(Ast_Expr *ast, Resolve_Flag flags, Ast_Type *compound_and_const_str
return operand_const_rvalue(v); return operand_const_rvalue(v);
} }
else if(expr_atom_is_equal_intern(node->name, intern_len)){ else if(expr_atom_is_equal_intern(node->name, pctx->intern_len)){
Ast_Expr *expr = unpack_ast_call_expr_for_builtin(node); Ast_Expr *expr = unpack_ast_call_expr_for_builtin(node);
Operand name = resolve_expr(expr, inherit_flag(flags, AST_CANT_BE_NULL), 0, field_access_scope); Operand name = resolve_expr(expr, inherit_flag(flags, AST_CANT_BE_NULL), 0, field_access_scope);