WIP: re-assigning symbols
authorLukas Krickl <lukas@krickl.dev>
Sun, 3 Dec 2023 18:58:20 +0000 (19:58 +0100)
committerLukas Krickl <lukas@krickl.dev>
Sun, 3 Dec 2023 18:58:20 +0000 (19:58 +0100)
include/ulas.h
src/test.c
src/ulas.c

index 4d575e96aaec9607fcf3004ef543d5260294f618..433bd02b70ad952616c75f25e870e7f954e72f59 100644 (file)
@@ -514,6 +514,7 @@ int ulas_tokbufpush(struct ulas_tokbuf *tb, struct ulas_tok tok);
 struct ulas_tok *ulas_tokbufget(struct ulas_tokbuf *tb, int i);
 void ulas_tokbufclear(struct ulas_tokbuf *tb);
 void ulas_tokbuffree(struct ulas_tokbuf *tb);
+void ulas_tokfree(struct ulas_tok *t);
 
 struct ulas_exprbuf ulas_exprbuf(void);
 
index 483d451f96ff2237f811a9ec00339ea62dc8824e..dddcb69817102f837b586a1f22389a9787730b0c 100644 (file)
@@ -317,7 +317,7 @@ void test_symscope(void) {
   ASSERT_SYMSCOPE(0, "@t1:", -1, 1);
   ASSERT_SYMSCOPE(-1, "@t1:", -1, 1);
 
-  // manual scoping 
+  // manual scoping
   ASSERT_SYMSCOPE(0, "t2:", 5, 1);
   ASSERT_SYMSCOPE(-1, "t2:", 5, 1);
   ASSERT_SYMSCOPE(0, "t2:", 6, 1);
index e8b4009aae979eb9fe265b6896ca0f97ec0c0898..97d25399ff6cc82bfb3e11d97ad37ec56e9a3dfd 100644 (file)
@@ -226,7 +226,7 @@ struct ulas_sym *ulas_symbolresolve(const char *name, int scope, int *rc) {
 
 int ulas_symbolset(const char *cname, int scope, struct ulas_tok tok,
                    int constant) {
-  // remove : from name 
+  // remove : from name
   char name[ULAS_SYMNAMEMAX];
   long len = strlen(cname);
   assert(len < ULAS_SYMNAMEMAX);
@@ -247,8 +247,8 @@ int ulas_symbolset(const char *cname, int scope, struct ulas_tok tok,
     }
   }
 
-  struct ulas_sym *exisitng = ulas_symbolresolve(name, scope, &resolve_rc);
-  if (!exisitng) {
+  struct ulas_sym *existing = ulas_symbolresolve(name, scope, &resolve_rc);
+  if (!existing) {
     // inc scope when symbol is global
     if (name[0] != ULAS_TOK_SCOPED_SYMBOL_BEGIN) {
       ulas.scope++;
@@ -257,8 +257,12 @@ int ulas_symbolset(const char *cname, int scope, struct ulas_tok tok,
     // def new symbol
     struct ulas_sym new_sym = {strdup(name), tok, scope, ulas.pass, constant};
     ulas_symbufpush(&ulas.syms, new_sym);
-  } else if (exisitng->lastdefin != ulas.pass) {
+  } else if (existing->lastdefin != ulas.pass || !existing->constant) {
     // redefine if not defined this pass
+    existing->lastdefin = ulas.pass;
+    ulas_tokfree(&existing->tok);
+    existing->tok = tok;
+    existing->constant = constant;
   } else {
     // exists.. cannot have duplicates!
     rc = -1;