| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/string-stream.h" | 5 #include "src/string-stream.h" |
| 6 | 6 |
| 7 #include "src/handles-inl.h" | 7 #include "src/handles-inl.h" |
| 8 #include "src/prototype.h" | 8 #include "src/prototype.h" |
| 9 | 9 |
| 10 namespace v8 { | 10 namespace v8 { |
| 11 namespace internal { | 11 namespace internal { |
| 12 | 12 |
| 13 static const int kMentionedObjectCacheMaxSize = 256; | 13 static const int kMentionedObjectCacheMaxSize = 256; |
| 14 | 14 |
| 15 char* HeapStringAllocator::allocate(unsigned bytes) { | 15 char* HeapStringAllocator::allocate(unsigned bytes) { |
| 16 space_ = NewArray<char>(bytes); | 16 space_ = NewArray<char>(bytes); |
| 17 return space_; | 17 return space_; |
| 18 } | 18 } |
| 19 | 19 |
| 20 | 20 |
| 21 bool StringStream::Put(char c) { | 21 bool StringStream::Put(char c) { |
| 22 if (full()) return false; | 22 if (full()) return false; |
| 23 ASSERT(length_ < capacity_); | 23 DCHECK(length_ < capacity_); |
| 24 // Since the trailing '\0' is not accounted for in length_ fullness is | 24 // Since the trailing '\0' is not accounted for in length_ fullness is |
| 25 // indicated by a difference of 1 between length_ and capacity_. Thus when | 25 // indicated by a difference of 1 between length_ and capacity_. Thus when |
| 26 // reaching a difference of 2 we need to grow the buffer. | 26 // reaching a difference of 2 we need to grow the buffer. |
| 27 if (length_ == capacity_ - 2) { | 27 if (length_ == capacity_ - 2) { |
| 28 unsigned new_capacity = capacity_; | 28 unsigned new_capacity = capacity_; |
| 29 char* new_buffer = allocator_->grow(&new_capacity); | 29 char* new_buffer = allocator_->grow(&new_capacity); |
| 30 if (new_capacity > capacity_) { | 30 if (new_capacity > capacity_) { |
| 31 capacity_ = new_capacity; | 31 capacity_ = new_capacity; |
| 32 buffer_ = new_buffer; | 32 buffer_ = new_buffer; |
| 33 } else { | 33 } else { |
| 34 // Reached the end of the available buffer. | 34 // Reached the end of the available buffer. |
| 35 ASSERT(capacity_ >= 5); | 35 DCHECK(capacity_ >= 5); |
| 36 length_ = capacity_ - 1; // Indicate fullness of the stream. | 36 length_ = capacity_ - 1; // Indicate fullness of the stream. |
| 37 buffer_[length_ - 4] = '.'; | 37 buffer_[length_ - 4] = '.'; |
| 38 buffer_[length_ - 3] = '.'; | 38 buffer_[length_ - 3] = '.'; |
| 39 buffer_[length_ - 2] = '.'; | 39 buffer_[length_ - 2] = '.'; |
| 40 buffer_[length_ - 1] = '\n'; | 40 buffer_[length_ - 1] = '\n'; |
| 41 buffer_[length_] = '\0'; | 41 buffer_[length_] = '\0'; |
| 42 return false; | 42 return false; |
| 43 } | 43 } |
| 44 } | 44 } |
| 45 buffer_[length_] = c; | 45 buffer_[length_] = c; |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 83 temp[format_length++] = format[offset++]; | 83 temp[format_length++] = format[offset++]; |
| 84 if (offset >= format.length()) | 84 if (offset >= format.length()) |
| 85 return; | 85 return; |
| 86 char type = format[offset]; | 86 char type = format[offset]; |
| 87 temp[format_length++] = type; | 87 temp[format_length++] = type; |
| 88 temp[format_length] = '\0'; | 88 temp[format_length] = '\0'; |
| 89 offset++; | 89 offset++; |
| 90 FmtElm current = elms[elm++]; | 90 FmtElm current = elms[elm++]; |
| 91 switch (type) { | 91 switch (type) { |
| 92 case 's': { | 92 case 's': { |
| 93 ASSERT_EQ(FmtElm::C_STR, current.type_); | 93 DCHECK_EQ(FmtElm::C_STR, current.type_); |
| 94 const char* value = current.data_.u_c_str_; | 94 const char* value = current.data_.u_c_str_; |
| 95 Add(value); | 95 Add(value); |
| 96 break; | 96 break; |
| 97 } | 97 } |
| 98 case 'w': { | 98 case 'w': { |
| 99 ASSERT_EQ(FmtElm::LC_STR, current.type_); | 99 DCHECK_EQ(FmtElm::LC_STR, current.type_); |
| 100 Vector<const uc16> value = *current.data_.u_lc_str_; | 100 Vector<const uc16> value = *current.data_.u_lc_str_; |
| 101 for (int i = 0; i < value.length(); i++) | 101 for (int i = 0; i < value.length(); i++) |
| 102 Put(static_cast<char>(value[i])); | 102 Put(static_cast<char>(value[i])); |
| 103 break; | 103 break; |
| 104 } | 104 } |
| 105 case 'o': { | 105 case 'o': { |
| 106 ASSERT_EQ(FmtElm::OBJ, current.type_); | 106 DCHECK_EQ(FmtElm::OBJ, current.type_); |
| 107 Object* obj = current.data_.u_obj_; | 107 Object* obj = current.data_.u_obj_; |
| 108 PrintObject(obj); | 108 PrintObject(obj); |
| 109 break; | 109 break; |
| 110 } | 110 } |
| 111 case 'k': { | 111 case 'k': { |
| 112 ASSERT_EQ(FmtElm::INT, current.type_); | 112 DCHECK_EQ(FmtElm::INT, current.type_); |
| 113 int value = current.data_.u_int_; | 113 int value = current.data_.u_int_; |
| 114 if (0x20 <= value && value <= 0x7F) { | 114 if (0x20 <= value && value <= 0x7F) { |
| 115 Put(value); | 115 Put(value); |
| 116 } else if (value <= 0xff) { | 116 } else if (value <= 0xff) { |
| 117 Add("\\x%02x", value); | 117 Add("\\x%02x", value); |
| 118 } else { | 118 } else { |
| 119 Add("\\u%04x", value); | 119 Add("\\u%04x", value); |
| 120 } | 120 } |
| 121 break; | 121 break; |
| 122 } | 122 } |
| (...skipping 27 matching lines...) Expand all Loading... |
| 150 Add(formatted.start()); | 150 Add(formatted.start()); |
| 151 break; | 151 break; |
| 152 } | 152 } |
| 153 default: | 153 default: |
| 154 UNREACHABLE(); | 154 UNREACHABLE(); |
| 155 break; | 155 break; |
| 156 } | 156 } |
| 157 } | 157 } |
| 158 | 158 |
| 159 // Verify that the buffer is 0-terminated | 159 // Verify that the buffer is 0-terminated |
| 160 ASSERT(buffer_[length_] == '\0'); | 160 DCHECK(buffer_[length_] == '\0'); |
| 161 } | 161 } |
| 162 | 162 |
| 163 | 163 |
| 164 void StringStream::PrintObject(Object* o) { | 164 void StringStream::PrintObject(Object* o) { |
| 165 o->ShortPrint(this); | 165 o->ShortPrint(this); |
| 166 if (o->IsString()) { | 166 if (o->IsString()) { |
| 167 if (String::cast(o)->length() <= String::kMaxShortPrintLength) { | 167 if (String::cast(o)->length() <= String::kMaxShortPrintLength) { |
| 168 return; | 168 return; |
| 169 } | 169 } |
| 170 } else if (o->IsNumber() || o->IsOddball()) { | 170 } else if (o->IsNumber() || o->IsOddball()) { |
| (...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 552 } | 552 } |
| 553 MemCopy(new_space, space_, *bytes); | 553 MemCopy(new_space, space_, *bytes); |
| 554 *bytes = new_bytes; | 554 *bytes = new_bytes; |
| 555 DeleteArray(space_); | 555 DeleteArray(space_); |
| 556 space_ = new_space; | 556 space_ = new_space; |
| 557 return new_space; | 557 return new_space; |
| 558 } | 558 } |
| 559 | 559 |
| 560 | 560 |
| 561 } } // namespace v8::internal | 561 } } // namespace v8::internal |
| OLD | NEW |