Hello,

On Mon, Sep 09, 2002 at 06:58:56PM +0900, nobu.nokada / softhome.net wrote:
> > PS: Please note that it leaks when exception is raised!
> 
> It may be better to add rb_gc_force_recycle(result) at places
> where you added free(buf).

	Yes, in this case String approach is better.

	Could you commit this one, if it is OK?

		Michal
		
> 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);

-- 
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Michal Rokos                         Czech Technical University, Prague
E-mail:m.rokos / sh.cvut.cz      ICQ:36118339      Jabber:majkl / jabber.cz
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-