| 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 569 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 580 return true; // An Ape, an ABCBook. | 580 return true; // An Ape, an ABCBook. |
| 581 } else if ((c1 == 0 || (c1 >= 'A' && c1 <= 'Z')) && | 581 } else if ((c1 == 0 || (c1 >= 'A' && c1 <= 'Z')) && |
| 582 (c0 == 'F' || c0 == 'H' || c0 == 'M' || c0 == 'N' || c0 == 'R' || | 582 (c0 == 'F' || c0 == 'H' || c0 == 'M' || c0 == 'N' || c0 == 'R' || |
| 583 c0 == 'S' || c0 == 'X')) { | 583 c0 == 'S' || c0 == 'X')) { |
| 584 return true; // An MP3File, an M. | 584 return true; // An MP3File, an M. |
| 585 } | 585 } |
| 586 return false; | 586 return false; |
| 587 } | 587 } |
| 588 | 588 |
| 589 | 589 |
| 590 Object* String::Flatten(StringShape shape) { | 590 Object* String::TryFlatten(StringShape shape) { |
| 591 #ifdef DEBUG | 591 #ifdef DEBUG |
| 592 // Do not attempt to flatten in debug mode when allocation is not | 592 // Do not attempt to flatten in debug mode when allocation is not |
| 593 // allowed. This is to avoid an assertion failure when allocating. | 593 // allowed. This is to avoid an assertion failure when allocating. |
| 594 // Flattening strings is the only case where we always allow | 594 // Flattening strings is the only case where we always allow |
| 595 // allocation because no GC is performed if the allocation fails. | 595 // allocation because no GC is performed if the allocation fails. |
| 596 if (!Heap::IsAllocationAllowed()) return this; | 596 if (!Heap::IsAllocationAllowed()) return this; |
| 597 #endif | 597 #endif |
| 598 | 598 |
| 599 switch (shape.representation_tag()) { | 599 switch (shape.representation_tag()) { |
| 600 case kSlicedStringTag: { | 600 case kSlicedStringTag: { |
| 601 SlicedString* ss = SlicedString::cast(this); | 601 SlicedString* ss = SlicedString::cast(this); |
| 602 // The SlicedString constructor should ensure that there are no | 602 // The SlicedString constructor should ensure that there are no |
| 603 // SlicedStrings that are constructed directly on top of other | 603 // SlicedStrings that are constructed directly on top of other |
| 604 // SlicedStrings. | 604 // SlicedStrings. |
| 605 String* buf = ss->buffer(); | 605 String* buf = ss->buffer(); |
| 606 ASSERT(!buf->IsSlicedString()); | 606 ASSERT(!buf->IsSlicedString()); |
| 607 Object* ok = buf->Flatten(StringShape(buf)); | 607 Object* ok = buf->TryFlatten(StringShape(buf)); |
| 608 if (ok->IsFailure()) return ok; | 608 if (ok->IsFailure()) return ok; |
| 609 // Under certain circumstances (TryFlatten fails in String::Slice) | 609 // Under certain circumstances (TryFlattenIfNotFlat fails in |
| 610 // we can have a cons string under a slice. In this case we need | 610 // String::Slice) we can have a cons string under a slice. |
| 611 // to get the flat string out of the cons! | 611 // In this case we need to get the flat string out of the cons! |
| 612 if (StringShape(String::cast(ok)).IsCons()) { | 612 if (StringShape(String::cast(ok)).IsCons()) { |
| 613 ss->set_buffer(ConsString::cast(ok)->first()); | 613 ss->set_buffer(ConsString::cast(ok)->first()); |
| 614 } | 614 } |
| 615 return this; | 615 return this; |
| 616 } | 616 } |
| 617 case kConsStringTag: { | 617 case kConsStringTag: { |
| 618 ConsString* cs = ConsString::cast(this); | 618 ConsString* cs = ConsString::cast(this); |
| 619 if (cs->second()->length() == 0) { | 619 if (cs->second()->length() == 0) { |
| 620 return this; | 620 return this; |
| 621 } | 621 } |
| (...skipping 1784 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2406 // interceptor calls. | 2406 // interceptor calls. |
| 2407 AssertNoContextChange ncc; | 2407 AssertNoContextChange ncc; |
| 2408 | 2408 |
| 2409 // Check access rights if needed. | 2409 // Check access rights if needed. |
| 2410 if (IsAccessCheckNeeded() && | 2410 if (IsAccessCheckNeeded() && |
| 2411 !Top::MayNamedAccess(this, name, v8::ACCESS_SET)) { | 2411 !Top::MayNamedAccess(this, name, v8::ACCESS_SET)) { |
| 2412 Top::ReportFailedAccessCheck(this, v8::ACCESS_SET); | 2412 Top::ReportFailedAccessCheck(this, v8::ACCESS_SET); |
| 2413 return Heap::undefined_value(); | 2413 return Heap::undefined_value(); |
| 2414 } | 2414 } |
| 2415 | 2415 |
| 2416 // TryFlatten before operating on the string. | 2416 // Try to flatten before operating on the string. |
| 2417 name->TryFlatten(StringShape(name)); | 2417 name->TryFlattenIfNotFlat(StringShape(name)); |
| 2418 | 2418 |
| 2419 // Make sure name is not an index. | 2419 // Make sure name is not an index. |
| 2420 uint32_t index; | 2420 uint32_t index; |
| 2421 if (name->AsArrayIndex(&index)) return Heap::undefined_value(); | 2421 if (name->AsArrayIndex(&index)) return Heap::undefined_value(); |
| 2422 | 2422 |
| 2423 // Check if there is an API defined callback object which prohibits | 2423 // Check if there is an API defined callback object which prohibits |
| 2424 // callback overwriting in this object or it's prototype chain. | 2424 // callback overwriting in this object or it's prototype chain. |
| 2425 // This mechanism is needed for instance in a browser setting, where | 2425 // This mechanism is needed for instance in a browser setting, where |
| 2426 // certain accessors such as window.location should not be allowed | 2426 // certain accessors such as window.location should not be allowed |
| 2427 // to be overwritten because allowing overwriting could potentially | 2427 // to be overwritten because allowing overwriting could potentially |
| (...skipping 630 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3058 } | 3058 } |
| 3059 | 3059 |
| 3060 | 3060 |
| 3061 int String::Utf8Length() { | 3061 int String::Utf8Length() { |
| 3062 StringShape shape(this); | 3062 StringShape shape(this); |
| 3063 if (shape.IsAsciiRepresentation()) return length(shape); | 3063 if (shape.IsAsciiRepresentation()) return length(shape); |
| 3064 // Attempt to flatten before accessing the string. It probably | 3064 // Attempt to flatten before accessing the string. It probably |
| 3065 // doesn't make Utf8Length faster, but it is very likely that | 3065 // doesn't make Utf8Length faster, but it is very likely that |
| 3066 // the string will be accessed later (for example by WriteUtf8) | 3066 // the string will be accessed later (for example by WriteUtf8) |
| 3067 // so it's still a good idea. | 3067 // so it's still a good idea. |
| 3068 if (!IsFlat(shape)) { | 3068 TryFlattenIfNotFlat(shape); // shape is now no longer valid. |
| 3069 TryFlatten(shape); // shape is now no longer valid. | |
| 3070 } | |
| 3071 Access<StringInputBuffer> buffer(&string_input_buffer); | 3069 Access<StringInputBuffer> buffer(&string_input_buffer); |
| 3072 buffer->Reset(0, this); | 3070 buffer->Reset(0, this); |
| 3073 int result = 0; | 3071 int result = 0; |
| 3074 while (buffer->has_more()) | 3072 while (buffer->has_more()) |
| 3075 result += unibrow::Utf8::Length(buffer->GetNext()); | 3073 result += unibrow::Utf8::Length(buffer->GetNext()); |
| 3076 return result; | 3074 return result; |
| 3077 } | 3075 } |
| 3078 | 3076 |
| 3079 | 3077 |
| 3080 Vector<const char> String::ToAsciiVector() { | 3078 Vector<const char> String::ToAsciiVector() { |
| (...skipping 3935 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7016 // No break point. | 7014 // No break point. |
| 7017 if (break_point_objects()->IsUndefined()) return 0; | 7015 if (break_point_objects()->IsUndefined()) return 0; |
| 7018 // Single beak point. | 7016 // Single beak point. |
| 7019 if (!break_point_objects()->IsFixedArray()) return 1; | 7017 if (!break_point_objects()->IsFixedArray()) return 1; |
| 7020 // Multiple break points. | 7018 // Multiple break points. |
| 7021 return FixedArray::cast(break_point_objects())->length(); | 7019 return FixedArray::cast(break_point_objects())->length(); |
| 7022 } | 7020 } |
| 7023 | 7021 |
| 7024 | 7022 |
| 7025 } } // namespace v8::internal | 7023 } } // namespace v8::internal |
| OLD | NEW |