From ec4568d806687d76477218a6b049395c9b1e215d Mon Sep 17 00:00:00 2001 From: Joel Dice Date: Sat, 9 Jul 2011 18:00:19 -0600 Subject: [PATCH] handle strings of arbitrary size in makeByteArray --- src/machine.cpp | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/machine.cpp b/src/machine.cpp index 0128558ce9..44a131db2d 100644 --- a/src/machine.cpp +++ b/src/machine.cpp @@ -3016,16 +3016,20 @@ popResources(Thread* t) object makeByteArray(Thread* t, const char* format, va_list a) { - const int Size = 256; - char buffer[Size]; + int size = 256; + while (true) { + THREAD_RUNTIME_ARRAY(t, char, buffer, size); - int r = vm::vsnprintf(buffer, Size - 1, format, a); - expect(t, r >= 0 and r < Size - 1); - - object s = makeByteArray(t, strlen(buffer) + 1); - memcpy(&byteArrayBody(t, s, 0), buffer, byteArrayLength(t, s)); - - return s; + int r = vm::vsnprintf(RUNTIME_ARRAY_BODY(buffer), size - 1, format, a); + if (r >= 0 and r < size - 1) { + object s = makeByteArray(t, strlen(RUNTIME_ARRAY_BODY(buffer)) + 1); + memcpy(&byteArrayBody(t, s, 0), RUNTIME_ARRAY_BODY(buffer), + byteArrayLength(t, s)); + return s; + } else { + size *= 2; + } + } } object