'#persist' in structs; map bugfix
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 1 Mar 2022 04:28:16 +0000 (22:28 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 1 Mar 2022 04:28:16 +0000 (22:28 -0600)
core/container/map.onyx
src/parser.c

index 51219c3ae208590c6162d253cfb01413e5489910..621817dd219b1d71223e4e720a31d608a16112bc 100644 (file)
@@ -68,8 +68,8 @@ init :: (use map: ^Map($K, $V), default := __zero_value(V)) {
 }
 
 free :: (use map: ^Map) {
-    memory.free_slice(^hashes, allocator=allocator);
-    array.free(^entries);
+    if map.hashes.data != null do memory.free_slice(^hashes, allocator=allocator);
+    if map.entries.data != null do array.free(^entries);
 }
 
 put :: (use map: ^Map, key: map.Key_Type, value: map.Value_Type) {
index 9e90474b5a43108b6a7a18f36955057778ed817e..583492ee6aac1562cf3034e18f2861ac206dba78 100644 (file)
@@ -1968,6 +1968,19 @@ static AstStructType* parse_struct(OnyxParser* parser) {
             continue;
         }
 
+        if (parse_possible_directive(parser, "persist")) {
+            b32 thread_local = parse_possible_directive(parser, "thread_local");
+
+            OnyxToken* symbol = expect_token(parser, Token_Type_Symbol);
+            AstMemRes* memres = parse_memory_reservation(parser, symbol, thread_local);
+
+            AstBinding* binding = make_node(AstBinding, Ast_Kind_Binding);
+            binding->token = memres->token;
+            binding->node = (AstNode *) memres;
+            ENTITY_SUBMIT(binding);
+            continue;
+        }
+
         if (next_tokens_are(parser, 3, Token_Type_Symbol, ':', ':')) {
             if (!s_node->scope) {
                 s_node->scope = scope_create(context.ast_alloc, parser->current_scope, s_node->token->pos);