321 buffer_pos = 0;
322 buffer_fixed = true;
323 }
324
325 void stringStream::write(const char* s, size_t len) {
326 size_t write_len = len; // number of non-null bytes to write
327 size_t end = buffer_pos + len + 1; // position after write and final '\0'
328 if (end > buffer_length) {
329 if (buffer_fixed) {
330 // if buffer cannot resize, silently truncate
331 end = buffer_length;
332 write_len = end - buffer_pos - 1; // leave room for the final '\0'
333 } else {
334 // For small overruns, double the buffer. For larger ones,
335 // increase to the requested size.
336 if (end < buffer_length * 2) {
337 end = buffer_length * 2;
338 }
339 char* oldbuf = buffer;
340 assert(rm == NULL || Thread::current()->current_resource_mark() == rm,
341 "stringStream is re-allocated with a different ResourceMark");
342 buffer = NEW_RESOURCE_ARRAY(char, end);
343 if (buffer_pos > 0) {
344 memcpy(buffer, oldbuf, buffer_pos);
345 }
346 buffer_length = end;
347 }
348 }
349 // invariant: buffer is always null-terminated
350 guarantee(buffer_pos + write_len + 1 <= buffer_length, "stringStream oob");
351 if (write_len > 0) {
352 buffer[buffer_pos + write_len] = 0;
353 memcpy(buffer + buffer_pos, s, write_len);
354 buffer_pos += write_len;
355 }
356
357 // Note that the following does not depend on write_len.
358 // This means that position and count get updated
359 // even when overflow occurs.
360 update_position(s, len);
361 }
|
321 buffer_pos = 0;
322 buffer_fixed = true;
323 }
324
325 void stringStream::write(const char* s, size_t len) {
326 size_t write_len = len; // number of non-null bytes to write
327 size_t end = buffer_pos + len + 1; // position after write and final '\0'
328 if (end > buffer_length) {
329 if (buffer_fixed) {
330 // if buffer cannot resize, silently truncate
331 end = buffer_length;
332 write_len = end - buffer_pos - 1; // leave room for the final '\0'
333 } else {
334 // For small overruns, double the buffer. For larger ones,
335 // increase to the requested size.
336 if (end < buffer_length * 2) {
337 end = buffer_length * 2;
338 }
339 char* oldbuf = buffer;
340 assert(rm == NULL || Thread::current()->current_resource_mark() == rm,
341 "StringStream is re-allocated with a different ResourceMark. Current: "
342 PTR_FORMAT " original: " PTR_FORMAT,
343 p2i(Thread::current()->current_resource_mark()), p2i(rm));
344 buffer = NEW_RESOURCE_ARRAY(char, end);
345 if (buffer_pos > 0) {
346 memcpy(buffer, oldbuf, buffer_pos);
347 }
348 buffer_length = end;
349 }
350 }
351 // invariant: buffer is always null-terminated
352 guarantee(buffer_pos + write_len + 1 <= buffer_length, "stringStream oob");
353 if (write_len > 0) {
354 buffer[buffer_pos + write_len] = 0;
355 memcpy(buffer + buffer_pos, s, write_len);
356 buffer_pos += write_len;
357 }
358
359 // Note that the following does not depend on write_len.
360 // This means that position and count get updated
361 // even when overflow occurs.
362 update_position(s, len);
363 }
|