OLD | NEW |
---|---|
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 5501 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5512 } | 5512 } |
5513 #endif | 5513 #endif |
5514 | 5514 |
5515 | 5515 |
5516 bool String::LooksValid() { | 5516 bool String::LooksValid() { |
5517 if (!Isolate::Current()->heap()->Contains(this)) return false; | 5517 if (!Isolate::Current()->heap()->Contains(this)) return false; |
5518 return true; | 5518 return true; |
5519 } | 5519 } |
5520 | 5520 |
5521 | 5521 |
5522 int String::Utf8Length() { | |
5523 if (IsAsciiRepresentation()) return length(); | |
5524 // Attempt to flatten before accessing the string. It probably | |
5525 // doesn't make Utf8Length faster, but it is very likely that | |
5526 // the string will be accessed later (for example by WriteUtf8) | |
5527 // so it's still a good idea. | |
5528 Heap* heap = GetHeap(); | |
5529 TryFlatten(); | |
5530 Access<StringInputBuffer> buffer( | |
5531 heap->isolate()->objects_string_input_buffer()); | |
5532 buffer->Reset(0, this); | |
5533 int result = 0; | |
5534 while (buffer->has_more()) | |
5535 result += unibrow::Utf8::Length(buffer->GetNext()); | |
5536 return result; | |
5537 } | |
5538 | |
5539 | |
5540 String::FlatContent String::GetFlatContent() { | 5522 String::FlatContent String::GetFlatContent() { |
5541 int length = this->length(); | 5523 int length = this->length(); |
5542 StringShape shape(this); | 5524 StringShape shape(this); |
5543 String* string = this; | 5525 String* string = this; |
5544 int offset = 0; | 5526 int offset = 0; |
5545 if (shape.representation_tag() == kConsStringTag) { | 5527 if (shape.representation_tag() == kConsStringTag) { |
5546 ConsString* cons = ConsString::cast(string); | 5528 ConsString* cons = ConsString::cast(string); |
5547 if (cons->second()->length() != 0) { | 5529 if (cons->second()->length() != 0) { |
5548 return FlatContent(); | 5530 return FlatContent(); |
5549 } | 5531 } |
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5953 max_chars); | 5935 max_chars); |
5954 default: | 5936 default: |
5955 break; | 5937 break; |
5956 } | 5938 } |
5957 | 5939 |
5958 UNREACHABLE(); | 5940 UNREACHABLE(); |
5959 return 0; | 5941 return 0; |
5960 } | 5942 } |
5961 | 5943 |
5962 | 5944 |
5945 // This method determines the type of string involved and then gets the UTF8 | |
5946 // length of the string. It doesn't flatten the string and has log(n) recursion | |
5947 // for a string of length n. | |
5948 int String::Utf8Length(String* input, int from, int to) { | |
5949 if (from == to) return 0; | |
5950 int total = 0; | |
5951 while (true) { | |
5952 if (input->IsAsciiRepresentation()) return total + to - from; | |
Yang
2011/10/17 09:40:51
Again, IsAsciiRepresentation() is not reliable.
Erik Corry
2011/10/17 12:39:09
I think in this case it is exactly what I need. I
| |
5953 switch (StringShape(input).representation_tag()) { | |
5954 case kConsStringTag: { | |
5955 ConsString* str = ConsString::cast(input); | |
5956 String* first = str->first(); | |
5957 String* second = str->second(); | |
5958 int first_length = first->length(); | |
5959 if (first_length - from < to - first_length) { | |
5960 if (first_length > from) { | |
5961 // Left hand side is shorter. | |
5962 total += Utf8Length(first, from, first_length); | |
5963 input = second; | |
5964 from = 0; | |
5965 to -= first_length; | |
5966 } else { | |
5967 // We only need the right hand side. | |
5968 input = second; | |
5969 from -= first_length; | |
5970 to -= first_length; | |
5971 } | |
5972 } else { | |
5973 if (first_length > to) { | |
5974 // Right hand side is shorter. | |
5975 total += Utf8Length(second, 0, to - first_length); | |
5976 input = first; | |
5977 to = first_length; | |
5978 } else { | |
5979 // We only need the left hand side. | |
5980 input = first; | |
5981 } | |
5982 } | |
5983 continue; | |
5984 } | |
5985 case kExternalStringTag: | |
5986 case kSeqStringTag: { | |
5987 Vector<const uc16> vector = input->GetFlatContent().ToUC16Vector(); | |
5988 const uc16* p = vector.start(); | |
5989 for (int i = from; i < to; i++) { | |
5990 total += unibrow::Utf8::Length(p[i]); | |
5991 } | |
5992 return total; | |
5993 } | |
5994 case kSlicedStringTag: { | |
5995 SlicedString* str = SlicedString::cast(input); | |
5996 int offset = str->offset(); | |
5997 input = str->parent(); | |
5998 from += offset; | |
5999 to += offset; | |
6000 continue; | |
6001 } | |
6002 default: | |
6003 break; | |
6004 } | |
6005 UNREACHABLE(); | |
6006 return 0; | |
6007 } | |
6008 return 0; | |
6009 } | |
6010 | |
6011 | |
5963 void Relocatable::PostGarbageCollectionProcessing() { | 6012 void Relocatable::PostGarbageCollectionProcessing() { |
5964 Isolate* isolate = Isolate::Current(); | 6013 Isolate* isolate = Isolate::Current(); |
5965 Relocatable* current = isolate->relocatable_top(); | 6014 Relocatable* current = isolate->relocatable_top(); |
5966 while (current != NULL) { | 6015 while (current != NULL) { |
5967 current->PostGarbageCollection(); | 6016 current->PostGarbageCollection(); |
5968 current = current->prev_; | 6017 current = current->prev_; |
5969 } | 6018 } |
5970 } | 6019 } |
5971 | 6020 |
5972 | 6021 |
(...skipping 6281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
12254 if (break_point_objects()->IsUndefined()) return 0; | 12303 if (break_point_objects()->IsUndefined()) return 0; |
12255 // Single break point. | 12304 // Single break point. |
12256 if (!break_point_objects()->IsFixedArray()) return 1; | 12305 if (!break_point_objects()->IsFixedArray()) return 1; |
12257 // Multiple break points. | 12306 // Multiple break points. |
12258 return FixedArray::cast(break_point_objects())->length(); | 12307 return FixedArray::cast(break_point_objects())->length(); |
12259 } | 12308 } |
12260 #endif // ENABLE_DEBUGGER_SUPPORT | 12309 #endif // ENABLE_DEBUGGER_SUPPORT |
12261 | 12310 |
12262 | 12311 |
12263 } } // namespace v8::internal | 12312 } } // namespace v8::internal |
OLD | NEW |