From: Lucas Bajolet Date: Mon, 2 Feb 2015 18:16:44 +0000 (-0500) Subject: lib/standard/string: Fixed leaking Int.to_s method X-Git-Tag: v0.7.2~29^2~3 X-Git-Url: http://nitlanguage.org lib/standard/string: Fixed leaking Int.to_s method Signed-off-by: Lucas Bajolet --- diff --git a/lib/standard/string.nit b/lib/standard/string.nit index 2c46179..2488f2e 100644 --- a/lib/standard/string.nit +++ b/lib/standard/string.nit @@ -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 diff --git a/lib/standard/string_nit.c b/lib/standard/string_nit.c index 1a11e99..686d6be 100644 --- a/lib/standard/string_nit.c +++ b/lib/standard/string_nit.c @@ -11,10 +11,12 @@ #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); } diff --git a/lib/standard/string_nit.h b/lib/standard/string_nit.h index 311041d..f33580f 100644 --- a/lib/standard/string_nit.h +++ b/lib/standard/string_nit.h @@ -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 diff --git a/src/interpreter/naive_interpreter.nit b/src/interpreter/naive_interpreter.nit index e297f9c..aa95eb4 100644 --- a/src/interpreter/naive_interpreter.nit +++ b/src/interpreter/naive_interpreter.nit @@ -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