From: Paul Eggert Date: Thu, 16 Jun 2011 17:44:43 +0000 (-0700) Subject: * editfns.c: Tune. Don't use wider integers than needed. Don't use alloca. X-Git-Tag: emacs-pretest-24.0.90~104^2~538^2~2 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=21d890a4ecf97141f3c3f7e373bca6d083662a83;p=emacs.git * editfns.c: Tune. Don't use wider integers than needed. Don't use alloca. Use a bigger 'string' buffer. Rewrite to avoid 'n > 0' test. --- diff --git a/src/ChangeLog b/src/ChangeLog index d53817369c0..011f5beefe0 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,6 +1,8 @@ 2011-06-16 Paul Eggert * editfns.c (Finsert_char): Don't dump core with very negative counts. + Tune. Don't use wider integers than needed. Don't use alloca. + Use a bigger 'string' buffer. Rewrite to avoid 'n > 0' test. * insdel.c (replace_range): Fix buf overflow when insbytes < outgoing. diff --git a/src/editfns.c b/src/editfns.c index ab17eda86a9..2d736bbc7e2 100644 --- a/src/editfns.c +++ b/src/editfns.c @@ -2328,12 +2328,11 @@ The optional third arg INHERIT, if non-nil, says to inherit text properties from adjoining text, if those properties are sticky. */) (Lisp_Object character, Lisp_Object count, Lisp_Object inherit) { - register char *string; - register EMACS_INT stringlen; - register int i; + int i, stringlen; register EMACS_INT n; int c, len; unsigned char str[MAX_MULTIBYTE_LENGTH]; + char string[4000]; CHECK_CHARACTER (character); CHECK_NUMBER (count); @@ -2348,11 +2347,10 @@ from adjoining text, if those properties are sticky. */) if (BUF_BYTES_MAX / len < XINT (count)) buffer_overflow (); n = XINT (count) * len; - stringlen = min (n, 256 * len); - string = (char *) alloca (stringlen); + stringlen = min (n, sizeof string - sizeof string % len); for (i = 0; i < stringlen; i++) string[i] = str[i % len]; - while (n >= stringlen) + while (n > stringlen) { QUIT; if (!NILP (inherit)) @@ -2361,13 +2359,10 @@ from adjoining text, if those properties are sticky. */) insert (string, stringlen); n -= stringlen; } - if (n > 0) - { - if (!NILP (inherit)) - insert_and_inherit (string, n); - else - insert (string, n); - } + if (!NILP (inherit)) + insert_and_inherit (string, n); + else + insert (string, n); return Qnil; }