mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-20 18:22:07 +00:00
Fix local sym names not being expanded by PURGE
And an additional bug that broke the attached test
This commit is contained in:
@@ -11,6 +11,7 @@
|
||||
#define RGBDS_LINK_HASHMAP_H
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#define HASH_NB_BITS 32
|
||||
#define HALF_HASH_NB_BITS 16
|
||||
|
||||
@@ -208,7 +208,7 @@ void sym_Purge(char const *symName)
|
||||
yyerror("Symbol \"%s\" is referenced and thus cannot be purged",
|
||||
symName);
|
||||
} else {
|
||||
hash_RemoveElement(symbols, symName);
|
||||
hash_RemoveElement(symbols, symbol->name);
|
||||
if (symbol->type == SYM_MACRO)
|
||||
free(symbol->macro);
|
||||
free(symbol);
|
||||
@@ -476,11 +476,14 @@ struct Symbol *sym_Ref(char const *symName)
|
||||
|
||||
if (nsym == NULL) {
|
||||
char fullname[MAXSYMLEN + 1];
|
||||
struct Symbol const *scope = NULL;
|
||||
|
||||
if (*symName == '.') {
|
||||
if (symName[0] == '.') {
|
||||
if (!symbolScope)
|
||||
fatalerror("Local label reference '%s' in main scope",
|
||||
symName);
|
||||
scope = symbolScope->scope ? symbolScope->scope
|
||||
: symbolScope;
|
||||
fullSymbolName(fullname, sizeof(fullname), symName,
|
||||
symbolScope);
|
||||
symName = fullname;
|
||||
@@ -488,6 +491,7 @@ struct Symbol *sym_Ref(char const *symName)
|
||||
|
||||
nsym = createsymbol(symName);
|
||||
nsym->type = SYM_REF;
|
||||
nsym->scope = scope;
|
||||
}
|
||||
|
||||
return nsym;
|
||||
|
||||
8
test/asm/local-purge.asm
Normal file
8
test/asm/local-purge.asm
Normal file
@@ -0,0 +1,8 @@
|
||||
; At some point, the name of the local label was passed *unexpanded* to the
|
||||
; function doing the removal. Ensure that this is fixed.
|
||||
|
||||
SECTION "Test", ROM0[0]
|
||||
Glob:
|
||||
.loc
|
||||
PURGE .loc
|
||||
PRINTT "{.loc}\n" ; This should fail because the label doesn't exist anymore
|
||||
3
test/asm/local-purge.err
Normal file
3
test/asm/local-purge.err
Normal file
@@ -0,0 +1,3 @@
|
||||
ERROR: local-purge.asm(8):
|
||||
'.loc' not defined
|
||||
error: Assembly aborted (1 errors)!
|
||||
1
test/asm/local-purge.out
Normal file
1
test/asm/local-purge.out
Normal file
@@ -0,0 +1 @@
|
||||
$0
|
||||
Reference in New Issue
Block a user