Use automatic allocation for PURGE args

This commit is contained in:
Rangi42
2024-02-22 20:59:55 -05:00
committed by Sylvie
parent 6a23c5fd48
commit b1aa98b43d
2 changed files with 16 additions and 37 deletions

View File

@@ -95,11 +95,4 @@ struct DsArgList {
struct Expression *args; struct Expression *args;
}; };
#define INITIAL_PURGE_ARG_SIZE 2
struct PurgeArgList {
size_t nbArgs;
size_t capacity;
char **args;
};
#endif // RGBDS_ASM_LEXER_H #endif // RGBDS_ASM_LEXER_H

View File

@@ -379,33 +379,19 @@ static void freeDsArgList(struct DsArgList *args)
free(args->args); free(args->args);
} }
static void initPurgeArgList(struct PurgeArgList *args) static void initPurgeArgList(std::vector<char *> *&args)
{ {
args->nbArgs = 0; args = new(std::nothrow) std::vector<char *>();
args->capacity = INITIAL_PURGE_ARG_SIZE; if (!args)
args->args = (char **)malloc(args->capacity * sizeof(*args->args));
if (!args->args)
fatalerror("Failed to allocate memory for purge arg list: %s\n", fatalerror("Failed to allocate memory for purge arg list: %s\n",
strerror(errno)); strerror(errno));
} }
static void appendPurgeArgList(struct PurgeArgList *args, char *arg) static void freePurgeArgList(std::vector<char *> *&args)
{ {
if (args->nbArgs == args->capacity) { for (char *arg : *args)
args->capacity = (args->capacity + 1) * 2; free(arg);
args->args = (char **)realloc(args->args, args->capacity * sizeof(*args->args)); delete args;
if (!args->args)
fatalerror("realloc error while resizing purge arg list: %s\n",
strerror(errno));
}
args->args[args->nbArgs++] = arg;
}
static void freePurgeArgList(struct PurgeArgList *args)
{
for (size_t i = 0; i < args->nbArgs; i++)
free(args->args[i]);
free(args->args);
} }
static void failAssert(enum AssertionType type) static void failAssert(enum AssertionType type)
@@ -501,7 +487,7 @@ enum {
enum AssertionType assertType; enum AssertionType assertType;
struct AlignmentSpec alignSpec; struct AlignmentSpec alignSpec;
struct DsArgList dsArgs; struct DsArgList dsArgs;
struct PurgeArgList purgeArgs; std::vector<char *> *purgeArgs;
struct ForArgs forArgs; struct ForArgs forArgs;
struct StrFmtArgList strfmtArgs; struct StrFmtArgList strfmtArgs;
bool captureTerminated; bool captureTerminated;
@@ -1268,19 +1254,19 @@ redef_equs : redef_id T_POP_EQUS string { sym_RedefString($1, $3); }
purge : T_POP_PURGE { purge : T_POP_PURGE {
lexer_ToggleStringExpansion(false); lexer_ToggleStringExpansion(false);
} purge_args trailing_comma { } purge_args trailing_comma {
for (uint32_t i = 0; i < $3.nbArgs; i++) for (char *arg : *$3)
sym_Purge($3.args[i]); sym_Purge(arg);
freePurgeArgList(&$3); freePurgeArgList($3);
lexer_ToggleStringExpansion(true); lexer_ToggleStringExpansion(true);
} }
; ;
purge_args : scoped_id { purge_args : scoped_id {
initPurgeArgList(&$$); initPurgeArgList($$);
appendPurgeArgList(&$$, strdup($1)); $$->push_back(strdup($1));
} }
| purge_args T_COMMA scoped_id { | purge_args T_COMMA scoped_id {
appendPurgeArgList(&$1, strdup($3)); $1->push_back(strdup($3));
$$ = $1; $$ = $1;
} }
; ;
@@ -1628,9 +1614,9 @@ relocexpr_no_str : scoped_anon_id { rpn_Symbol(&$$, $1); }
; ;
uconst : const { uconst : const {
$$ = $1; if ($1 < 0)
if ($$ < 0)
fatalerror("Constant must not be negative: %d\n", $1); fatalerror("Constant must not be negative: %d\n", $1);
$$ = $1;
} }
; ;