mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-25 04:22:07 +00:00
Implement __SCOPE__ (#1845)
This commit is contained in:
@@ -39,6 +39,7 @@ static Symbol const *localScope = nullptr; // Current section's local label sco
|
||||
|
||||
static Symbol *PCSymbol;
|
||||
static Symbol *NARGSymbol;
|
||||
static Symbol *SCOPESymbol;
|
||||
static Symbol *globalScopeSymbol;
|
||||
static Symbol *localScopeSymbol;
|
||||
static Symbol *RSSymbol;
|
||||
@@ -67,6 +68,19 @@ static int32_t NARGCallback() {
|
||||
}
|
||||
}
|
||||
|
||||
static std::shared_ptr<std::string> SCOPECallback() {
|
||||
if (localScope) {
|
||||
return std::make_shared<std::string>("..");
|
||||
} else if (globalScope) {
|
||||
return std::make_shared<std::string>(".");
|
||||
} else {
|
||||
if (!sect_GetSymbolSection()) {
|
||||
error("`__SCOPE__` has no value outside of a section");
|
||||
}
|
||||
return std::make_shared<std::string>("");
|
||||
}
|
||||
}
|
||||
|
||||
static std::shared_ptr<std::string> globalScopeCallback() {
|
||||
if (!globalScope) {
|
||||
error("`.` has no value outside of a label scope");
|
||||
@@ -296,6 +310,10 @@ Symbol *sym_FindScopedValidSymbol(std::string const &symName) {
|
||||
if (sym == localScopeSymbol && !localScope) {
|
||||
return nullptr;
|
||||
}
|
||||
// `__SCOPE__` has no value outside of a section
|
||||
if (sym == SCOPESymbol && !sect_GetSymbolSection()) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return sym;
|
||||
}
|
||||
@@ -683,6 +701,11 @@ void sym_Init(time_t now) {
|
||||
localScopeSymbol->data = localScopeCallback;
|
||||
localScopeSymbol->isBuiltin = true;
|
||||
|
||||
SCOPESymbol = &createSymbol("__SCOPE__"s);
|
||||
SCOPESymbol->type = SYM_EQUS;
|
||||
SCOPESymbol->data = SCOPECallback;
|
||||
SCOPESymbol->isBuiltin = true;
|
||||
|
||||
RSSymbol = sym_AddVar("_RS"s, 0);
|
||||
RSSymbol->isBuiltin = true;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user