Module Name: src Committed By: rillig Date: Mon Dec 21 00:20:58 UTC 2020
Modified Files: src/usr.bin/make: var.c Log Message: make(1): switch memory handling from MFStr to FStr This makes all intermediate strings constant. For this simple search-and-replace refactoring, all intermediate locations where the "current value of the expression" was stored had to be of the type MFStr. Using FStr instead of MFStr allows to save a few memory allocations, which will be done in the follow-up commits. To generate a diff of this commit: cvs rdiff -u -r1.757 -r1.758 src/usr.bin/make/var.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/make/var.c diff -u src/usr.bin/make/var.c:1.757 src/usr.bin/make/var.c:1.758 --- src/usr.bin/make/var.c:1.757 Mon Dec 21 00:11:29 2020 +++ src/usr.bin/make/var.c Mon Dec 21 00:20:58 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: var.c,v 1.757 2020/12/21 00:11:29 rillig Exp $ */ +/* $NetBSD: var.c,v 1.758 2020/12/21 00:20:58 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -131,7 +131,7 @@ #include "metachar.h" /* "@(#)var.c 8.3 (Berkeley) 3/19/94" */ -MAKE_RCSID("$NetBSD: var.c,v 1.757 2020/12/21 00:11:29 rillig Exp $"); +MAKE_RCSID("$NetBSD: var.c,v 1.758 2020/12/21 00:20:58 rillig Exp $"); typedef enum VarFlags { VAR_NONE = 0, @@ -1930,7 +1930,7 @@ typedef struct ApplyModifiersState { * The new value of the expression, after applying the modifier, * never NULL. */ - MFStr newVal; + FStr newVal; /* Word separator in expansions (see the :ts modifier). */ char sep; /* @@ -2225,7 +2225,7 @@ ApplyModifier_Loop(const char **pp, cons args.eflags = st->eflags & ~(unsigned)VARE_KEEP_DOLLAR; prev_sep = st->sep; st->sep = ' '; /* XXX: should be st->sep for consistency */ - st->newVal = MFStr_InitOwn( + st->newVal = FStr_InitOwn( ModifyWords(val, ModifyWord_Loop, &args, st->oneBigWord, st->sep)); st->sep = prev_sep; /* XXX: Consider restoring the previous variable instead of deleting. */ @@ -2237,7 +2237,7 @@ ApplyModifier_Loop(const char **pp, cons /* :Ddefined or :Uundefined */ static ApplyModifierResult -ApplyModifier_Defined(const char **pp, char *val, ApplyModifiersState *st) +ApplyModifier_Defined(const char **pp, const char *val, ApplyModifiersState *st) { Buffer buf; const char *p; @@ -2286,9 +2286,9 @@ ApplyModifier_Defined(const char **pp, c ApplyModifiersState_Define(st); if (eflags & VARE_WANTRES) { - st->newVal = MFStr_InitOwn(Buf_Destroy(&buf, FALSE)); + st->newVal = FStr_InitOwn(Buf_Destroy(&buf, FALSE)); } else { - st->newVal = MFStr_InitRefer(val); + st->newVal = FStr_InitRefer(val); Buf_Destroy(&buf, TRUE); } return AMR_OK; @@ -2299,7 +2299,7 @@ static ApplyModifierResult ApplyModifier_Literal(const char **pp, ApplyModifiersState *st) { ApplyModifiersState_Define(st); - st->newVal = MFStr_InitOwn(bmake_strdup(st->var->name.str)); + st->newVal = FStr_InitOwn(bmake_strdup(st->var->name.str)); (*pp)++; return AMR_OK; } @@ -2345,7 +2345,7 @@ ApplyModifier_Gmtime(const char **pp, co utc = 0; *pp = mod + 6; } - st->newVal = MFStr_InitOwn(VarStrftime(val, TRUE, utc)); + st->newVal = FStr_InitOwn(VarStrftime(val, TRUE, utc)); return AMR_OK; } @@ -2372,7 +2372,7 @@ ApplyModifier_Localtime(const char **pp, utc = 0; *pp = mod + 9; } - st->newVal = MFStr_InitOwn(VarStrftime(val, FALSE, utc)); + st->newVal = FStr_InitOwn(VarStrftime(val, FALSE, utc)); return AMR_OK; } @@ -2383,7 +2383,7 @@ ApplyModifier_Hash(const char **pp, cons if (!ModMatch(*pp, "hash", st->endc)) return AMR_UNKNOWN; - st->newVal = MFStr_InitOwn(VarHash(val)); + st->newVal = FStr_InitOwn(VarHash(val)); *pp += 4; return AMR_OK; } @@ -2408,7 +2408,7 @@ ApplyModifier_Path(const char **pp, Appl } if (path == NULL) path = bmake_strdup(st->var->name.str); - st->newVal = MFStr_InitOwn(path); + st->newVal = FStr_InitOwn(path); (*pp)++; return AMR_OK; @@ -2430,9 +2430,9 @@ ApplyModifier_ShellCommand(const char ** errfmt = NULL; if (st->eflags & VARE_WANTRES) - st->newVal = MFStr_InitOwn(Cmd_Exec(cmd, &errfmt)); + st->newVal = FStr_InitOwn(Cmd_Exec(cmd, &errfmt)); else - st->newVal = MFStr_InitOwn(bmake_strdup("")); + st->newVal = FStr_InitOwn(bmake_strdup("")); if (errfmt != NULL) Error(errfmt, cmd); /* XXX: why still return AMR_OK? */ free(cmd); @@ -2483,7 +2483,7 @@ ApplyModifier_Range(const char **pp, con Buf_AddInt(&buf, 1 + (int)i); } - st->newVal = MFStr_InitOwn(Buf_Destroy(&buf, FALSE)); + st->newVal = FStr_InitOwn(Buf_Destroy(&buf, FALSE)); return AMR_OK; } @@ -2560,7 +2560,7 @@ ApplyModifier_Match(const char **pp, con st->var->name.str, val, pattern); callback = mod[0] == 'M' ? ModifyWord_Match : ModifyWord_NoMatch; - st->newVal = MFStr_InitOwn(ModifyWords(val, callback, pattern, + st->newVal = FStr_InitOwn(ModifyWords(val, callback, pattern, st->oneBigWord, st->sep)); free(pattern); return AMR_OK; @@ -2624,7 +2624,7 @@ ApplyModifier_Subst(const char **pp, con break; } - st->newVal = MFStr_InitOwn(ModifyWords(val, ModifyWord_Subst, &args, + st->newVal = FStr_InitOwn(ModifyWords(val, ModifyWord_Subst, &args, oneBigWord, st->sep)); free(lhs); @@ -2694,7 +2694,7 @@ ApplyModifier_Regex(const char **pp, con args.nsub = args.re.re_nsub + 1; if (args.nsub > 10) args.nsub = 10; - st->newVal = MFStr_InitOwn( + st->newVal = FStr_InitOwn( ModifyWords(val, ModifyWord_SubstRegex, &args, oneBigWord, st->sep)); regfree(&args.re); @@ -2709,7 +2709,7 @@ static ApplyModifierResult ApplyModifier_Quote(const char **pp, const char *val, ApplyModifiersState *st) { if ((*pp)[1] == st->endc || (*pp)[1] == ':') { - st->newVal = MFStr_InitOwn(VarQuote(val, **pp == 'q')); + st->newVal = FStr_InitOwn(VarQuote(val, **pp == 'q')); (*pp)++; return AMR_OK; } else @@ -2789,7 +2789,7 @@ ApplyModifier_ToSep(const char **pp, con } ok: - st->newVal = MFStr_InitOwn( + st->newVal = FStr_InitOwn( ModifyWords(val, ModifyWord_Copy, NULL, st->oneBigWord, st->sep)); return AMR_OK; } @@ -2824,7 +2824,7 @@ str_tolower(const char *str) /* :tA, :tu, :tl, :ts<separator>, etc. */ static ApplyModifierResult -ApplyModifier_To(const char **pp, char *val, ApplyModifiersState *st) +ApplyModifier_To(const char **pp, const char *val, ApplyModifiersState *st) { const char *mod = *pp; assert(mod[0] == 't'); @@ -2844,7 +2844,7 @@ ApplyModifier_To(const char **pp, char * /* Check for two-character options: ":tu", ":tl" */ if (mod[1] == 'A') { /* absolute path */ - st->newVal = MFStr_InitOwn( + st->newVal = FStr_InitOwn( ModifyWords(val, ModifyWord_Realpath, NULL, st->oneBigWord, st->sep)); *pp = mod + 2; @@ -2852,20 +2852,20 @@ ApplyModifier_To(const char **pp, char * } if (mod[1] == 'u') { /* :tu */ - st->newVal = MFStr_InitOwn(str_toupper(val)); + st->newVal = FStr_InitOwn(str_toupper(val)); *pp = mod + 2; return AMR_OK; } if (mod[1] == 'l') { /* :tl */ - st->newVal = MFStr_InitOwn(str_tolower(val)); + st->newVal = FStr_InitOwn(str_tolower(val)); *pp = mod + 2; return AMR_OK; } if (mod[1] == 'W' || mod[1] == 'w') { /* :tW, :tw */ st->oneBigWord = mod[1] == 'W'; - st->newVal = MFStr_InitRefer(val); + st->newVal = FStr_InitRefer(val); *pp = mod + 2; return AMR_OK; } @@ -2877,7 +2877,7 @@ ApplyModifier_To(const char **pp, char * /* :[#], :[1], :[-1..1], etc. */ static ApplyModifierResult -ApplyModifier_Words(const char **pp, char *val, ApplyModifiersState *st) +ApplyModifier_Words(const char **pp, const char *val, ApplyModifiersState *st) { char *estr; int first, last; @@ -2899,7 +2899,7 @@ ApplyModifier_Words(const char **pp, cha if (estr[0] == '#' && estr[1] == '\0') { /* Found ":[#]" */ if (st->oneBigWord) { - st->newVal = MFStr_InitOwn(bmake_strdup("1")); + st->newVal = FStr_InitOwn(bmake_strdup("1")); } else { Buffer buf; @@ -2910,7 +2910,7 @@ ApplyModifier_Words(const char **pp, cha /* 3 digits + '\0' is usually enough */ Buf_InitSize(&buf, 4); Buf_AddInt(&buf, (int)ac); - st->newVal = MFStr_InitOwn(Buf_Destroy(&buf, FALSE)); + st->newVal = FStr_InitOwn(Buf_Destroy(&buf, FALSE)); } goto ok; } @@ -2918,14 +2918,14 @@ ApplyModifier_Words(const char **pp, cha if (estr[0] == '*' && estr[1] == '\0') { /* Found ":[*]" */ st->oneBigWord = TRUE; - st->newVal = MFStr_InitRefer(val); + st->newVal = FStr_InitRefer(val); goto ok; } if (estr[0] == '@' && estr[1] == '\0') { /* Found ":[@]" */ st->oneBigWord = FALSE; - st->newVal = MFStr_InitRefer(val); + st->newVal = FStr_InitRefer(val); goto ok; } @@ -2954,7 +2954,7 @@ ApplyModifier_Words(const char **pp, cha if (first == 0 && last == 0) { /* ":[0]" or perhaps ":[0..0]" */ st->oneBigWord = TRUE; - st->newVal = MFStr_InitRefer(val); + st->newVal = FStr_InitRefer(val); goto ok; } @@ -2963,7 +2963,7 @@ ApplyModifier_Words(const char **pp, cha goto bad_modifier; /* Normal case: select the words described by first and last. */ - st->newVal = MFStr_InitOwn( + st->newVal = FStr_InitOwn( VarSelectWords(st->sep, st->oneBigWord, val, first, last)); ok: @@ -3027,7 +3027,7 @@ ApplyModifier_Order(const char **pp, con return AMR_BAD; } - st->newVal = MFStr_InitOwn(Words_JoinFree(words)); + st->newVal = FStr_InitOwn(Words_JoinFree(words)); return AMR_OK; } @@ -3070,10 +3070,10 @@ ApplyModifier_IfElse(const char **pp, co } if (value) { - st->newVal = MFStr_InitOwn(then_expr); + st->newVal = FStr_InitOwn(then_expr); free(else_expr); } else { - st->newVal = MFStr_InitOwn(else_expr); + st->newVal = FStr_InitOwn(else_expr); free(then_expr); } ApplyModifiersState_Define(st); @@ -3177,14 +3177,15 @@ ok: } } free(val); - st->newVal = MFStr_InitOwn(bmake_strdup("")); + st->newVal = FStr_InitOwn(bmake_strdup("")); return AMR_OK; } /* :_=... * remember current value */ static ApplyModifierResult -ApplyModifier_Remember(const char **pp, char *val, ApplyModifiersState *st) +ApplyModifier_Remember(const char **pp, const char *val, + ApplyModifiersState *st) { const char *mod = *pp; if (!ModMatchEq(mod, "_", st->endc)) @@ -3200,7 +3201,7 @@ ApplyModifier_Remember(const char **pp, Var_Set("_", val, st->ctxt); *pp = mod + 1; } - st->newVal = MFStr_InitRefer(val); + st->newVal = FStr_InitRefer(val); return AMR_OK; } @@ -3214,7 +3215,7 @@ ApplyModifier_WordFunc(const char **pp, if (delim != st->endc && delim != ':') return AMR_UNKNOWN; - st->newVal = MFStr_InitOwn(ModifyWords(val, modifyWord, NULL, + st->newVal = FStr_InitOwn(ModifyWords(val, modifyWord, NULL, st->oneBigWord, st->sep)); (*pp)++; return AMR_OK; @@ -3224,7 +3225,7 @@ static ApplyModifierResult ApplyModifier_Unique(const char **pp, const char *val, ApplyModifiersState *st) { if ((*pp)[1] == st->endc || (*pp)[1] == ':') { - st->newVal = MFStr_InitOwn(VarUniq(val)); + st->newVal = FStr_InitOwn(VarUniq(val)); (*pp)++; return AMR_OK; } else @@ -3234,7 +3235,7 @@ ApplyModifier_Unique(const char **pp, co #ifdef SYSVVARSUB /* :from=to */ static ApplyModifierResult -ApplyModifier_SysV(const char **pp, char *val, ApplyModifiersState *st) +ApplyModifier_SysV(const char **pp, const char *val, ApplyModifiersState *st) { char *lhs, *rhs; VarParseResult res; @@ -3275,10 +3276,10 @@ ApplyModifier_SysV(const char **pp, char (*pp)--; if (lhs[0] == '\0' && val[0] == '\0') { - st->newVal = MFStr_InitRefer(val); /* special case */ + st->newVal = FStr_InitRefer(val); /* special case */ } else { struct ModifyWord_SYSVSubstArgs args = { st->ctxt, lhs, rhs }; - st->newVal = MFStr_InitOwn( + st->newVal = FStr_InitOwn( ModifyWords(val, ModifyWord_SYSVSubst, &args, st->oneBigWord, st->sep)); } @@ -3298,11 +3299,11 @@ ApplyModifier_SunShell(const char **pp, if (p[1] == 'h' && (p[2] == st->endc || p[2] == ':')) { if (st->eflags & VARE_WANTRES) { const char *errfmt; - st->newVal = MFStr_InitOwn(Cmd_Exec(val, &errfmt)); + st->newVal = FStr_InitOwn(Cmd_Exec(val, &errfmt)); if (errfmt != NULL) Error(errfmt, val); } else - st->newVal = MFStr_InitOwn(bmake_strdup("")); + st->newVal = FStr_InitOwn(bmake_strdup("")); *pp = p + 2; return AMR_OK; } else @@ -3355,7 +3356,7 @@ LogAfterApply(ApplyModifiersState *st, c } static ApplyModifierResult -ApplyModifier(const char **pp, char *val, ApplyModifiersState *st) +ApplyModifier(const char **pp, const char *val, ApplyModifiersState *st) { switch (**pp) { case ':': @@ -3420,7 +3421,7 @@ ApplyModifier(const char **pp, char *val } } -static MFStr ApplyModifiers(const char **, MFStr, char, char, Var *, +static FStr ApplyModifiers(const char **, FStr, char, char, Var *, VarExprFlags *, GNode *, VarEvalFlags); typedef enum ApplyModifiersIndirectResult { @@ -3450,7 +3451,7 @@ typedef enum ApplyModifiersIndirectResul */ static ApplyModifiersIndirectResult ApplyModifiersIndirect(ApplyModifiersState *st, const char **pp, - MFStr *inout_value) + FStr *inout_value) { const char *p = *pp; FStr mods; @@ -3468,7 +3469,7 @@ ApplyModifiersIndirect(ApplyModifiersSta if (mods.str[0] != '\0') { const char *modsp = mods.str; - MFStr newVal = ApplyModifiers(&modsp, *inout_value, '\0', '\0', + FStr newVal = ApplyModifiers(&modsp, *inout_value, '\0', '\0', st->var, &st->exprFlags, st->ctxt, st->eflags); *inout_value = newVal; if (newVal.str == var_Error || newVal.str == varUndefined || @@ -3496,11 +3497,11 @@ ApplyModifiersIndirect(ApplyModifiersSta static ApplyModifierResult ApplySingleModifier(ApplyModifiersState *st, const char *mod, char endc, - const char **pp, MFStr *inout_value) + const char **pp, FStr *inout_value) { ApplyModifierResult res; const char *p = *pp; - char *const val = inout_value->str; + const char *const val = inout_value->str; if (DEBUG(VAR)) LogBeforeApply(st, mod, endc, val); @@ -3524,7 +3525,7 @@ ApplySingleModifier(ApplyModifiersState */ for (p++; *p != ':' && *p != st->endc && *p != '\0'; p++) continue; - st->newVal = MFStr_InitRefer(var_Error); + st->newVal = FStr_InitRefer(var_Error); } if (res == AMR_CLEANUP || res == AMR_BAD) { *pp = p; @@ -3535,7 +3536,7 @@ ApplySingleModifier(ApplyModifiersState LogAfterApply(st, p, mod); if (st->newVal.str != val) { - MFStr_Done(inout_value); + FStr_Done(inout_value); *inout_value = st->newVal; } if (*p == '\0' && st->endc != '\0') { @@ -3559,10 +3560,10 @@ ApplySingleModifier(ApplyModifiersState } /* Apply any modifiers (such as :Mpattern or :@var@loop@ or :Q or ::=value). */ -static MFStr +static FStr ApplyModifiers( const char **pp, /* the parsing position, updated upon return */ - MFStr value, /* the current value of the expression */ + FStr value, /* the current value of the expression */ char startc, /* '(' or '{', or '\0' for indirect modifiers */ char endc, /* ')' or '}', or '\0' for indirect modifiers */ Var *v, @@ -3573,7 +3574,7 @@ ApplyModifiers( { ApplyModifiersState st = { startc, endc, v, ctxt, eflags, - MFStr_InitRefer(var_Error), /* .newVal */ + FStr_InitRefer(var_Error), /* .newVal */ ' ', /* .sep */ FALSE, /* .oneBigWord */ *exprFlags /* .exprFlags */ @@ -3607,7 +3608,7 @@ ApplyModifiers( } /* default value, in case of errors */ - st.newVal = MFStr_InitRefer(var_Error); + st.newVal = FStr_InitRefer(var_Error); mod = p; res = ApplySingleModifier(&st, mod, endc, &p, &value); @@ -3629,9 +3630,9 @@ bad_modifier: cleanup: *pp = p; - MFStr_Done(&value); + FStr_Done(&value); *exprFlags = st.exprFlags; - return MFStr_InitRefer(var_Error); + return FStr_InitRefer(var_Error); } /* Only four of the local variables are treated specially as they are the @@ -4040,7 +4041,7 @@ Var_Parse(const char **pp, GNode *ctxt, Boolean dynamic; const char *extramodifiers; Var *v; - MFStr value; + FStr value; char eflags_str[VarEvalFlags_ToStringSize]; VarExprFlags exprFlags = VEF_NONE; @@ -4087,7 +4088,7 @@ Var_Parse(const char **pp, GNode *ctxt, * the then-current value of the variable. This might also invoke * undefined behavior. */ - value = MFStr_InitRefer(Buf_GetAll(&v->val, NULL)); + value = FStr_InitRefer(Buf_GetAll(&v->val, NULL)); /* * Before applying any modifiers, expand any nested expressions from @@ -4102,7 +4103,7 @@ Var_Parse(const char **pp, GNode *ctxt, (void)Var_Subst(value.str, ctxt, nested_eflags, &expanded); v->flags &= ~(unsigned)VAR_IN_USE; /* TODO: handle errors */ - value = MFStr_InitOwn(expanded); + value = FStr_InitOwn(expanded); } if (haveModifier || extramodifiers != NULL) { @@ -4130,16 +4131,16 @@ Var_Parse(const char **pp, GNode *ctxt, } else if (exprFlags & VEF_UNDEF) { if (!(exprFlags & VEF_DEF)) { - MFStr_Done(&value); + FStr_Done(&value); if (dynamic) { - value = MFStr_InitOwn(bmake_strsedup(start, p)); + value = FStr_InitOwn(bmake_strsedup(start, p)); } else { /* * The expression is still undefined, * therefore discard the actual value and * return an error marker instead. */ - value = MFStr_InitRefer(eflags & VARE_UNDEFERR + value = FStr_InitRefer(eflags & VARE_UNDEFERR ? var_Error : varUndefined); } }