]> git.sur5r.net Git - cc65/commitdiff
Allow fully scoped labels and constants instead of normal ones. This breaks
authoruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 29 Oct 2009 20:30:41 +0000 (20:30 +0000)
committeruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 29 Oct 2009 20:30:41 +0000 (20:30 +0000)
the barrier between scopes: It is now possible to introduce symbols into a
foreign scope, provided that it's name is known.

git-svn-id: svn://svn.cc65.org/cc65/trunk@4397 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/ca65/main.c

index 54575937a7de8841e465ede21c60af33e05f7987..63891bbf6b8dbe79613b879da17cc7fd21e849a0 100644 (file)
@@ -72,6 +72,7 @@
 #include "segment.h"
 #include "sizeof.h"
 #include "spool.h"
+#include "symbol.h"
 #include "symtab.h"
 #include "ulabel.h"
 
@@ -577,19 +578,24 @@ static void OneLine (void)
         }
     }
 
-    /* Handle an identifier */
-    if (Tok == TOK_LOCAL_IDENT || (Tok == TOK_IDENT && Instr < 0 && !Macro)) {
+    /* Handle an identifier. This may be a cheap local symbol, or a fully
+     * scoped identifier which may start with a namespace token (for global
+     * namespace)
+     */
+    if (Tok == TOK_LOCAL_IDENT ||
+        Tok == TOK_NAMESPACE   ||
+        (Tok == TOK_IDENT && Instr < 0 && !Macro)) {
 
         /* Did we have whitespace before the ident? */
         int HadWS = WS;
 
         /* Generate the symbol table entry, then skip the name */
-        if (Tok == TOK_IDENT) {
-            Sym = SymFind (CurrentScope, &SVal, SYM_ALLOC_NEW);
-        } else {
+        if (Tok == TOK_LOCAL_IDENT) {
             Sym = SymFindLocal (SymLast, &SVal, SYM_ALLOC_NEW);
+            NextTok ();
+        } else {
+            Sym = ParseScopedSymName (SYM_ALLOC_NEW);
         }
-        NextTok ();
 
         /* If a colon follows, this is a label definition. If there
          * is no colon, it's an assignment.