mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-20 18:22:07 +00:00
Use automatic allocation for PURGE args
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user