mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-21 10:42:07 +00:00
Allow defining local labels for another scope (#1159)
fix #1157 for the following source code ``` section "hSAVE_locals",HRAM func3.hSpam: ds 1 ; no longer produces an error ;.hEggs: ds 1 ; uncomment this to see the new error section "demo",ROM0 func3: ldh a, [.hSpam] ret ``` Remove two errors: - `Not currently in the scope of 'func3'` - `Local label 'func3.hSpam' in main scope` Add one error: - `Relative local label '.hSpam' in main scope` Co-authored-by: Rangi <35663410+Rangi42@users.noreply.github.com>
This commit is contained in:
4
.github/scripts/get_win_deps.ps1
vendored
4
.github/scripts/get_win_deps.ps1
vendored
@@ -15,9 +15,9 @@ function getlibrary ([string] $URI, [string] $filename, [string] $hash, [string]
|
|||||||
Expand-Archive -DestinationPath $destdir $filename
|
Expand-Archive -DestinationPath $destdir $filename
|
||||||
}
|
}
|
||||||
|
|
||||||
getlibrary 'https://www.zlib.net/zlib1213.zip' 'zlib.zip' 'd233fca7cf68db4c16dc5287af61f3cd01ab62495224c66639ca3da537701e42' .
|
getlibrary 'https://www.zlib.net/zlib13.zip' 'zlib.zip' 'c561d09347f674f0d72692e7c75d9898919326c532aab7f8c07bb43b07efeb38' .
|
||||||
getlibrary 'https://download.sourceforge.net/libpng/lpng1637.zip' 'libpng.zip' '3b4b1cbd0bae6822f749d39b1ccadd6297f05e2b85a83dd2ce6ecd7d09eabdf2' .
|
getlibrary 'https://download.sourceforge.net/libpng/lpng1637.zip' 'libpng.zip' '3b4b1cbd0bae6822f749d39b1ccadd6297f05e2b85a83dd2ce6ecd7d09eabdf2' .
|
||||||
getlibrary 'https://github.com/lexxmark/winflexbison/releases/download/v2.5.24/win_flex_bison-2.5.24.zip' 'winflexbison.zip' '39c6086ce211d5415500acc5ed2d8939861ca1696aee48909c7f6daf5122b505' install_dir
|
getlibrary 'https://github.com/lexxmark/winflexbison/releases/download/v2.5.24/win_flex_bison-2.5.24.zip' 'winflexbison.zip' '39c6086ce211d5415500acc5ed2d8939861ca1696aee48909c7f6daf5122b505' install_dir
|
||||||
|
|
||||||
Move-Item zlib-1.2.13 zlib
|
Move-Item zlib-1.3 zlib
|
||||||
Move-Item lpng1637 libpng
|
Move-Item lpng1637 libpng
|
||||||
|
|||||||
@@ -525,16 +525,14 @@ static struct Symbol *addLabel(char const *symName)
|
|||||||
// Add a local (`.name` or `Parent.name`) relocatable symbol
|
// Add a local (`.name` or `Parent.name`) relocatable symbol
|
||||||
struct Symbol *sym_AddLocalLabel(char const *symName)
|
struct Symbol *sym_AddLocalLabel(char const *symName)
|
||||||
{
|
{
|
||||||
if (!labelScope) {
|
// Assuming no dots in `labelScope` if defined
|
||||||
error("Local label '%s' in main scope\n", symName);
|
assert(!labelScope || !strchr(labelScope, '.'));
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
assert(!strchr(labelScope, '.')); // Assuming no dots in `labelScope`
|
|
||||||
|
|
||||||
char fullName[MAXSYMLEN + 1];
|
char fullName[MAXSYMLEN + 1];
|
||||||
char const *localName = strchr(symName, '.');
|
char const *localName = strchr(symName, '.');
|
||||||
|
|
||||||
assert(localName); // There should be at least one dot in `symName`
|
assert(localName); // There should be at least one dot in `symName`
|
||||||
|
|
||||||
// Check for something after the dot in `localName`
|
// Check for something after the dot in `localName`
|
||||||
if (localName[1] == '\0') {
|
if (localName[1] == '\0') {
|
||||||
fatalerror("'%s' is a nonsensical reference to an empty local label\n",
|
fatalerror("'%s' is a nonsensical reference to an empty local label\n",
|
||||||
@@ -546,23 +544,13 @@ struct Symbol *sym_AddLocalLabel(char const *symName)
|
|||||||
symName);
|
symName);
|
||||||
|
|
||||||
if (localName == symName) {
|
if (localName == symName) {
|
||||||
|
if (!labelScope) {
|
||||||
|
error("Unqualified local label '%s' in main scope\n", symName);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
// Expand `symName` to the full `labelScope.symName` name
|
// Expand `symName` to the full `labelScope.symName` name
|
||||||
fullSymbolName(fullName, sizeof(fullName), symName, labelScope);
|
fullSymbolName(fullName, sizeof(fullName), symName, labelScope);
|
||||||
symName = fullName;
|
symName = fullName;
|
||||||
} else {
|
|
||||||
size_t i = 0;
|
|
||||||
|
|
||||||
// Find where `labelScope` and `symName` first differ
|
|
||||||
while (labelScope[i] && symName[i] == labelScope[i])
|
|
||||||
i++;
|
|
||||||
|
|
||||||
// Check that `symName` starts with `labelScope` and then a '.'
|
|
||||||
if (labelScope[i] != '\0' || symName[i] != '.') {
|
|
||||||
size_t parentLen = localName - symName;
|
|
||||||
|
|
||||||
assert(parentLen <= INT_MAX);
|
|
||||||
error("Not currently in the scope of '%.*s'\n", (int)parentLen, symName);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return addLabel(symName);
|
return addLabel(symName);
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
error: local-without-parent.asm(2):
|
error: local-without-parent.asm(2):
|
||||||
Local label '.test' in main scope
|
Unqualified local label '.test' in main scope
|
||||||
error: Assembly aborted (1 error)!
|
error: Assembly aborted (1 error)!
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
SECTION "sec", ROM0
|
|
||||||
|
|
||||||
Parent:
|
|
||||||
db 0
|
|
||||||
WrongParent.child
|
|
||||||
db 0
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
error: local-wrong-parent.asm(5):
|
|
||||||
Not currently in the scope of 'WrongParent'
|
|
||||||
error: Assembly aborted (1 error)!
|
|
||||||
@@ -1,8 +1,9 @@
|
|||||||
SECTION "Scopes", ROM0
|
SECTION "Scopes", ROM0
|
||||||
|
|
||||||
; Neither of these should be created
|
; Tests of injecting local labels into another label's scope.
|
||||||
.tooSoon
|
; This construction is useful to define a subroutine's local variables
|
||||||
Nice.try
|
; in WRAM or HRAM.
|
||||||
|
Valid.syntax
|
||||||
|
|
||||||
Parent:
|
Parent:
|
||||||
.loc
|
.loc
|
||||||
@@ -11,8 +12,8 @@ Parent.explicit
|
|||||||
dw .explicit ; This should expand to the above
|
dw .explicit ; This should expand to the above
|
||||||
|
|
||||||
|
|
||||||
; None of the two locals below should manage to be created, being in the wrong scopes
|
; Note that `Parentheses` begins with `Parent`,
|
||||||
; Note however that `Parentheses` begins with `Parent`, which string checks may fail to handle
|
; which string checks may fail to handle
|
||||||
|
|
||||||
Parentheses.check
|
Parentheses.check
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
error: sym-scope.asm(4):
|
|
||||||
Local label '.tooSoon' in main scope
|
|
||||||
error: sym-scope.asm(5):
|
|
||||||
Local label 'Nice.try' in main scope
|
|
||||||
error: sym-scope.asm(17):
|
|
||||||
Not currently in the scope of 'Parentheses'
|
|
||||||
error: sym-scope.asm(21):
|
|
||||||
Not currently in the scope of 'Parent'
|
|
||||||
error: Assembly aborted (4 errors)!
|
|
||||||
|
|||||||
Reference in New Issue
Block a user