We're going to add more attributes to u.pattern so it'll become bigger in size than a pointer. There's no point in sharing the same room with u.attr. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- attr.c | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/attr.c b/attr.c index 15ebaa1..48df800 100644 --- a/attr.c +++ b/attr.c @@ -119,10 +119,10 @@ struct attr_state { /* * One rule, as from a .gitattributes file. * - * If is_macro is true, then u.attr is a pointer to the git_attr being + * If is_macro is true, then attr is a pointer to the git_attr being * defined. * - * If is_macro is false, then u.pattern points at the filename pattern + * If is_macro is false, then pattern points at the filename pattern * to which the rule applies. (The memory pointed to is part of the * memory block allocated for the match_attr instance.) * @@ -131,10 +131,8 @@ struct attr_state { * listed as they appear in the file (macros unexpanded). */ struct match_attr { - union { - char *pattern; - struct git_attr *attr; - } u; + const char *pattern; + struct git_attr *attr; char is_macro; unsigned num_attr; struct attr_state state[FLEX_ARRAY]; @@ -240,11 +238,12 @@ static struct match_attr *parse_attr_line(const char *line, const char *src, sizeof(struct attr_state) * num_attr + (is_macro ? 0 : namelen + 1)); if (is_macro) - res->u.attr = git_attr_internal(name, namelen); + res->attr = git_attr_internal(name, namelen); else { - res->u.pattern = (char *)&(res->state[num_attr]); - memcpy(res->u.pattern, name, namelen); - res->u.pattern[namelen] = 0; + char *p = (char *)&(res->state[num_attr]); + memcpy(p, name, namelen); + p[namelen] = 0; + res->pattern = p; } res->is_macro = is_macro; res->num_attr = num_attr; @@ -682,7 +681,7 @@ static int fill_one(const char *what, struct match_attr *a, int rem) if (*n == ATTR__UNKNOWN) { debug_set(what, - a->is_macro ? a->u.attr->name : a->u.pattern, + a->is_macro ? a->attr->name : a->pattern, attr, v); *n = v; rem--; @@ -702,7 +701,7 @@ static int fill(const char *path, int pathlen, struct attr_stack *stk, int rem) if (a->is_macro) continue; if (path_matches(path, pathlen, - a->u.pattern, base, strlen(base))) + a->pattern, base, strlen(base))) rem = fill_one("fill", a, rem); } return rem; @@ -722,7 +721,7 @@ static int macroexpand_one(int attr_nr, int rem) struct match_attr *ma = stk->attrs[i]; if (!ma->is_macro) continue; - if (ma->u.attr->attr_nr == attr_nr) + if (ma->attr->attr_nr == attr_nr) a = ma; } -- 1.7.12.1.405.gb727dc9 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html