lib/standard/string: Fixed leaking Int.to_s method
authorLucas Bajolet <r4pass@hotmail.com>
Mon, 2 Feb 2015 18:16:44 +0000 (13:16 -0500)
committerLucas Bajolet <r4pass@hotmail.com>
Thu, 5 Feb 2015 16:08:57 +0000 (11:08 -0500)
Signed-off-by: Lucas Bajolet <r4pass@hotmail.com>

lib/standard/string.nit
lib/standard/string_nit.c
lib/standard/string_nit.h
src/interpreter/naive_interpreter.nit

index 2c46179..2488f2e 100644 (file)
@@ -1911,15 +1911,22 @@ redef class Int
                end
        end
 
+       # C function to calculate the length of the `NativeString` to receive `self`
+       private fun int_to_s_len: Int is extern "native_int_length_str"
+
        # C function to convert an nit Int to a NativeString (char*)
-       private fun native_int_to_s: NativeString is extern "native_int_to_s"
+       private fun native_int_to_s(nstr: NativeString, strlen: Int) is extern "native_int_to_s"
 
        # return displayable int in base 10 and signed
        #
        #     assert 1.to_s            == "1"
        #     assert (-123).to_s       == "-123"
        redef fun to_s do
-               return native_int_to_s.to_s
+               var nslen = int_to_s_len
+               var ns = new NativeString(nslen + 1)
+               ns[nslen] = '\0'
+               native_int_to_s(ns, nslen + 1)
+               return ns.to_s_with_length(nslen)
        end
 
        # return displayable int in hexadecimal
index 1a11e99..686d6be 100644 (file)
 
 #include "string_nit.h"
 
+// Returns the length of `recv` as a `char*` (excluding the null character)
+long native_int_length_str(long recv){
+       return snprintf(NULL, 0, "%ld", recv);
+}
+
 // Integer to NativeString method
-char* native_int_to_s(long recv){
-       int len = snprintf(NULL, 0, "%ld", recv);
-       char* str = malloc(len+1);
-       sprintf(str, "%ld", recv);
-       return str;
+void native_int_to_s(long recv, char* str, long buflen){
+       snprintf(str, buflen, "%ld", recv);
 }
index 311041d..f33580f 100644 (file)
@@ -13,6 +13,7 @@
  * another product.
  */
 
-char* native_int_to_s(long recv);
+long native_int_length_str(long recv);
+void native_int_to_s(long recv, char* str, long buflen);
 
 #endif
index e297f9c..aa95eb4 100644 (file)
@@ -857,8 +857,15 @@ redef class AMethPropdef
                                return v.int_instance(args[0].to_i.bin_xor(args[1].to_i))
                        else if pname == "bin_not" then
                                return v.int_instance(args[0].to_i.bin_not)
+                       else if pname == "int_to_s_len" then
+                               return v.int_instance(recvval.to_s.length)
                        else if pname == "native_int_to_s" then
-                               return v.native_string_instance(recvval.to_s)
+                               var s = recvval.to_s
+                               var srecv = args[1].val.as(Buffer)
+                               srecv.clear
+                               srecv.append(s)
+                               srecv.add('\0')
+                               return null
                        else if pname == "strerror_ext" then
                                return v.native_string_instance(recvval.strerror)
                        end