| OLD | NEW |
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 86 switch (c) { | 86 switch (c) { |
| 87 case '0': case '1': case '2': case '3': case '4': case '5': | 87 case '0': case '1': case '2': case '3': case '4': case '5': |
| 88 case '6': case '7': case '8': case '9': case '.': case '-': | 88 case '6': case '7': case '8': case '9': case '.': case '-': |
| 89 return true; | 89 return true; |
| 90 default: | 90 default: |
| 91 return false; | 91 return false; |
| 92 } | 92 } |
| 93 } | 93 } |
| 94 | 94 |
| 95 | 95 |
| 96 void StringStream::Add(const char* format, Vector<FmtElm> elms) { | 96 void StringStream::Add(Vector<const char> format, Vector<FmtElm> elms) { |
| 97 // If we already ran out of space then return immediately. | 97 // If we already ran out of space then return immediately. |
| 98 if (space() == 0) | 98 if (space() == 0) |
| 99 return; | 99 return; |
| 100 int offset = 0; | 100 int offset = 0; |
| 101 int elm = 0; | 101 int elm = 0; |
| 102 while (format[offset] != '\0') { | 102 while (offset < format.length()) { |
| 103 if (format[offset] != '%' || elm == elms.length()) { | 103 if (format[offset] != '%' || elm == elms.length()) { |
| 104 Put(format[offset]); | 104 Put(format[offset]); |
| 105 offset++; | 105 offset++; |
| 106 continue; | 106 continue; |
| 107 } | 107 } |
| 108 // Read this formatting directive into a temporary buffer | 108 // Read this formatting directive into a temporary buffer |
| 109 EmbeddedVector<char, 24> temp; | 109 EmbeddedVector<char, 24> temp; |
| 110 int format_length = 0; | 110 int format_length = 0; |
| 111 // Skip over the whole control character sequence until the | 111 // Skip over the whole control character sequence until the |
| 112 // format element type | 112 // format element type |
| 113 temp[format_length++] = format[offset++]; | 113 temp[format_length++] = format[offset++]; |
| 114 // '\0' is not a control character so we don't have to | 114 while (offset < format.length() && IsControlChar(format[offset])) |
| 115 // explicitly check for the end of the string | |
| 116 while (IsControlChar(format[offset])) | |
| 117 temp[format_length++] = format[offset++]; | 115 temp[format_length++] = format[offset++]; |
| 116 if (offset >= format.length()) |
| 117 return; |
| 118 char type = format[offset]; | 118 char type = format[offset]; |
| 119 if (type == '\0') return; | |
| 120 temp[format_length++] = type; | 119 temp[format_length++] = type; |
| 121 temp[format_length] = '\0'; | 120 temp[format_length] = '\0'; |
| 122 offset++; | 121 offset++; |
| 123 FmtElm current = elms[elm++]; | 122 FmtElm current = elms[elm++]; |
| 124 switch (type) { | 123 switch (type) { |
| 125 case 's': { | 124 case 's': { |
| 126 ASSERT_EQ(FmtElm::C_STR, current.type_); | 125 ASSERT_EQ(FmtElm::C_STR, current.type_); |
| 127 const char* value = current.data_.u_c_str_; | 126 const char* value = current.data_.u_c_str_; |
| 128 Add(value); | 127 Add(value); |
| 129 break; | 128 break; |
| 130 } | 129 } |
| 130 case 'w': { |
| 131 ASSERT_EQ(FmtElm::LC_STR, current.type_); |
| 132 Vector<const uc16> value = *current.data_.u_lc_str_; |
| 133 for (int i = 0; i < value.length(); i++) |
| 134 Put(static_cast<char>(value[i])); |
| 135 break; |
| 136 } |
| 131 case 'o': { | 137 case 'o': { |
| 132 ASSERT_EQ(FmtElm::OBJ, current.type_); | 138 ASSERT_EQ(FmtElm::OBJ, current.type_); |
| 133 Object* obj = current.data_.u_obj_; | 139 Object* obj = current.data_.u_obj_; |
| 134 PrintObject(obj); | 140 PrintObject(obj); |
| 135 break; | 141 break; |
| 136 } | 142 } |
| 137 case 'i': case 'd': case 'u': case 'x': case 'c': case 'p': { | 143 case 'k': { |
| 144 ASSERT_EQ(FmtElm::INT, current.type_); |
| 145 int value = current.data_.u_int_; |
| 146 if (0x20 <= value && value <= 0x7F) { |
| 147 Put(value); |
| 148 } else if (value <= 0xff) { |
| 149 Add("\\x%02x", value); |
| 150 } else { |
| 151 Add("\\u%04x", value); |
| 152 } |
| 153 break; |
| 154 } |
| 155 case 'i': case 'd': case 'u': case 'x': case 'c': case 'p': case 'X': { |
| 138 int value = current.data_.u_int_; | 156 int value = current.data_.u_int_; |
| 139 EmbeddedVector<char, 24> formatted; | 157 EmbeddedVector<char, 24> formatted; |
| 140 OS::SNPrintF(formatted, temp.start(), value); | 158 int length = OS::SNPrintF(formatted, temp.start(), value); |
| 141 Add(formatted.start()); | 159 Add(Vector<const char>(formatted.start(), length)); |
| 142 break; | 160 break; |
| 143 } | 161 } |
| 144 case 'f': case 'g': case 'G': case 'e': case 'E': { | 162 case 'f': case 'g': case 'G': case 'e': case 'E': { |
| 145 double value = current.data_.u_double_; | 163 double value = current.data_.u_double_; |
| 146 EmbeddedVector<char, 28> formatted; | 164 EmbeddedVector<char, 28> formatted; |
| 147 OS::SNPrintF(formatted, temp.start(), value); | 165 OS::SNPrintF(formatted, temp.start(), value); |
| 148 Add(formatted.start()); | 166 Add(formatted.start()); |
| 149 break; | 167 break; |
| 150 } | 168 } |
| 151 default: | 169 default: |
| 152 UNREACHABLE(); | 170 UNREACHABLE(); |
| 153 break; | 171 break; |
| 154 } | 172 } |
| 155 } | 173 } |
| 156 | 174 |
| 157 // Verify that the buffer is 0-terminated and doesn't contain any | 175 // Verify that the buffer is 0-terminated |
| 158 // other 0-characters. | |
| 159 ASSERT(buffer_[length_] == '\0'); | 176 ASSERT(buffer_[length_] == '\0'); |
| 160 ASSERT(strlen(buffer_) == length_); | |
| 161 } | 177 } |
| 162 | 178 |
| 163 | 179 |
| 164 void StringStream::PrintObject(Object* o) { | 180 void StringStream::PrintObject(Object* o) { |
| 165 o->ShortPrint(this); | 181 o->ShortPrint(this); |
| 166 if (o->IsString()) { | 182 if (o->IsString()) { |
| 167 if (String::cast(o)->length() <= String::kMaxMediumStringSize) { | 183 if (String::cast(o)->length() <= String::kMaxMediumStringSize) { |
| 168 return; | 184 return; |
| 169 } | 185 } |
| 170 } else if (o->IsNumber() || o->IsOddball()) { | 186 } else if (o->IsNumber() || o->IsOddball()) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 181 Add("#%d#", debug_object_cache->length()); | 197 Add("#%d#", debug_object_cache->length()); |
| 182 debug_object_cache->Add(HeapObject::cast(o)); | 198 debug_object_cache->Add(HeapObject::cast(o)); |
| 183 } else { | 199 } else { |
| 184 Add("@%p", o); | 200 Add("@%p", o); |
| 185 } | 201 } |
| 186 } | 202 } |
| 187 } | 203 } |
| 188 | 204 |
| 189 | 205 |
| 190 void StringStream::Add(const char* format) { | 206 void StringStream::Add(const char* format) { |
| 207 Add(CStrVector(format)); |
| 208 } |
| 209 |
| 210 |
| 211 void StringStream::Add(Vector<const char> format) { |
| 191 Add(format, Vector<FmtElm>::empty()); | 212 Add(format, Vector<FmtElm>::empty()); |
| 192 } | 213 } |
| 193 | 214 |
| 194 | 215 |
| 195 void StringStream::Add(const char* format, FmtElm arg0) { | 216 void StringStream::Add(const char* format, FmtElm arg0) { |
| 196 const char argc = 1; | 217 const char argc = 1; |
| 197 FmtElm argv[argc] = { arg0 }; | 218 FmtElm argv[argc] = { arg0 }; |
| 198 Add(format, Vector<FmtElm>(argv, argc)); | 219 Add(CStrVector(format), Vector<FmtElm>(argv, argc)); |
| 199 } | 220 } |
| 200 | 221 |
| 201 | 222 |
| 202 void StringStream::Add(const char* format, FmtElm arg0, FmtElm arg1) { | 223 void StringStream::Add(const char* format, FmtElm arg0, FmtElm arg1) { |
| 203 const char argc = 2; | 224 const char argc = 2; |
| 204 FmtElm argv[argc] = { arg0, arg1 }; | 225 FmtElm argv[argc] = { arg0, arg1 }; |
| 205 Add(format, Vector<FmtElm>(argv, argc)); | 226 Add(CStrVector(format), Vector<FmtElm>(argv, argc)); |
| 206 } | 227 } |
| 207 | 228 |
| 208 | 229 |
| 209 void StringStream::Add(const char* format, FmtElm arg0, FmtElm arg1, | 230 void StringStream::Add(const char* format, FmtElm arg0, FmtElm arg1, |
| 210 FmtElm arg2) { | 231 FmtElm arg2) { |
| 211 const char argc = 3; | 232 const char argc = 3; |
| 212 FmtElm argv[argc] = { arg0, arg1, arg2 }; | 233 FmtElm argv[argc] = { arg0, arg1, arg2 }; |
| 213 Add(format, Vector<FmtElm>(argv, argc)); | 234 Add(CStrVector(format), Vector<FmtElm>(argv, argc)); |
| 235 } |
| 236 |
| 237 |
| 238 void StringStream::Add(const char* format, FmtElm arg0, FmtElm arg1, |
| 239 FmtElm arg2, FmtElm arg3) { |
| 240 const char argc = 4; |
| 241 FmtElm argv[argc] = { arg0, arg1, arg2, arg3 }; |
| 242 Add(CStrVector(format), Vector<FmtElm>(argv, argc)); |
| 214 } | 243 } |
| 215 | 244 |
| 216 | 245 |
| 217 SmartPointer<const char> StringStream::ToCString() { | 246 SmartPointer<const char> StringStream::ToCString() { |
| 218 char* str = NewArray<char>(length_ + 1); | 247 char* str = NewArray<char>(length_ + 1); |
| 219 memcpy(str, buffer_, length_); | 248 memcpy(str, buffer_, length_); |
| 220 str[length_] = '\0'; | 249 str[length_] = '\0'; |
| 221 return SmartPointer<const char>(str); | 250 return SmartPointer<const char>(str); |
| 222 } | 251 } |
| 223 | 252 |
| (...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 539 unsigned new_bytes = *bytes * 2; | 568 unsigned new_bytes = *bytes * 2; |
| 540 if (new_bytes > size_) { | 569 if (new_bytes > size_) { |
| 541 new_bytes = size_; | 570 new_bytes = size_; |
| 542 } | 571 } |
| 543 *bytes = new_bytes; | 572 *bytes = new_bytes; |
| 544 return space_; | 573 return space_; |
| 545 } | 574 } |
| 546 | 575 |
| 547 | 576 |
| 548 } } // namespace v8::internal | 577 } } // namespace v8::internal |
| OLD | NEW |