| Index: src/regexp/jsregexp.cc | 
| diff --git a/src/regexp/jsregexp.cc b/src/regexp/jsregexp.cc | 
| index 7b510b072b0bba0d6e66726397213c52ead70a9f..c958310d15370c465e21263e0a21c2b7ea9ac118 100644 | 
| --- a/src/regexp/jsregexp.cc | 
| +++ b/src/regexp/jsregexp.cc | 
| @@ -5085,34 +5085,18 @@ void AddLoneTrailSurrogates(RegExpCompiler* compiler, ChoiceNode* result, | 
| result->AddAlternative(GuardedAlternative(match)); | 
| } | 
|  | 
| - | 
| -void AddUnanchoredAdvance(RegExpCompiler* compiler, ChoiceNode* result, | 
| -                          RegExpNode* on_success) { | 
| +RegExpNode* UnanchoredAdvance(RegExpCompiler* compiler, | 
| +                              RegExpNode* on_success) { | 
| // This implements ES2015 21.2.5.2.3, AdvanceStringIndex. | 
| DCHECK(!compiler->read_backward()); | 
| Zone* zone = compiler->zone(); | 
| -  // Advancing can either consume a BMP character or a trail surrogate. | 
| -  ZoneList<CharacterRange>* bmp_and_trail = | 
| -      new (zone) ZoneList<CharacterRange>(2, zone); | 
| -  bmp_and_trail->Add(CharacterRange::Range(0, kLeadSurrogateStart - 1), zone); | 
| -  bmp_and_trail->Add( | 
| -      CharacterRange::Range(kLeadSurrogateEnd + 1, kNonBmpStart - 1), zone); | 
| -  result->AddAlternative(GuardedAlternative(TextNode::CreateForCharacterRanges( | 
| -      zone, bmp_and_trail, false, on_success))); | 
| - | 
| -  // Or it could consume a lead optionally followed by a trail surrogate. | 
| -  ZoneList<CharacterRange>* lead_surrogates = CharacterRange::List( | 
| -      zone, CharacterRange::Range(kLeadSurrogateStart, kLeadSurrogateEnd)); | 
| -  ZoneList<CharacterRange>* trail_surrogates = CharacterRange::List( | 
| -      zone, CharacterRange::Range(kTrailSurrogateStart, kTrailSurrogateEnd)); | 
| -  ChoiceNode* optional_trail = new (zone) ChoiceNode(2, zone); | 
| -  optional_trail->AddAlternative( | 
| -      GuardedAlternative(TextNode::CreateForCharacterRanges( | 
| -          zone, trail_surrogates, false, on_success))); | 
| -  optional_trail->AddAlternative(GuardedAlternative(on_success)); | 
| -  RegExpNode* optional_pair = TextNode::CreateForCharacterRanges( | 
| -      zone, lead_surrogates, false, optional_trail); | 
| -  result->AddAlternative(GuardedAlternative(optional_pair)); | 
| +  // Advance any character. If the character happens to be a lead surrogate and | 
| +  // we advanced into the middle of a surrogate pair, it will work out, as | 
| +  // nothing will match from there. We will have to advance again, consuming | 
| +  // the associated trail surrogate. | 
| +  ZoneList<CharacterRange>* range = CharacterRange::List( | 
| +      zone, CharacterRange::Range(0, String::kMaxUtf16CodeUnit)); | 
| +  return TextNode::CreateForCharacterRanges(zone, range, false, on_success); | 
| } | 
|  | 
|  | 
| @@ -5174,17 +5158,17 @@ RegExpNode* RegExpCharacterClass::ToNode(RegExpCompiler* compiler, | 
| // No matches possible. | 
| return new (zone) EndNode(EndNode::BACKTRACK, zone); | 
| } | 
| -    ChoiceNode* result = new (zone) ChoiceNode(2, zone); | 
| if (standard_type() == '*') { | 
| -      AddUnanchoredAdvance(compiler, result, on_success); | 
| +      return UnanchoredAdvance(compiler, on_success); | 
| } else { | 
| +      ChoiceNode* result = new (zone) ChoiceNode(2, zone); | 
| UnicodeRangeSplitter splitter(zone, ranges); | 
| AddBmpCharacters(compiler, result, on_success, &splitter); | 
| AddNonBmpSurrogatePairs(compiler, result, on_success, &splitter); | 
| AddLoneLeadSurrogates(compiler, result, on_success, &splitter); | 
| AddLoneTrailSurrogates(compiler, result, on_success, &splitter); | 
| +      return result; | 
| } | 
| -    return result; | 
| } else { | 
| return new (zone) TextNode(this, compiler->read_backward(), on_success); | 
| } | 
|  |