342 } |
342 } |
343 char* oldbuf = buffer; |
343 char* oldbuf = buffer; |
344 assert(rm == NULL || Thread::current()->current_resource_mark() == rm, |
344 assert(rm == NULL || Thread::current()->current_resource_mark() == rm, |
345 "stringStream is re-allocated with a different ResourceMark"); |
345 "stringStream is re-allocated with a different ResourceMark"); |
346 buffer = NEW_RESOURCE_ARRAY(char, end); |
346 buffer = NEW_RESOURCE_ARRAY(char, end); |
347 strncpy(buffer, oldbuf, buffer_pos); |
347 if (buffer_pos > 0) { |
|
348 memcpy(buffer, oldbuf, buffer_pos); |
|
349 } |
348 buffer_length = end; |
350 buffer_length = end; |
349 } |
351 } |
350 } |
352 } |
351 // invariant: buffer is always null-terminated |
353 // invariant: buffer is always null-terminated |
352 guarantee(buffer_pos + write_len + 1 <= buffer_length, "stringStream oob"); |
354 guarantee(buffer_pos + write_len + 1 <= buffer_length, "stringStream oob"); |
353 buffer[buffer_pos + write_len] = 0; |
355 if (write_len > 0) { |
354 strncpy(buffer + buffer_pos, s, write_len); |
356 buffer[buffer_pos + write_len] = 0; |
355 buffer_pos += write_len; |
357 memcpy(buffer + buffer_pos, s, write_len); |
|
358 buffer_pos += write_len; |
|
359 } |
356 |
360 |
357 // Note that the following does not depend on write_len. |
361 // Note that the following does not depend on write_len. |
358 // This means that position and count get updated |
362 // This means that position and count get updated |
359 // even when overflow occurs. |
363 // even when overflow occurs. |
360 update_position(s, len); |
364 update_position(s, len); |