| Index: src/jsregexp.cc
|
| ===================================================================
|
| --- src/jsregexp.cc (revision 654)
|
| +++ src/jsregexp.cc (working copy)
|
| @@ -129,34 +129,37 @@
|
| // Converts a source string to a 16 bit flat string or a SlicedString containing
|
| // a 16 bit flat string).
|
| Handle<String> RegExpImpl::StringToTwoByte(Handle<String> pattern) {
|
| - if (!pattern->IsFlat()) {
|
| + StringShape shape(*pattern);
|
| + if (!pattern->IsFlat(shape)) {
|
| FlattenString(pattern);
|
| }
|
| - Handle<String> flat_string(pattern->IsConsString() ?
|
| + Handle<String> flat_string(shape.IsCons() ?
|
| String::cast(ConsString::cast(*pattern)->first()) :
|
| *pattern);
|
| - ASSERT(!flat_string->IsConsString());
|
| - ASSERT(flat_string->IsSeqString() || flat_string->IsSlicedString() ||
|
| - flat_string->IsExternalString());
|
| - if (!flat_string->IsAsciiRepresentation()) {
|
| + ASSERT(flat_string->IsString());
|
| + StringShape flat_shape(*flat_string);
|
| + ASSERT(!flat_shape.IsCons());
|
| + ASSERT(flat_shape.IsSequential() ||
|
| + flat_shape.IsSliced() ||
|
| + flat_shape.IsExternal());
|
| + if (!flat_shape.IsAsciiRepresentation()) {
|
| return flat_string;
|
| }
|
|
|
| + int len = flat_string->length(flat_shape);
|
| Handle<String> two_byte_string =
|
| - Factory::NewRawTwoByteString(flat_string->length(), TENURED);
|
| - static StringInputBuffer convert_to_two_byte_buffer;
|
| - convert_to_two_byte_buffer.Reset(*flat_string);
|
| - for (int i = 0; convert_to_two_byte_buffer.has_more(); i++) {
|
| - two_byte_string->Set(i, convert_to_two_byte_buffer.GetNext());
|
| - }
|
| + Factory::NewRawTwoByteString(len, TENURED);
|
| + uc16* dest = SeqTwoByteString::cast(*two_byte_string)->GetChars();
|
| + String::WriteToFlat(*flat_string, flat_shape, dest, 0, len);
|
| return two_byte_string;
|
| }
|
|
|
|
|
| static JSRegExp::Flags RegExpFlagsFromString(Handle<String> str) {
|
| int flags = JSRegExp::NONE;
|
| - for (int i = 0; i < str->length(); i++) {
|
| - switch (str->Get(i)) {
|
| + StringShape shape(*str);
|
| + for (int i = 0; i < str->length(shape); i++) {
|
| + switch (str->Get(shape, i)) {
|
| case 'i':
|
| flags |= JSRegExp::IGNORE_CASE;
|
| break;
|
| @@ -182,13 +185,14 @@
|
| Handle<FixedArray> cached = CompilationCache::LookupRegExp(pattern, flags);
|
| bool in_cache = !cached.is_null();
|
| Handle<Object> result;
|
| + StringShape shape(*pattern);
|
| if (in_cache) {
|
| re->set_data(*cached);
|
| result = re;
|
| } else {
|
| bool is_atom = !flags.is_ignore_case();
|
| - for (int i = 0; is_atom && i < pattern->length(); i++) {
|
| - if (is_reg_exp_special_char.get(pattern->Get(i)))
|
| + for (int i = 0; is_atom && i < pattern->length(shape); i++) {
|
| + if (is_reg_exp_special_char.get(pattern->Get(shape, i)))
|
| is_atom = false;
|
| }
|
| if (is_atom) {
|
|
|