more robust static struct bindings; zero size struct bug fix
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Fri, 29 Jan 2021 15:30:04 +0000 (09:30 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Fri, 29 Jan 2021 15:30:04 +0000 (09:30 -0600)
bin/onyx
onyx.exe
src/onyxparser.c
src/onyxwasm.c

index 6198097d6ff1855671c6970a93122cef522dbd05..3d0a779db8676c84ce462bf0c2cf798da983d6d0 100755 (executable)
Binary files a/bin/onyx and b/bin/onyx differ
index 872f78caffa721c40efe8eb693316d0007c52c01..ba6ded1d76b2bd0a830ca19b15e2e3cceae098c8 100644 (file)
Binary files a/onyx.exe and b/onyx.exe differ
index 3534177f2c204b67514d8657bdef4e68c5ef9856..731a0ec22b4fe514eda4a6187e9a4f0242e45beb 100644 (file)
@@ -1845,15 +1845,16 @@ static AstStructType* parse_struct(OnyxParser* parser) {
         expect_token(parser, ':');
         
         if (parser->curr->type == ':' && !member_is_used) {
-            consume_token(parser);
             
             if (!s_node->scope) {
                 // NOTE: The parent scope will be filled out during symbol resolution.
                 s_node->scope = scope_create(context.ast_alloc, NULL, s_node->token->pos);
             }
             
-            AstTyped* expression = parse_top_level_expression(parser);
-            symbol_introduce(s_node->scope, member_name, (AstNode *) expression);
+            AstBinding* binding = parse_top_level_binding(parser, member_name);
+            symbol_introduce(s_node->scope, binding->token, binding->node);
+            
+            if (parser->curr->type == ';') consume_token(parser);
             
         } else {
             AstStructMember* mem = make_node(AstStructMember, Ast_Kind_Struct_Member);    
index 75f20d9a0b53026e51ed50e54affb122ec89a21d..c6c466a407096480f853ceb949fda89e687319c1 100644 (file)
@@ -1805,7 +1805,7 @@ EMIT_FUNC(struct_lval, AstTyped* lval) {
 
 EMIT_FUNC(compound_load, Type* type, u64 offset) {
     bh_arr(WasmInstruction) code = *pcode;
-    u32 mem_count = type_linear_member_count(type);
+    i32 mem_count = type_linear_member_count(type);
     TypeWithOffset two;
 
     if (mem_count == 1) {
@@ -1838,7 +1838,7 @@ EMIT_FUNC(compound_store, Type* type, u64 offset, b32 location_first) {
     u64 loc_idx = local_raw_allocate(mod->local_alloc, WASM_TYPE_INT32);
     if (location_first) WIL(WI_LOCAL_SET, loc_idx);
 
-    u32 elem_count = type_linear_member_count(type);
+    i32 elem_count = type_linear_member_count(type);
     forir (i, elem_count - 1, 0) {
         type_linear_member_lookup(type, i, &two);