From: Brendan Hansen Date: Thu, 31 Dec 2020 14:41:13 +0000 (-0600) Subject: procedures are compile time known X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=8757e22802cc907fa5d29e922f0f6f897e7db6ce;p=onyx.git procedures are compile time known --- diff --git a/bin/onyx b/bin/onyx index e220a548..9117f73b 100755 Binary files a/bin/onyx and b/bin/onyx differ diff --git a/examples/04_fixed_arrays.onyx b/examples/04_fixed_arrays.onyx index bb0d73a9..63b0b62f 100644 --- a/examples/04_fixed_arrays.onyx +++ b/examples/04_fixed_arrays.onyx @@ -46,7 +46,7 @@ main :: proc (args: [] cstr) { for i: 0 .. 10 { array_param[i] = 1000 + i; } - }; + } array_proc(arr); for element: arr { diff --git a/include/onyxastnodes.h b/include/onyxastnodes.h index ea239113..578518d9 100644 --- a/include/onyxastnodes.h +++ b/include/onyxastnodes.h @@ -797,13 +797,14 @@ typedef enum EntityType { Entity_Type_File_Contents, Entity_Type_Enum, Entity_Type_Type_Alias, - Entity_Type_Memory_Reservation, + Entity_Type_Memory_Reservation_Type, Entity_Type_Use, Entity_Type_Polymorphic_Proc, Entity_Type_Foreign_Function_Header, Entity_Type_Foreign_Global_Header, Entity_Type_Function_Header, Entity_Type_Global_Header, + Entity_Type_Memory_Reservation, Entity_Type_Expression, Entity_Type_Global, Entity_Type_Overloaded_Function, diff --git a/src/onyx.c b/src/onyx.c index 4df26fb8..b1e6c362 100644 --- a/src/onyx.c +++ b/src/onyx.c @@ -359,6 +359,10 @@ static void merge_parse_results(CompilerState* compiler_state, ParseResults* res } case Ast_Kind_Memres: { + ent.type = Entity_Type_Memory_Reservation_Type; + ent.mem_res = (AstMemRes *) node; + entity_heap_insert(&compiler_state->prog_info.entities, ent); + ent.type = Entity_Type_Memory_Reservation; ent.mem_res = (AstMemRes *) node; entity_heap_insert(&compiler_state->prog_info.entities, ent); diff --git a/src/onyxchecker.c b/src/onyxchecker.c index 6ceda8e1..4a1af12a 100644 --- a/src/onyxchecker.c +++ b/src/onyxchecker.c @@ -31,6 +31,7 @@ CHECK(function, AstFunction* func); CHECK(overloaded_function, AstOverloadedFunction* func); CHECK(struct, AstStructType* s_node); CHECK(function_header, AstFunction* func); +CHECK(memres_type, AstMemRes* memres); CHECK(memres, AstMemRes* memres); static inline void fill_in_array_count(AstType* type_node) { @@ -1474,9 +1475,12 @@ b32 check_function_header(AstFunction* func) { return 0; } -b32 check_memres(AstMemRes* memres) { +b32 check_memres_type(AstMemRes* memres) { fill_in_type((AstTyped *) memres); + return 0; +} +b32 check_memres(AstMemRes* memres) { if (memres->initial_value != NULL) { fill_in_type(memres->initial_value); check_expression(&memres->initial_value); @@ -1552,6 +1556,10 @@ void check_entity(Entity* ent) { if (check_struct((AstStructType *) ent->type_alias)) return; break; + case Entity_Type_Memory_Reservation_Type: + if (check_memres_type(ent->mem_res)) return; + break; + case Entity_Type_Memory_Reservation: if (check_memres(ent->mem_res)) return; break; diff --git a/src/onyxsymres.c b/src/onyxsymres.c index 8e15a731..97749ccf 100644 --- a/src/onyxsymres.c +++ b/src/onyxsymres.c @@ -31,6 +31,7 @@ static void symres_global(AstGlobal* global); static void symres_overloaded_function(AstOverloadedFunction* ofunc); static void symres_use_package(AstUsePackage* package); static void symres_enum(AstEnumType* enum_node); +static void symres_memres_type(AstMemRes** memres); static void symres_memres(AstMemRes** memres); static AstFieldAccess* make_field_access(AstTyped* node, char* field) { @@ -679,6 +680,8 @@ void symres_function_header(AstFunction* func) { if (func->scope == NULL) func->scope = scope_create(semstate.node_allocator, semstate.curr_scope, func->token->pos); + func->flags |= Ast_Flag_Comptime; + bh_arr_each(AstParam, param, func->params) { if (param->default_value != NULL) { symres_expression(¶m->default_value); @@ -884,14 +887,13 @@ static void symres_enum(AstEnumType* enum_node) { } } -static void symres_memres(AstMemRes** memres) { +static void symres_memres_type(AstMemRes** memres) { (*memres)->type_node = symres_type((*memres)->type_node); +} +static void symres_memres(AstMemRes** memres) { if ((*memres)->initial_value != NULL) { symres_expression(&(*memres)->initial_value); - - // if ((*memres)->type_node == NULL) - // (*memres)->type_node = (*memres)->initial_value->type_node; } } @@ -923,13 +925,14 @@ void symres_entity(Entity* ent) { next_state = Entity_State_Finalized; break; - case Entity_Type_Overloaded_Function: symres_overloaded_function(ent->overloaded_function); break; - case Entity_Type_Expression: symres_expression(&ent->expr); break; - case Entity_Type_Type_Alias: ent->type_alias = symres_type(ent->type_alias); break; - case Entity_Type_Enum: symres_enum(ent->enum_type); break; - case Entity_Type_Memory_Reservation: symres_memres(&ent->mem_res); break; - case Entity_Type_Polymorphic_Proc: symres_polyproc(ent->poly_proc); break; - case Entity_Type_String_Literal: symres_expression(&ent->expr); break; + case Entity_Type_Overloaded_Function: symres_overloaded_function(ent->overloaded_function); break; + case Entity_Type_Expression: symres_expression(&ent->expr); break; + case Entity_Type_Type_Alias: ent->type_alias = symres_type(ent->type_alias); break; + case Entity_Type_Enum: symres_enum(ent->enum_type); break; + case Entity_Type_Memory_Reservation_Type: symres_memres_type(&ent->mem_res); break; + case Entity_Type_Memory_Reservation: symres_memres(&ent->mem_res); break; + case Entity_Type_Polymorphic_Proc: symres_polyproc(ent->poly_proc); break; + case Entity_Type_String_Literal: symres_expression(&ent->expr); break; default: break; } diff --git a/src/onyxutils.c b/src/onyxutils.c index c88e6378..2042a8b1 100644 --- a/src/onyxutils.c +++ b/src/onyxutils.c @@ -115,13 +115,14 @@ const char* entity_type_strings[Entity_Type_Count] = { "File Contents", "Enum", "Type Alias", - "Memory Reservation", + "Memory Reservation Type", "Use", "Polymorphic Proc", "Foreign_Function Header", "Foreign_Global Header", "Function Header", "Global Header", + "Memory Reservation", "Expression", "Global", "Overloaded_Function", diff --git a/src/onyxwasm.c b/src/onyxwasm.c index 9374d372..99d8dac9 100644 --- a/src/onyxwasm.c +++ b/src/onyxwasm.c @@ -3041,6 +3041,12 @@ static void emit_raw_data(OnyxWasmModule* mod, ptr data, AstTyped* node) { break; } + case Ast_Kind_Function: { + AstFunction* func = (AstFunction *) node; + *((u32 *) data) = get_element_idx(mod, func); + break; + } + case Ast_Kind_NumLit: { // NOTE: This makes a big assumption that we are running on a // little endian machine, since WebAssembly is little endian