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 655 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
666 return true; // An Ape, an ABCBook. | 666 return true; // An Ape, an ABCBook. |
667 } else if ((c1 == 0 || (c1 >= 'A' && c1 <= 'Z')) && | 667 } else if ((c1 == 0 || (c1 >= 'A' && c1 <= 'Z')) && |
668 (c0 == 'F' || c0 == 'H' || c0 == 'M' || c0 == 'N' || c0 == 'R' || | 668 (c0 == 'F' || c0 == 'H' || c0 == 'M' || c0 == 'N' || c0 == 'R' || |
669 c0 == 'S' || c0 == 'X')) { | 669 c0 == 'S' || c0 == 'X')) { |
670 return true; // An MP3File, an M. | 670 return true; // An MP3File, an M. |
671 } | 671 } |
672 return false; | 672 return false; |
673 } | 673 } |
674 | 674 |
675 | 675 |
676 Object* String::TryFlatten() { | 676 Object* String::SlowTryFlatten(PretenureFlag pretenure) { |
677 #ifdef DEBUG | 677 #ifdef DEBUG |
678 // Do not attempt to flatten in debug mode when allocation is not | 678 // Do not attempt to flatten in debug mode when allocation is not |
679 // allowed. This is to avoid an assertion failure when allocating. | 679 // allowed. This is to avoid an assertion failure when allocating. |
680 // Flattening strings is the only case where we always allow | 680 // Flattening strings is the only case where we always allow |
681 // allocation because no GC is performed if the allocation fails. | 681 // allocation because no GC is performed if the allocation fails. |
682 if (!Heap::IsAllocationAllowed()) return this; | 682 if (!Heap::IsAllocationAllowed()) return this; |
683 #endif | 683 #endif |
684 | 684 |
685 switch (StringShape(this).representation_tag()) { | 685 switch (StringShape(this).representation_tag()) { |
686 case kConsStringTag: { | 686 case kConsStringTag: { |
687 ConsString* cs = ConsString::cast(this); | 687 ConsString* cs = ConsString::cast(this); |
688 if (cs->second()->length() == 0) { | 688 if (cs->second()->length() == 0) { |
689 return this; | 689 return this; |
690 } | 690 } |
691 // There's little point in putting the flat string in new space if the | 691 // There's little point in putting the flat string in new space if the |
692 // cons string is in old space. It can never get GCed until there is | 692 // cons string is in old space. It can never get GCed until there is |
693 // an old space GC. | 693 // an old space GC. |
694 PretenureFlag tenure = Heap::InNewSpace(this) ? NOT_TENURED : TENURED; | 694 PretenureFlag tenure = Heap::InNewSpace(this) ? pretenure : TENURED; |
695 int len = length(); | 695 int len = length(); |
696 Object* object; | 696 Object* object; |
697 String* result; | 697 String* result; |
698 if (IsAsciiRepresentation()) { | 698 if (IsAsciiRepresentation()) { |
699 object = Heap::AllocateRawAsciiString(len, tenure); | 699 object = Heap::AllocateRawAsciiString(len, tenure); |
700 if (object->IsFailure()) return object; | 700 if (object->IsFailure()) return object; |
701 result = String::cast(object); | 701 result = String::cast(object); |
702 String* first = cs->first(); | 702 String* first = cs->first(); |
703 int first_length = first->length(); | 703 int first_length = first->length(); |
704 char* dest = SeqAsciiString::cast(result)->GetChars(); | 704 char* dest = SeqAsciiString::cast(result)->GetChars(); |
(...skipping 2056 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2761 AssertNoContextChange ncc; | 2761 AssertNoContextChange ncc; |
2762 | 2762 |
2763 // Check access rights if needed. | 2763 // Check access rights if needed. |
2764 if (IsAccessCheckNeeded() && | 2764 if (IsAccessCheckNeeded() && |
2765 !Top::MayNamedAccess(this, name, v8::ACCESS_SET)) { | 2765 !Top::MayNamedAccess(this, name, v8::ACCESS_SET)) { |
2766 Top::ReportFailedAccessCheck(this, v8::ACCESS_SET); | 2766 Top::ReportFailedAccessCheck(this, v8::ACCESS_SET); |
2767 return Heap::undefined_value(); | 2767 return Heap::undefined_value(); |
2768 } | 2768 } |
2769 | 2769 |
2770 // Try to flatten before operating on the string. | 2770 // Try to flatten before operating on the string. |
2771 name->TryFlattenIfNotFlat(); | 2771 name->TryFlatten(); |
2772 | 2772 |
2773 // Check if there is an API defined callback object which prohibits | 2773 // Check if there is an API defined callback object which prohibits |
2774 // callback overwriting in this object or it's prototype chain. | 2774 // callback overwriting in this object or it's prototype chain. |
2775 // This mechanism is needed for instance in a browser setting, where | 2775 // This mechanism is needed for instance in a browser setting, where |
2776 // certain accessors such as window.location should not be allowed | 2776 // certain accessors such as window.location should not be allowed |
2777 // to be overwritten because allowing overwriting could potentially | 2777 // to be overwritten because allowing overwriting could potentially |
2778 // cause security problems. | 2778 // cause security problems. |
2779 LookupResult callback_result; | 2779 LookupResult callback_result; |
2780 LookupCallback(name, &callback_result); | 2780 LookupCallback(name, &callback_result); |
2781 if (callback_result.IsFound()) { | 2781 if (callback_result.IsFound()) { |
(...skipping 757 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3539 return true; | 3539 return true; |
3540 } | 3540 } |
3541 | 3541 |
3542 | 3542 |
3543 int String::Utf8Length() { | 3543 int String::Utf8Length() { |
3544 if (IsAsciiRepresentation()) return length(); | 3544 if (IsAsciiRepresentation()) return length(); |
3545 // Attempt to flatten before accessing the string. It probably | 3545 // Attempt to flatten before accessing the string. It probably |
3546 // doesn't make Utf8Length faster, but it is very likely that | 3546 // doesn't make Utf8Length faster, but it is very likely that |
3547 // the string will be accessed later (for example by WriteUtf8) | 3547 // the string will be accessed later (for example by WriteUtf8) |
3548 // so it's still a good idea. | 3548 // so it's still a good idea. |
3549 TryFlattenIfNotFlat(); | 3549 TryFlatten(); |
3550 Access<StringInputBuffer> buffer(&string_input_buffer); | 3550 Access<StringInputBuffer> buffer(&string_input_buffer); |
3551 buffer->Reset(0, this); | 3551 buffer->Reset(0, this); |
3552 int result = 0; | 3552 int result = 0; |
3553 while (buffer->has_more()) | 3553 while (buffer->has_more()) |
3554 result += unibrow::Utf8::Length(buffer->GetNext()); | 3554 result += unibrow::Utf8::Length(buffer->GetNext()); |
3555 return result; | 3555 return result; |
3556 } | 3556 } |
3557 | 3557 |
3558 | 3558 |
3559 Vector<const char> String::ToAsciiVector() { | 3559 Vector<const char> String::ToAsciiVector() { |
(...skipping 1070 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4630 // Process the remaining characters without updating the array | 4630 // Process the remaining characters without updating the array |
4631 // index. | 4631 // index. |
4632 while (buffer->has_more()) { | 4632 while (buffer->has_more()) { |
4633 hasher.AddCharacterNoIndex(buffer->GetNext()); | 4633 hasher.AddCharacterNoIndex(buffer->GetNext()); |
4634 } | 4634 } |
4635 | 4635 |
4636 return hasher.GetHashField(); | 4636 return hasher.GetHashField(); |
4637 } | 4637 } |
4638 | 4638 |
4639 | 4639 |
4640 Object* String::SubString(int start, int end) { | 4640 Object* String::SubString(int start, int end, PretenureFlag pretenure) { |
4641 if (start == 0 && end == length()) return this; | 4641 if (start == 0 && end == length()) return this; |
4642 Object* result = Heap::AllocateSubString(this, start, end); | 4642 Object* result = Heap::AllocateSubString(this, start, end, pretenure); |
4643 return result; | 4643 return result; |
4644 } | 4644 } |
4645 | 4645 |
4646 | 4646 |
4647 void String::PrintOn(FILE* file) { | 4647 void String::PrintOn(FILE* file) { |
4648 int length = this->length(); | 4648 int length = this->length(); |
4649 for (int i = 0; i < length; i++) { | 4649 for (int i = 0; i < length; i++) { |
4650 fprintf(file, "%c", Get(i)); | 4650 fprintf(file, "%c", Get(i)); |
4651 } | 4651 } |
4652 } | 4652 } |
(...skipping 3708 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8361 if (break_point_objects()->IsUndefined()) return 0; | 8361 if (break_point_objects()->IsUndefined()) return 0; |
8362 // Single beak point. | 8362 // Single beak point. |
8363 if (!break_point_objects()->IsFixedArray()) return 1; | 8363 if (!break_point_objects()->IsFixedArray()) return 1; |
8364 // Multiple break points. | 8364 // Multiple break points. |
8365 return FixedArray::cast(break_point_objects())->length(); | 8365 return FixedArray::cast(break_point_objects())->length(); |
8366 } | 8366 } |
8367 #endif | 8367 #endif |
8368 | 8368 |
8369 | 8369 |
8370 } } // namespace v8::internal | 8370 } } // namespace v8::internal |
OLD | NEW |