diff --git a/include/asm/symbol.hpp b/include/asm/symbol.hpp index 158eb618..172bb62d 100644 --- a/include/asm/symbol.hpp +++ b/include/asm/symbol.hpp @@ -4,6 +4,7 @@ #define RGBDS_SYMBOL_H #include +#include #include #include @@ -128,7 +129,7 @@ struct Symbol *sym_AddMacro(char const *symName, int32_t defLineNo, char *body, struct Symbol *sym_Ref(char const *symName); struct Symbol *sym_AddString(char const *symName, char const *value); struct Symbol *sym_RedefString(char const *symName, char const *value); -void sym_Purge(char const *symName); +void sym_Purge(std::string const &symName); void sym_Init(time_t now); // Functions to save and restore the current symbol scope. diff --git a/src/asm/parser.y b/src/asm/parser.y index a76d3d11..5f9eeffe 100644 --- a/src/asm/parser.y +++ b/src/asm/parser.y @@ -361,20 +361,13 @@ static void initDsArgList(std::vector *&args) fatalerror("Failed to allocate memory for ds arg list: %s\n", strerror(errno)); } -static void initPurgeArgList(std::vector *&args) +static void initPurgeArgList(std::vector *&args) { - args = new(std::nothrow) std::vector(); + args = new(std::nothrow) std::vector(); if (!args) fatalerror("Failed to allocate memory for purge arg list: %s\n", strerror(errno)); } -static void freePurgeArgList(std::vector *&args) -{ - for (char *arg : *args) - free(arg); - delete args; -} - static void failAssert(enum AssertionType type) { switch (type) { @@ -468,7 +461,7 @@ enum { enum AssertionType assertType; struct AlignmentSpec alignSpec; std::vector *dsArgs; - std::vector *purgeArgs; + std::vector *purgeArgs; struct ForArgs forArgs; struct StrFmtArgList strfmtArgs; bool captureTerminated; @@ -1235,19 +1228,19 @@ redef_equs : redef_id T_POP_EQUS string { sym_RedefString($1, $3); } purge : T_POP_PURGE { lexer_ToggleStringExpansion(false); } purge_args trailing_comma { - for (char *arg : *$3) + for (std::string &arg : *$3) sym_Purge(arg); - freePurgeArgList($3); + delete $3; lexer_ToggleStringExpansion(true); } ; purge_args : scoped_id { initPurgeArgList($$); - $$->push_back(strdup($1)); + $$->push_back($1); } | purge_args T_COMMA scoped_id { - $1->push_back(strdup($3)); + $1->push_back($3); $$ = $1; } ; diff --git a/src/asm/symbol.cpp b/src/asm/symbol.cpp index 952c8f9e..f8bd42d9 100644 --- a/src/asm/symbol.cpp +++ b/src/asm/symbol.cpp @@ -199,16 +199,16 @@ static bool isReferenced(struct Symbol const *sym) } // Purge a symbol -void sym_Purge(char const *symName) +void sym_Purge(std::string const &symName) { - struct Symbol *sym = sym_FindScopedValidSymbol(symName); + struct Symbol *sym = sym_FindScopedValidSymbol(symName.c_str()); if (!sym) { - error("'%s' not defined\n", symName); + error("'%s' not defined\n", symName.c_str()); } else if (sym->isBuiltin) { - error("Built-in symbol '%s' cannot be purged\n", symName); + error("Built-in symbol '%s' cannot be purged\n", symName.c_str()); } else if (isReferenced(sym)) { - error("Symbol \"%s\" is referenced and thus cannot be purged\n", symName); + error("Symbol \"%s\" is referenced and thus cannot be purged\n", symName.c_str()); } else { // Do not keep a reference to the label's name after purging it if (sym->name == labelScope)