diff --git a/include/asm/symbol.hpp b/include/asm/symbol.hpp index 4ff38633..158eb618 100644 --- a/include/asm/symbol.hpp +++ b/include/asm/symbol.hpp @@ -102,7 +102,7 @@ static inline char const *sym_GetStringValue(struct Symbol const *sym) return sym->equs.value; } -void sym_ForEach(void (*func)(struct Symbol *, void *), void *arg); +void sym_ForEach(void (*func)(struct Symbol *)); int32_t sym_GetValue(struct Symbol const *sym); void sym_SetExportAll(bool set); diff --git a/src/asm/output.cpp b/src/asm/output.cpp index 0340b0b9..9b02525b 100644 --- a/src/asm/output.cpp +++ b/src/asm/output.cpp @@ -415,7 +415,7 @@ static void writeFileStackNode(struct FileStackNode const *node, FILE *f) } } -static void registerUnregisteredSymbol(struct Symbol *symbol, void *) +static void registerUnregisteredSymbol(struct Symbol *symbol) { // Check for symbol->src, to skip any built-in symbol from rgbasm if (symbol->src && symbol->ID == (uint32_t)-1) { @@ -438,7 +438,7 @@ void out_WriteObject(void) err("Failed to open object file '%s'", objectName); // Also write symbols that weren't written above - sym_ForEach(registerUnregisteredSymbol, NULL); + sym_ForEach(registerUnregisteredSymbol); fprintf(f, RGBDS_OBJECT_VERSION_STRING); putlong(RGBDS_OBJECT_REV, f); diff --git a/src/asm/symbol.cpp b/src/asm/symbol.cpp index e2cd32af..4c1e7419 100644 --- a/src/asm/symbol.cpp +++ b/src/asm/symbol.cpp @@ -6,8 +6,10 @@ #include #include #include +#include #include #include +#include #include #include @@ -22,11 +24,10 @@ #include "asm/warning.hpp" #include "error.hpp" -#include "hashmap.hpp" #include "helpers.hpp" #include "version.hpp" -HashMap symbols; +std::map symbols; static const char *labelScope; // Current section's label scope static struct Symbol *PCSymbol; @@ -42,24 +43,10 @@ bool sym_IsPC(struct Symbol const *sym) return sym == PCSymbol; } -struct ForEachArgs { - void (*func)(struct Symbol *sym, void *arg); - void *arg; -}; - -static void forEachWrapper(void *_sym, void *_argWrapper) +void sym_ForEach(void (*callback)(struct Symbol *)) { - struct ForEachArgs *argWrapper = (struct ForEachArgs *)_argWrapper; - struct Symbol *sym = (struct Symbol *)_sym; - - argWrapper->func(sym, argWrapper->arg); -} - -void sym_ForEach(void (*func)(struct Symbol *, void *), void *arg) -{ - struct ForEachArgs argWrapper = { .func = func, .arg = arg }; - - hash_ForEach(symbols, forEachWrapper, &argWrapper); + for (auto &it : symbols) + callback(it.second); } static int32_t Callback_NARG(void) @@ -138,7 +125,7 @@ static struct Symbol *createsymbol(char const *symName) setSymbolFilename(sym); sym->ID = -1; - hash_AddElement(symbols, sym->name, sym); + symbols[sym->name] = sym; return sym; } @@ -169,7 +156,8 @@ static void assignStringSymbol(struct Symbol *sym, char const *value) struct Symbol *sym_FindExactSymbol(char const *symName) { - return (struct Symbol *)hash_GetElement(symbols, symName); + auto search = symbols.find(symName); + return search != symbols.end() ? search->second : NULL; } struct Symbol *sym_FindScopedSymbol(char const *symName) @@ -234,7 +222,7 @@ void sym_Purge(char const *symName) // FIXME: this leaks sym->equs.value for SYM_EQUS and sym->macro.value for SYM_MACRO, // but this can't free either of them because the expansion may be purging itself. - hash_RemoveElement(symbols, sym->name); + symbols.erase(sym->name); // TODO: ideally, also unref the file stack nodes free(sym); }