Hi,

At Mon, 9 Sep 2002 18:15:13 +0900,
Michal Rokos wrote:
> PS: Please note that it leaks when exception is raised!

Use rb_ensure() as Guy wrote, or use String.

It may be better to add rb_gc_force_recycle(result) at places
where you added free(buf).


Index: sprintf.c =================================================================== RCS file: /cvs/ruby/src/ruby/sprintf.c,v retrieving revision 1.25 diff -u -2 -p -r1.25 sprintf.c --- sprintf.c 28 Aug 2002 08:05:23 -0000 1.25 +++ sprintf.c 9 Sep 2002 09:53:24 -0000 @@ -63,9 +63,11 @@ remove_sign_bits(str, base) #define FPREC 64 -#define CHECK(l) \ +#define CHECK(l) do {\ while (blen + (l) >= bsiz) {\ - REALLOC_N(buf, char, bsiz*2);\ bsiz*=2;\ - } + }\ + rb_str_resize(result, bsiz);\ + buf = RSTRING(result)->ptr;\ +} while (0) #define PUSH(s, l) do { \ @@ -123,5 +125,6 @@ rb_f_sprintf(argc, argv) blen = 0; bsiz = 120; - buf = ALLOC_N(char, bsiz); + result = rb_str_buf_new(bsiz); + buf = RSTRING(result)->ptr; for (; p < end; p++) { @@ -580,6 +583,5 @@ rb_f_sprintf(argc, argv) } #endif - result = rb_str_new(buf, blen); - free(buf); + rb_str_resize(result, blen); if (tainted) OBJ_TAINT(result);
-- Nobu Nakada