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: Pierre Habouzit <madcoder@debian.org> Acked-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
a08f23ab3e
commit
8b6087fb25
35
commit.c
35
commit.c
@ -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 @@ needquote:
|
|||||||
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
|
|||||||
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,
|
|||||||
* 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,
|
|||||||
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,
|
|||||||
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);
|
||||||
|
Reference in New Issue
Block a user