OLD | NEW |
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2009 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 661 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
672 | 672 |
673 | 673 |
674 bool String::MakeExternal(v8::String::ExternalStringResource* resource) { | 674 bool String::MakeExternal(v8::String::ExternalStringResource* resource) { |
675 #ifdef DEBUG | 675 #ifdef DEBUG |
676 { // NOLINT (presubmit.py gets confused about if and braces) | 676 { // NOLINT (presubmit.py gets confused about if and braces) |
677 // Assert that the resource and the string are equivalent. | 677 // Assert that the resource and the string are equivalent. |
678 ASSERT(static_cast<size_t>(this->length()) == resource->length()); | 678 ASSERT(static_cast<size_t>(this->length()) == resource->length()); |
679 SmartPointer<uc16> smart_chars = this->ToWideCString(); | 679 SmartPointer<uc16> smart_chars = this->ToWideCString(); |
680 ASSERT(memcmp(*smart_chars, | 680 ASSERT(memcmp(*smart_chars, |
681 resource->data(), | 681 resource->data(), |
682 resource->length()*sizeof(**smart_chars)) == 0); | 682 resource->length() * sizeof(**smart_chars)) == 0); |
683 } | 683 } |
684 #endif // DEBUG | 684 #endif // DEBUG |
685 | 685 |
686 int size = this->Size(); // Byte size of the original string. | 686 int size = this->Size(); // Byte size of the original string. |
687 if (size < ExternalString::kSize) { | 687 if (size < ExternalString::kSize) { |
688 // The string is too small to fit an external String in its place. This can | 688 // The string is too small to fit an external String in its place. This can |
689 // only happen for zero length strings. | 689 // only happen for zero length strings. |
690 return false; | 690 return false; |
691 } | 691 } |
692 ASSERT(size >= ExternalString::kSize); | 692 ASSERT(size >= ExternalString::kSize); |
(...skipping 5604 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6297 } | 6297 } |
6298 | 6298 |
6299 uint32_t Hash() { return string_->Hash(); } | 6299 uint32_t Hash() { return string_->Hash(); } |
6300 | 6300 |
6301 Object* GetObject() { | 6301 Object* GetObject() { |
6302 // If the string is a cons string, attempt to flatten it so that | 6302 // If the string is a cons string, attempt to flatten it so that |
6303 // symbols will most often be flat strings. | 6303 // symbols will most often be flat strings. |
6304 if (StringShape(string_).IsCons()) { | 6304 if (StringShape(string_).IsCons()) { |
6305 ConsString* cons_string = ConsString::cast(string_); | 6305 ConsString* cons_string = ConsString::cast(string_); |
6306 cons_string->TryFlatten(); | 6306 cons_string->TryFlatten(); |
6307 if (cons_string->second() == Heap::empty_string()) { | 6307 if (cons_string->second()->length() == 0) { |
6308 string_ = cons_string->first(); | 6308 string_ = cons_string->first(); |
6309 } | 6309 } |
6310 } | 6310 } |
6311 // Transform string to symbol if possible. | 6311 // Transform string to symbol if possible. |
6312 Map* map = Heap::SymbolMapForString(string_); | 6312 Map* map = Heap::SymbolMapForString(string_); |
6313 if (map != NULL) { | 6313 if (map != NULL) { |
6314 string_->set_map(map); | 6314 string_->set_map(map); |
| 6315 ASSERT(string_->IsSymbol()); |
6315 return string_; | 6316 return string_; |
6316 } | 6317 } |
6317 // Otherwise allocate a new symbol. | 6318 // Otherwise allocate a new symbol. |
6318 StringInputBuffer buffer(string_); | 6319 StringInputBuffer buffer(string_); |
6319 return Heap::AllocateInternalSymbol(&buffer, | 6320 return Heap::AllocateInternalSymbol(&buffer, |
6320 string_->length(), | 6321 string_->length(), |
6321 string_->length_field()); | 6322 string_->length_field()); |
6322 } | 6323 } |
6323 | 6324 |
6324 static uint32_t StringHash(Object* obj) { | 6325 static uint32_t StringHash(Object* obj) { |
(...skipping 1092 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7417 // No break point. | 7418 // No break point. |
7418 if (break_point_objects()->IsUndefined()) return 0; | 7419 if (break_point_objects()->IsUndefined()) return 0; |
7419 // Single beak point. | 7420 // Single beak point. |
7420 if (!break_point_objects()->IsFixedArray()) return 1; | 7421 if (!break_point_objects()->IsFixedArray()) return 1; |
7421 // Multiple break points. | 7422 // Multiple break points. |
7422 return FixedArray::cast(break_point_objects())->length(); | 7423 return FixedArray::cast(break_point_objects())->length(); |
7423 } | 7424 } |
7424 | 7425 |
7425 | 7426 |
7426 } } // namespace v8::internal | 7427 } } // namespace v8::internal |
OLD | NEW |