Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(11)

Side by Side Diff: src/objects.cc

Issue 18552: Fix bug where strings were not flattened before regexp. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 11 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698