提交 8b6087fb 编写于 作者: P Pierre Habouzit 提交者: Junio C Hamano

Remove preemptive allocations.

Careful profiling shows that we spend more time guessing what pattern
allocation will have, whereas we can delay it only at the point where
add_rfc2047 will be used and don't allocate huge memory area for the many
cases where it's not.
Signed-off-by: NPierre Habouzit <madcoder@debian.org>
Acked-by: NLinus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: NJunio C Hamano <gitster@pobox.com>
上级 a08f23ab
...@@ -501,6 +501,7 @@ static void add_rfc2047(struct strbuf *sb, const char *line, int len, ...@@ -501,6 +501,7 @@ static void add_rfc2047(struct strbuf *sb, const char *line, int len,
return; return;
needquote: needquote:
strbuf_grow(sb, len * 3 + strlen(encoding) + 100);
strbuf_addf(sb, "=?%s?q?", encoding); strbuf_addf(sb, "=?%s?q?", encoding);
for (i = last = 0; i < len; i++) { for (i = last = 0; i < len; i++) {
unsigned ch = line[i] & 0xFF; unsigned ch = line[i] & 0xFF;
...@@ -520,14 +521,6 @@ static void add_rfc2047(struct strbuf *sb, const char *line, int len, ...@@ -520,14 +521,6 @@ static void add_rfc2047(struct strbuf *sb, const char *line, int len,
strbuf_addstr(sb, "?="); strbuf_addstr(sb, "?=");
} }
static unsigned long bound_rfc2047(unsigned long len, const char *encoding)
{
/* upper bound of q encoded string of length 'len' */
unsigned long elen = strlen(encoding);
return len * 3 + elen + 100;
}
static void add_user_info(const char *what, enum cmit_fmt fmt, struct strbuf *sb, static void add_user_info(const char *what, enum cmit_fmt fmt, struct strbuf *sb,
const char *line, enum date_mode dmode, const char *line, enum date_mode dmode,
const char *encoding) const char *encoding)
...@@ -560,8 +553,7 @@ static void add_user_info(const char *what, enum cmit_fmt fmt, struct strbuf *sb ...@@ -560,8 +553,7 @@ static void add_user_info(const char *what, enum cmit_fmt fmt, struct strbuf *sb
add_rfc2047(sb, line, display_name_length, encoding); add_rfc2047(sb, line, display_name_length, encoding);
strbuf_add(sb, name_tail, namelen - display_name_length); strbuf_add(sb, name_tail, namelen - display_name_length);
strbuf_addch(sb, '\n'); strbuf_addch(sb, '\n');
} } else {
else {
strbuf_addf(sb, "%s: %.*s%.*s\n", what, strbuf_addf(sb, "%s: %.*s%.*s\n", what,
(fmt == CMIT_FMT_FULLER) ? 4 : 0, (fmt == CMIT_FMT_FULLER) ? 4 : 0,
filler, namelen, line); filler, namelen, line);
...@@ -955,19 +947,12 @@ static void pp_header(enum cmit_fmt fmt, ...@@ -955,19 +947,12 @@ static void pp_header(enum cmit_fmt fmt,
* FULLER shows both authors and dates. * FULLER shows both authors and dates.
*/ */
if (!memcmp(line, "author ", 7)) { if (!memcmp(line, "author ", 7)) {
unsigned long len = linelen; strbuf_grow(sb, linelen + 80);
if (fmt == CMIT_FMT_EMAIL)
len = bound_rfc2047(linelen, encoding);
strbuf_grow(sb, len + 80);
add_user_info("Author", fmt, sb, line + 7, dmode, encoding); add_user_info("Author", fmt, sb, line + 7, dmode, encoding);
} }
if (!memcmp(line, "committer ", 10) && if (!memcmp(line, "committer ", 10) &&
(fmt == CMIT_FMT_FULL || fmt == CMIT_FMT_FULLER)) { (fmt == CMIT_FMT_FULL || fmt == CMIT_FMT_FULLER)) {
unsigned long len = linelen; strbuf_grow(sb, linelen + 80);
if (fmt == CMIT_FMT_EMAIL)
len = bound_rfc2047(linelen, encoding);
strbuf_grow(sb, len + 80);
add_user_info("Commit", fmt, sb, line + 10, dmode, encoding); add_user_info("Commit", fmt, sb, line + 10, dmode, encoding);
} }
} }
...@@ -982,7 +967,6 @@ static void pp_title_line(enum cmit_fmt fmt, ...@@ -982,7 +967,6 @@ static void pp_title_line(enum cmit_fmt fmt,
int plain_non_ascii) int plain_non_ascii)
{ {
struct strbuf title; struct strbuf title;
unsigned long len;
strbuf_init(&title, 80); strbuf_init(&title, 80);
...@@ -1004,16 +988,7 @@ static void pp_title_line(enum cmit_fmt fmt, ...@@ -1004,16 +988,7 @@ static void pp_title_line(enum cmit_fmt fmt,
strbuf_add(&title, line, linelen); strbuf_add(&title, line, linelen);
} }
/* Enough slop for the MIME header and rfc2047 */ strbuf_grow(sb, title.len + 1024);
len = bound_rfc2047(title.len, encoding) + 1000;
if (subject)
len += strlen(subject);
if (after_subject)
len += strlen(after_subject);
if (encoding)
len += strlen(encoding);
strbuf_grow(sb, title.len + len);
if (subject) { if (subject) {
strbuf_addstr(sb, subject); strbuf_addstr(sb, subject);
add_rfc2047(sb, title.buf, title.len, encoding); add_rfc2047(sb, title.buf, title.len, encoding);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册