OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/objects.h" | 5 #include "src/objects.h" |
6 | 6 |
7 #include <cmath> | 7 #include <cmath> |
8 #include <iomanip> | 8 #include <iomanip> |
9 #include <memory> | 9 #include <memory> |
10 #include <sstream> | 10 #include <sstream> |
(...skipping 11385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11396 return SearchString<const uint8_t>(isolate, receiver_content, pat_vector, | 11396 return SearchString<const uint8_t>(isolate, receiver_content, pat_vector, |
11397 start_index); | 11397 start_index); |
11398 } | 11398 } |
11399 Vector<const uc16> pat_vector = search_content.ToUC16Vector(); | 11399 Vector<const uc16> pat_vector = search_content.ToUC16Vector(); |
11400 return SearchString<const uc16>(isolate, receiver_content, pat_vector, | 11400 return SearchString<const uc16>(isolate, receiver_content, pat_vector, |
11401 start_index); | 11401 start_index); |
11402 } | 11402 } |
11403 | 11403 |
11404 MaybeHandle<String> String::GetSubstitution(Isolate* isolate, Match* match, | 11404 MaybeHandle<String> String::GetSubstitution(Isolate* isolate, Match* match, |
11405 Handle<String> replacement) { | 11405 Handle<String> replacement) { |
| 11406 DCHECK_IMPLIES(match->HasNamedCaptures(), FLAG_harmony_regexp_named_captures); |
| 11407 |
11406 Factory* factory = isolate->factory(); | 11408 Factory* factory = isolate->factory(); |
11407 | 11409 |
11408 const int replacement_length = replacement->length(); | 11410 const int replacement_length = replacement->length(); |
11409 const int captures_length = match->CaptureCount(); | 11411 const int captures_length = match->CaptureCount(); |
11410 | 11412 |
11411 replacement = String::Flatten(replacement); | 11413 replacement = String::Flatten(replacement); |
11412 | 11414 |
11413 Handle<String> dollar_string = | 11415 Handle<String> dollar_string = |
11414 factory->LookupSingleCharacterStringFromCode('$'); | 11416 factory->LookupSingleCharacterStringFromCode('$'); |
11415 int next_dollar_ix = String::IndexOf(isolate, replacement, dollar_string, 0); | 11417 int next_dollar_ix = String::IndexOf(isolate, replacement, dollar_string, 0); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11482 | 11484 |
11483 bool capture_exists; | 11485 bool capture_exists; |
11484 Handle<String> capture; | 11486 Handle<String> capture; |
11485 ASSIGN_RETURN_ON_EXCEPTION( | 11487 ASSIGN_RETURN_ON_EXCEPTION( |
11486 isolate, capture, match->GetCapture(scaled_index, &capture_exists), | 11488 isolate, capture, match->GetCapture(scaled_index, &capture_exists), |
11487 String); | 11489 String); |
11488 if (capture_exists) builder.AppendString(capture); | 11490 if (capture_exists) builder.AppendString(capture); |
11489 continue_from_ix = peek_ix + advance; | 11491 continue_from_ix = peek_ix + advance; |
11490 break; | 11492 break; |
11491 } | 11493 } |
| 11494 case '<': { // $<name> - named capture |
| 11495 if (!match->HasNamedCaptures()) { |
| 11496 builder.AppendCharacter('$'); |
| 11497 continue_from_ix = peek_ix; |
| 11498 break; |
| 11499 } |
| 11500 |
| 11501 Handle<String> bracket_string = |
| 11502 factory->LookupSingleCharacterStringFromCode('>'); |
| 11503 const int closing_bracket_ix = |
| 11504 String::IndexOf(isolate, replacement, bracket_string, peek_ix + 1); |
| 11505 |
| 11506 if (closing_bracket_ix == -1) { |
| 11507 THROW_NEW_ERROR( |
| 11508 isolate, |
| 11509 NewSyntaxError(MessageTemplate::kRegExpInvalidReplaceString, |
| 11510 replacement), |
| 11511 String); |
| 11512 } |
| 11513 |
| 11514 Handle<String> capture_name = |
| 11515 factory->NewSubString(replacement, peek_ix + 1, closing_bracket_ix); |
| 11516 bool capture_exists; |
| 11517 Handle<String> capture; |
| 11518 ASSIGN_RETURN_ON_EXCEPTION( |
| 11519 isolate, capture, |
| 11520 match->GetNamedCapture(capture_name, &capture_exists), String); |
| 11521 if (capture_exists) builder.AppendString(capture); |
| 11522 continue_from_ix = closing_bracket_ix + 1; |
| 11523 break; |
| 11524 } |
11492 default: | 11525 default: |
11493 builder.AppendCharacter('$'); | 11526 builder.AppendCharacter('$'); |
11494 continue_from_ix = peek_ix; | 11527 continue_from_ix = peek_ix; |
11495 break; | 11528 break; |
11496 } | 11529 } |
11497 | 11530 |
11498 // Go the the next $ in the replacement. | 11531 // Go the the next $ in the replacement. |
11499 // TODO(jgruber): Single-char lookups could be much more efficient. | 11532 // TODO(jgruber): Single-char lookups could be much more efficient. |
11500 DCHECK_NE(continue_from_ix, -1); | 11533 DCHECK_NE(continue_from_ix, -1); |
11501 next_dollar_ix = | 11534 next_dollar_ix = |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11652 if (Get(i) != unibrow::Utf16::TrailSurrogate(r)) return false; | 11685 if (Get(i) != unibrow::Utf16::TrailSurrogate(r)) return false; |
11653 } else { | 11686 } else { |
11654 if (Get(i) != r) return false; | 11687 if (Get(i) != r) return false; |
11655 } | 11688 } |
11656 utf8_data += cursor; | 11689 utf8_data += cursor; |
11657 remaining_in_str -= cursor; | 11690 remaining_in_str -= cursor; |
11658 } | 11691 } |
11659 return (allow_prefix_match || i == slen) && remaining_in_str == 0; | 11692 return (allow_prefix_match || i == slen) && remaining_in_str == 0; |
11660 } | 11693 } |
11661 | 11694 |
| 11695 template <> |
| 11696 bool String::IsEqualTo(Vector<const uint8_t> str) { |
| 11697 return IsOneByteEqualTo(str); |
| 11698 } |
| 11699 |
| 11700 template <> |
| 11701 bool String::IsEqualTo(Vector<const uc16> str) { |
| 11702 return IsTwoByteEqualTo(str); |
| 11703 } |
11662 | 11704 |
11663 bool String::IsOneByteEqualTo(Vector<const uint8_t> str) { | 11705 bool String::IsOneByteEqualTo(Vector<const uint8_t> str) { |
11664 int slen = length(); | 11706 int slen = length(); |
11665 if (str.length() != slen) return false; | 11707 if (str.length() != slen) return false; |
11666 DisallowHeapAllocation no_gc; | 11708 DisallowHeapAllocation no_gc; |
11667 FlatContent content = GetFlatContent(); | 11709 FlatContent content = GetFlatContent(); |
11668 if (content.IsOneByte()) { | 11710 if (content.IsOneByte()) { |
11669 return CompareChars(content.ToOneByteVector().start(), | 11711 return CompareChars(content.ToOneByteVector().start(), |
11670 str.start(), slen) == 0; | 11712 str.start(), slen) == 0; |
11671 } | 11713 } |
(...skipping 8644 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
20316 // depend on this. | 20358 // depend on this. |
20317 return DICTIONARY_ELEMENTS; | 20359 return DICTIONARY_ELEMENTS; |
20318 } | 20360 } |
20319 DCHECK_LE(kind, LAST_ELEMENTS_KIND); | 20361 DCHECK_LE(kind, LAST_ELEMENTS_KIND); |
20320 return kind; | 20362 return kind; |
20321 } | 20363 } |
20322 } | 20364 } |
20323 | 20365 |
20324 } // namespace internal | 20366 } // namespace internal |
20325 } // namespace v8 | 20367 } // namespace v8 |
OLD | NEW |