From 46f9a1543acae27ed71221154d6e36425cd2839c Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Tue, 29 Dec 2020 12:23:21 -0600 Subject: [PATCH] '::' declarations in procedure scope are treated the same as file scoped --- core/alloc/heap.onyx | 4 +- core/conv.onyx | 7 +- core/string.onyx | 6 +- core/string/builder.onyx | 2 +- docs/bugs | 135 +++++++++++++++++++++--------------- docs/todo | 34 ++++++++++ include/onyxastnodes.h | 3 +- include/onyxparser.h | 2 + onyx | Bin 286968 -> 287016 bytes progs/odin_example.onyx | 19 ++++++ progs/poly_solidify.onyx | 2 +- src/onyxclone.c | 1 + src/onyxparser.c | 143 ++++++++++++++++++++++----------------- src/onyxsymres.c | 3 + 14 files changed, 231 insertions(+), 130 deletions(-) diff --git a/core/alloc/heap.onyx b/core/alloc/heap.onyx index 94ff85b6..538e4507 100644 --- a/core/alloc/heap.onyx +++ b/core/alloc/heap.onyx @@ -60,7 +60,7 @@ heap_alloc :: proc (size_: u32, align: u32) -> rawptr { return cast(rawptr) (cast(u32) ret + sizeof heap_block); } - new_pages :: ((size - heap_state.remaining_space) >> 16) + 1; + new_pages := ((size - heap_state.remaining_space) >> 16) + 1; if memory_grow(new_pages) == -1 { // out of memory return null; @@ -102,7 +102,7 @@ heap_resize :: proc (ptr: rawptr, new_size: u32, align: u32) -> rawptr { // If we are at the end of the allocation space, just extend it if hb_ptr.size + cast(u32) ptr >= cast(u32) heap_state.next_alloc { if new_size - old_size >= heap_state.remaining_space { - new_pages :: ((new_size - old_size - heap_state.remaining_space) >> 16) + 1; + new_pages := ((new_size - old_size - heap_state.remaining_space) >> 16) + 1; if memory_grow(new_pages) == -1 { // out of memory return null; diff --git a/core/conv.onyx b/core/conv.onyx index 9f5a3c8e..a89c0d33 100644 --- a/core/conv.onyx +++ b/core/conv.onyx @@ -12,12 +12,13 @@ i64_to_str :: proc (n_: i64, base: u64, buf: [] u8) -> str { c := ^buf[buf.count - 1]; len := 0; - s :: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/"; + // BUGFIX: Make this work with '::'; + BASE64_MAP := "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/"; while n > 0 { - m :: n % base; + m := n % base; - *c = s[cast(u32) m]; + *c = BASE64_MAP[cast(u32) m]; len += 1; c -= 1; diff --git a/core/string.onyx b/core/string.onyx index b3c6804e..8bc25835 100644 --- a/core/string.onyx +++ b/core/string.onyx @@ -1,7 +1,7 @@ package core.string make :: proc (s: cstr) -> str { - len :: length(s); + len := length(s); return str.{ count = len, data = s }; } @@ -39,8 +39,8 @@ copy :: proc (orig: str, dest: str) { } concat :: proc (s1: str, s2: str) -> str { - len1 :: length(s1); - len2 :: length(s2); + len1 := length(s1); + len2 := length(s2); data := cast(^u8) calloc(len1 + len2); for i: 0 .. len1 do data[i] = s1[i]; diff --git a/core/string/builder.onyx b/core/string/builder.onyx index 69ee4d5a..2280686f 100644 --- a/core/string/builder.onyx +++ b/core/string/builder.onyx @@ -27,7 +27,7 @@ clear :: proc (use sb: ^Builder) -> ^Builder { } add_str :: proc (use sb: ^Builder, s: str) -> ^Builder { - len_total :: data.count + s.count; + len_total := data.count + s.count; if data.capacity < len_total do #context_scope { context.allocator = alloc; diff --git a/docs/bugs b/docs/bugs index 8ded95c4..10e43eaa 100644 --- a/docs/bugs +++ b/docs/bugs @@ -1,29 +1,29 @@ List of known bugs: [ ] Using an auto-cast on an argument when calling an overloaded proc leads - to an unexpected error. Take the following example: - ``` - overloaded :: proc { - proc (x: f32, y: str) ---, - proc (x: i32, y: i32) ---, - } - - foo :: proc () { - x: i32 = 1234; - overloaded(~~x, 4); - } - ``` - Compiles with the following error: - ``` - (/home/brendan/dev/c/onyx/a.onyx:8,15) unable to match overloaded function with provided argument types: (f32, unsized int) - 8 | overloaded(~~x, 4); - ``` - - This is because in trying the first overload, the auto-cast is consumed - and converted to a cast(f32). Then, when it doesn't match the first one - and it tries the second, the parameter types are f32 and unsized int, - which is doesn't match the second one, when the original parameters would - have matched correctly. + to an unexpected error. Take the following example: + ``` + overloaded :: proc { + proc (x: f32, y: str) ---, + proc (x: i32, y: i32) ---, + } + + foo :: proc () { + x: i32 = 1234; + overloaded(~~x, 4); + } + ``` + Compiles with the following error: + ``` + (/home/brendan/dev/c/onyx/a.onyx:8,15) unable to match overloaded function with provided argument types: (f32, unsized int) + 8 | overloaded(~~x, 4); + ``` + + This is because in trying the first overload, the auto-cast is consumed + and converted to a cast(f32). Then, when it doesn't match the first one + and it tries the second, the parameter types are f32 and unsized int, + which is doesn't match the second one, when the original parameters would + have matched correctly. [ ] `defer` statements are not executed at the end of a loop if the loop is exited using a `break` statement, or a `continue` statement. The semantics @@ -39,49 +39,72 @@ List of known bugs: an infinite loop. [ ] The following code causes an infinite loop somewhere. - ``` - get_neighbor_count :: proc (grid: ^map.Map(Vec2, Cell), pos: Vec2) -> u32 { - count := 0; + ``` + get_neighbor_count :: proc (grid: ^map.Map(Vec2, Cell), pos: Vec2) -> u32 { + count := 0; - for ^dir: Hex_Directions { - pos := Vec2.{ x = pos.x + dir.x, y = pos.y + dir.y }; - cell := map.get(grid, pos, Cell.{}); - if cell.alive do count += 1; - } + for ^dir: Hex_Directions { + pos := Vec2.{ x = pos.x + dir.x, y = pos.y + dir.y }; + cell := map.get(grid, pos, Cell.{}); + if cell.alive do count += 1; + } - return count; - } - ``` + return count; + } + ``` [ ] Polymorphic structs do not recognize default values for members. +[ ] `use` on struct members does not work correctly if the type is a union. + ``` + BadUnion :: struct { + use container : struct #union { + int: i32; + float: f32; + }; + } + + test :: proc () do print(sizeof BadUnion == 4); + ``` + +[ ] `use` on struct members breaks struct literals. + ``` + Vec2 :: struct { x: i32; y: i32; } + Entity :: struct { use pos: Vec2; } + + e := Entity.{ pos = Vec2.{ 1, 2 } }; + + // This does work already. + e2 := Entity.{ x = 1, y = 2 }; + ``` + [X] `TileData :: [TILE_DATA_WIDTH * TILE_DATA_HEIGHT] bool;` results in a segfault because it is an invalid top level node, but that is not checked before it is tried to be used. [X] `TileData :: #type [TILE_DATA_WIDTH * TILE_DATA_HEIGHT] bool;` produces the - following error: - ``` - (/home/brendan/dev/onyx/aoc/day20.onyx:25,19) Array type expects type 'i32' for size, got 'unsized int'. - 25 | TileData :: #type [TILE_DATA_WIDTH * TILE_DATA_HEIGHT] bool; - ``` + following error: + ``` + (/home/brendan/dev/onyx/aoc/day20.onyx:25,19) Array type expects type 'i32' for size, got 'unsized int'. + 25 | TileData :: #type [TILE_DATA_WIDTH * TILE_DATA_HEIGHT] bool; + ``` - This because the expression for the array size is not reducing and getting - converted to the fixed size integer. I suspect this is because for sizeof - and alignof expression, `fill_in_type` is not used, and that function has - the logic to handle the array subscript reduction and type resolution. + This because the expression for the array size is not reducing and getting + converted to the fixed size integer. I suspect this is because for sizeof + and alignof expression, `fill_in_type` is not used, and that function has + the logic to handle the array subscript reduction and type resolution. [X] The following struct is causing a seg fault in the compiler. I believe it - is because of the duplicate struct member names and failing to get the position - in the file to report the error. - ``` - Tile :: struct { - id : u32; - orientation : TileOrientation; - data : [] bool; - edges : [] u32; - - pos_x : u32 = 0; - pos_x : u32 = 0; - } - ``` + is because of the duplicate struct member names and failing to get the position + in the file to report the error. + ``` + Tile :: struct { + id : u32; + orientation : TileOrientation; + data : [] bool; + edges : [] u32; + + pos_x : u32 = 0; + pos_x : u32 = 0; + } + ``` diff --git a/docs/todo b/docs/todo index 6da2e100..d6d7ed07 100644 --- a/docs/todo +++ b/docs/todo @@ -112,6 +112,24 @@ Language Cohesion: [ ] Add macros. + [ ] enum #flags should be able to be used as so: + ``` + SomeEnum :: enum #flags { + Property1; + Property2; + Property3; + } + + val : SomeEnum = ~~0; + val.Property1 = true; + val.Property3 = true; + + // This should also be allowed. + val |= SomeEnum.Property2; + + if val.Property2 { ... } + ``` + [X] #solidify polymoprhic procedures. API Expansion: @@ -140,3 +158,19 @@ Usability: [ ] Make README on GitHub better, and actually describe what to do [ ] Make compiler work on Windows [ ] Make compiler work on MacOS + [ ] Add examples for the following language features: + - Slices + - Dynamic Arrays + - Structs and unions + - Enums + - switch statements + - for loops + - Maps + - varargs + - `use` keyword + - pipe operator + - Overloaded procedures + - Polymorphic procedures + - WASM directives (#export, #foreign) + - #solidify directive + - SIMD diff --git a/include/onyxastnodes.h b/include/onyxastnodes.h index 82a7e3f2..5789ebbc 100644 --- a/include/onyxastnodes.h +++ b/include/onyxastnodes.h @@ -532,7 +532,8 @@ struct AstBlock { AstNode *body; Scope *scope; - bh_arr(AstTyped *) allocate_exprs; + bh_arr(AstTyped *) allocate_exprs; + bh_arr(AstBinding *) bindings; }; struct AstDefer { AstNode_base; AstNode *stmt; }; struct AstFor { diff --git a/include/onyxparser.h b/include/onyxparser.h index 789119c2..1b0bfc2e 100644 --- a/include/onyxparser.h +++ b/include/onyxparser.h @@ -42,6 +42,8 @@ typedef struct OnyxParser { PolymorphicContext polymorph_context; + bh_arr(AstBlock *) block_stack; + b32 hit_unexpected_token : 1; } OnyxParser; diff --git a/onyx b/onyx index 1bdc8ffc4851897745aa42d82427efa9bd97f8d3..78d3f0e22c150f22b2f38a686a7ead60dceb8a1f 100755 GIT binary patch delta 52996 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 delta 52494 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 Oe7)%oZo0$V?SBAtmLZ}5 diff --git a/progs/odin_example.onyx b/progs/odin_example.onyx index f13b3e9a..9de1b6d2 100644 --- a/progs/odin_example.onyx +++ b/progs/odin_example.onyx @@ -75,7 +75,26 @@ compress :: proc (arr: [5] $T, f : proc (T, T) -> T) -> T { return val; } +BadUnion :: struct { + use container : struct #union { + int: i32; + float: f32; + }; +} + +Vec2 :: struct { x: i32; y: i32; } +Entity :: struct { use pos: Vec2; } + main :: proc (args: [] cstr) { + a : BadUnion; + a.int = 1234; + a.float = 0.5; + printf("%i == 4\n", sizeof BadUnion); + printf("%p\n", a.int); + printf("%f\n", a.float); + + e := Entity.{ pos = Vec2.{ 1, 2 } }; + { foo : [5] [2] u32; foo = f(); diff --git a/progs/poly_solidify.onyx b/progs/poly_solidify.onyx index 8e16c2c5..4bf90352 100644 --- a/progs/poly_solidify.onyx +++ b/progs/poly_solidify.onyx @@ -27,7 +27,7 @@ main :: proc (args: [] cstr) { defer array.free(^arr); - for i: 0 .. 10 do array.push(^arr, i); + for i: 0 .. 10 do array.push(^arr, ~~i); print_array(arr); array_map(arr, double); diff --git a/src/onyxclone.c b/src/onyxclone.c index cd7f18c5..0cfd8a5d 100644 --- a/src/onyxclone.c +++ b/src/onyxclone.c @@ -88,6 +88,7 @@ static inline i32 ast_kind_to_size(AstNode* node) { case Ast_Kind_Defer: return sizeof(AstDefer); case Ast_Kind_Switch: return sizeof(AstSwitch); case Ast_Kind_Switch_Case: return sizeof(AstSwitchCase); + case Ast_Kind_Directive_Solidify: return sizeof(AstDirectiveSolidify); case Ast_Kind_Count: return 0; } } diff --git a/src/onyxparser.c b/src/onyxparser.c index dbcc22fb..d6d64331 100644 --- a/src/onyxparser.c +++ b/src/onyxparser.c @@ -45,6 +45,7 @@ static AstFunction* parse_function_definition(OnyxParser* parser); static AstTyped* parse_global_declaration(OnyxParser* parser); static AstEnumType* parse_enum_declaration(OnyxParser* parser); static AstTyped* parse_top_level_expression(OnyxParser* parser); +static AstBinding* parse_top_level_binding(OnyxParser* parser, OnyxToken* symbol); static AstNode* parse_top_level_statement(OnyxParser* parser); static AstPackage* parse_package_name(OnyxParser* parser); @@ -1004,12 +1005,18 @@ static b32 parse_possible_symbol_declaration(OnyxParser* parser, AstNode** ret) if ((parser->curr + 1)->type != ':') return 0; OnyxToken* symbol = expect_token(parser, Token_Type_Symbol); - consume_token(parser); - AstType* type_node = NULL; + expect_token(parser, ':'); + + if (parser->curr->type == ':') { + AstBinding* binding = parse_top_level_binding(parser, symbol); + + bh_arr_push(parser->block_stack[0]->bindings, binding); + return 1; + } // NOTE: var: type - if (parser->curr->type != ':' - && parser->curr->type != '=') { + AstType* type_node = NULL; + if (parser->curr->type != '=') { type_node = parse_type(parser); } @@ -1018,11 +1025,7 @@ static b32 parse_possible_symbol_declaration(OnyxParser* parser, AstNode** ret) local->type_node = type_node; *ret = (AstNode *) local; - if (parser->curr->type == '=' || parser->curr->type == ':') { - if (parser->curr->type == ':') { - local->flags |= Ast_Flag_Const; - } - + if (parser->curr->type == '=') { AstBinaryOp* assignment = make_node(AstBinaryOp, Ast_Kind_Binary_Op); assignment->operation = Binary_Op_Assign; local->next = (AstNode *) assignment; @@ -1310,21 +1313,26 @@ static AstBlock* parse_block(OnyxParser* parser) { AstBlock* block = make_node(AstBlock, Ast_Kind_Block); bh_arr_new(global_heap_allocator, block->allocate_exprs, 4); + bh_arr_push(parser->block_stack, block); + // NOTE: --- is for an empty block if (parser->curr->type == Token_Type_Empty_Block) { block->token = expect_token(parser, Token_Type_Empty_Block); + bh_arr_pop(parser->block_stack); return block; } if (parser->curr->type == Token_Type_Keyword_Do) { block->token = expect_token(parser, Token_Type_Keyword_Do); block->body = parse_statement(parser); + bh_arr_pop(parser->block_stack); return block; } if (parser->curr->type != '{') { expect_token(parser, '{'); find_token(parser, '}'); + bh_arr_pop(parser->block_stack); return block; } block->token = expect_token(parser, '{'); @@ -1346,6 +1354,7 @@ static AstBlock* parse_block(OnyxParser* parser) { expect_token(parser, '}'); + bh_arr_pop(parser->block_stack); return block; } @@ -1954,6 +1963,62 @@ static AstTyped* parse_top_level_expression(OnyxParser* parser) { } } +static AstBinding* parse_top_level_binding(OnyxParser* parser, OnyxToken* symbol) { + expect_token(parser, ':'); + + AstTyped* node = parse_top_level_expression(parser); + if (parser->hit_unexpected_token || node == NULL) + return NULL; + + if (node->kind == Ast_Kind_Function) { + AstFunction* func = (AstFunction *) node; + + if (func->exported_name == NULL) + func->exported_name = symbol; + + func->name = symbol; + + } else if (node->kind == Ast_Kind_Polymorphic_Proc) { + AstPolyProc* proc = (AstPolyProc *) node; + + if (proc->base_func->exported_name == NULL) + proc->base_func->exported_name = symbol; + + proc->base_func->name = symbol; + + } else if (node->kind == Ast_Kind_Global) { + AstGlobal* global = (AstGlobal *) node; + + if (global->exported_name == NULL) + global->exported_name = symbol; + + global->name = symbol; + + } else if (node->kind != Ast_Kind_Overloaded_Function + && node->kind != Ast_Kind_StrLit) { + + if (node->kind == Ast_Kind_Struct_Type + || node->kind == Ast_Kind_Enum_Type + || node->kind == Ast_Kind_Poly_Struct_Type) { + ((AstStructType *)node)->name = bh_aprintf(global_heap_allocator, + "%b", symbol->text, symbol->length); + } + + if (node->kind == Ast_Kind_Type_Alias) { + node->token = symbol; + } + + // HACK + add_node_to_process(parser, (AstNode *) node); + } + + AstBinding* binding = make_node(AstBinding, Ast_Kind_Binding); + binding->token = symbol; + binding->node = (AstNode *) node; + + return binding; +} + // 'use' // :: static AstNode* parse_top_level_statement(OnyxParser* parser) { @@ -1984,61 +2049,11 @@ static AstNode* parse_top_level_statement(OnyxParser* parser) { expect_token(parser, ':'); if (parser->curr->type == ':') { - expect_token(parser, ':'); - - AstTyped* node = parse_top_level_expression(parser); - if (parser->hit_unexpected_token || node == NULL) - return NULL; - - node->flags |= private_kind; - - if (node->kind == Ast_Kind_Function) { - AstFunction* func = (AstFunction *) node; - - if (func->exported_name == NULL) - func->exported_name = symbol; - - func->name = symbol; - - } else if (node->kind == Ast_Kind_Polymorphic_Proc) { - AstPolyProc* proc = (AstPolyProc *) node; - - if (proc->base_func->exported_name == NULL) - proc->base_func->exported_name = symbol; - - proc->base_func->name = symbol; - - } else if (node->kind == Ast_Kind_Global) { - AstGlobal* global = (AstGlobal *) node; - - if (global->exported_name == NULL) - global->exported_name = symbol; - - global->name = symbol; - - } else if (node->kind != Ast_Kind_Overloaded_Function - && node->kind != Ast_Kind_StrLit) { - - if (node->kind == Ast_Kind_Struct_Type - || node->kind == Ast_Kind_Enum_Type - || node->kind == Ast_Kind_Poly_Struct_Type) { - ((AstStructType *)node)->name = bh_aprintf(global_heap_allocator, - "%b", symbol->text, symbol->length); - } - - if (node->kind == Ast_Kind_Type_Alias) { - node->token = symbol; - } - - // HACK - add_node_to_process(parser, (AstNode *) node); - } - - AstBinding* binding = make_node(AstBinding, Ast_Kind_Binding); - binding->token = symbol; - binding->node = (AstNode *) node; + AstBinding* binding = parse_top_level_binding(parser, symbol); + binding->node->flags |= private_kind; return (AstNode *) binding; + } else { AstMemRes* memres = make_node(AstMemRes, Ast_Kind_Memres); memres->token = symbol; @@ -2197,12 +2212,12 @@ OnyxParser onyx_parser_create(bh_allocator alloc, OnyxTokenizer *tokenizer, Prog parser.prev = NULL; parser.program = program; parser.hit_unexpected_token = 0; + parser.block_stack = NULL; parser.results = (ParseResults) { .allocator = global_heap_allocator, .nodes_to_process = NULL, - }; parser.polymorph_context = (PolymorphicContext) { @@ -2210,12 +2225,14 @@ OnyxParser onyx_parser_create(bh_allocator alloc, OnyxTokenizer *tokenizer, Prog .poly_params = NULL, }; + bh_arr_new(global_heap_allocator, parser.block_stack, 4); bh_arr_new(parser.results.allocator, parser.results.nodes_to_process, 4); return parser; } void onyx_parser_free(OnyxParser* parser) { + bh_arr_free(parser->block_stack); } ParseResults onyx_parse(OnyxParser *parser) { diff --git a/src/onyxsymres.c b/src/onyxsymres.c index 278a5d25..0b3a6584 100644 --- a/src/onyxsymres.c +++ b/src/onyxsymres.c @@ -667,6 +667,9 @@ static void symres_block(AstBlock* block) { scope_enter(block->scope); bh_arr_push(semstate.block_stack, block); + bh_arr_each(AstBinding *, binding, block->bindings) + symbol_introduce(semstate.curr_scope, (*binding)->token, (*binding)->node); + if (block->body) symres_statement_chain(&block->body); -- 2.25.1