| Index: runtime/platform/json.cc | 
| =================================================================== | 
| --- runtime/platform/json.cc	(revision 7517) | 
| +++ runtime/platform/json.cc	(working copy) | 
| @@ -312,6 +312,23 @@ | 
| } | 
|  | 
|  | 
| +void JSONReader::GetValueChars(char* buf, intptr_t buflen) const { | 
| +  if (Type() == kNone) { | 
| +    return; | 
| +  } | 
| +  intptr_t max = buflen - 1; | 
| +  if (ValueLen() < max) { | 
| +    max = ValueLen(); | 
| +  } | 
| +  const char* val = ValueChars(); | 
| +  intptr_t i = 0; | 
| +  for (; i < max; i++) { | 
| +    buf[i] = val[i]; | 
| +  } | 
| +  buf[i] = '\0'; | 
| +} | 
| + | 
| + | 
| TextBuffer::TextBuffer(intptr_t buf_size) { | 
| ASSERT(buf_size > 0); | 
| buf_ = reinterpret_cast<char*>(malloc(buf_size)); | 
| @@ -332,20 +349,20 @@ | 
| } | 
|  | 
|  | 
| -intptr_t TextBuffer::Printf(const char* format, ...) { | 
| -  va_list args; | 
| -  va_start(args, format); | 
| +intptr_t TextBuffer::Printf(const char* format, va_list args) { | 
| +  va_list args1; | 
| +  va_copy(args1, args); | 
| intptr_t remaining = buf_size_ - msg_len_; | 
| ASSERT(remaining >= 0); | 
| -  intptr_t len = OS::VSNPrint(buf_ + msg_len_, remaining, format, args); | 
| -  va_end(args); | 
| +  intptr_t len = OS::VSNPrint(buf_ + msg_len_, remaining, format, args1); | 
| +  va_end(args1); | 
| if (len >= remaining) { | 
| const int kBufferSpareCapacity = 64;  // Somewhat arbitrary. | 
| GrowBuffer(len + kBufferSpareCapacity); | 
| remaining = buf_size_ - msg_len_; | 
| ASSERT(remaining > len); | 
| va_list args2; | 
| -    va_start(args2, format); | 
| +    va_copy(args2, args); | 
| intptr_t len2 = OS::VSNPrint(buf_ + msg_len_, remaining, format, args2); | 
| va_end(args2); | 
| ASSERT(len == len2); | 
| @@ -356,6 +373,15 @@ | 
| } | 
|  | 
|  | 
| +intptr_t TextBuffer::Printf(const char* format, ...) { | 
| +  va_list args; | 
| +  va_start(args, format); | 
| +  intptr_t len = this->Printf(format, args); | 
| +  va_end(args); | 
| +  return len; | 
| +} | 
| + | 
| + | 
| void TextBuffer::GrowBuffer(intptr_t len) { | 
| intptr_t new_size = buf_size_ + len; | 
| char* new_buf = reinterpret_cast<char*>(realloc(buf_, new_size)); | 
|  |