| Index: src/jsregexp.cc
|
| diff --git a/src/jsregexp.cc b/src/jsregexp.cc
|
| index 62d93a722025e092b36e795c7f656b83d80b644e..3ebfbdfc986cb823291fb08dd94f4372bdc92922 100644
|
| --- a/src/jsregexp.cc
|
| +++ b/src/jsregexp.cc
|
| @@ -224,7 +224,6 @@ Handle<Object> RegExpImpl::AtomExec(Handle<JSRegExp> re,
|
|
|
| if (!subject->IsFlat()) FlattenString(subject);
|
| AssertNoAllocation no_heap_allocation; // ensure vectors stay valid
|
| - // Extract flattened substrings of cons strings before determining asciiness.
|
|
|
| String* needle = String::cast(re->DataAt(JSRegExp::kAtomPatternIndex));
|
| int needle_len = needle->length();
|
| @@ -347,10 +346,7 @@ bool RegExpImpl::CompileIrregexp(Handle<JSRegExp> re, bool is_ascii) {
|
| JSRegExp::Flags flags = re->GetFlags();
|
|
|
| Handle<String> pattern(re->Pattern());
|
| - if (!pattern->IsFlat()) {
|
| - FlattenString(pattern);
|
| - }
|
| -
|
| + if (!pattern->IsFlat()) FlattenString(pattern);
|
| RegExpCompileData compile_data;
|
| FlatStringReader reader(isolate, pattern);
|
| if (!RegExpParser::ParseRegExp(&reader, flags.is_multiline(),
|
| @@ -434,22 +430,12 @@ void RegExpImpl::IrregexpInitialize(Handle<JSRegExp> re,
|
|
|
| int RegExpImpl::IrregexpPrepare(Handle<JSRegExp> regexp,
|
| Handle<String> subject) {
|
| - if (!subject->IsFlat()) {
|
| - FlattenString(subject);
|
| - }
|
| + if (!subject->IsFlat()) FlattenString(subject);
|
| +
|
| // Check the asciiness of the underlying storage.
|
| - bool is_ascii;
|
| - {
|
| - AssertNoAllocation no_gc;
|
| - String* sequential_string = *subject;
|
| - if (subject->IsConsString()) {
|
| - sequential_string = ConsString::cast(*subject)->first();
|
| - }
|
| - is_ascii = sequential_string->IsAsciiRepresentation();
|
| - }
|
| - if (!EnsureCompiledIrregexp(regexp, is_ascii)) {
|
| - return -1;
|
| - }
|
| + bool is_ascii = subject->IsAsciiRepresentationUnderneath();
|
| + if (!EnsureCompiledIrregexp(regexp, is_ascii)) return -1;
|
| +
|
| #ifdef V8_INTERPRETED_REGEXP
|
| // Byte-code regexp needs space allocated for all its registers.
|
| return IrregexpNumberOfRegisters(FixedArray::cast(regexp->data()));
|
| @@ -474,15 +460,11 @@ RegExpImpl::IrregexpResult RegExpImpl::IrregexpExecOnce(
|
| ASSERT(index <= subject->length());
|
| ASSERT(subject->IsFlat());
|
|
|
| - // A flat ASCII string might have a two-byte first part.
|
| - if (subject->IsConsString()) {
|
| - subject = Handle<String>(ConsString::cast(*subject)->first(), isolate);
|
| - }
|
| + bool is_ascii = subject->IsAsciiRepresentationUnderneath();
|
|
|
| #ifndef V8_INTERPRETED_REGEXP
|
| ASSERT(output.length() >= (IrregexpNumberOfCaptures(*irregexp) + 1) * 2);
|
| do {
|
| - bool is_ascii = subject->IsAsciiRepresentation();
|
| EnsureCompiledIrregexp(regexp, is_ascii);
|
| Handle<Code> code(IrregexpNativeCode(*irregexp, is_ascii), isolate);
|
| NativeRegExpMacroAssembler::Result res =
|
| @@ -510,13 +492,13 @@ RegExpImpl::IrregexpResult RegExpImpl::IrregexpExecOnce(
|
| // being internal and external, and even between being ASCII and UC16,
|
| // but the characters are always the same).
|
| IrregexpPrepare(regexp, subject);
|
| + is_ascii = subject->IsAsciiRepresentationUnderneath();
|
| } while (true);
|
| UNREACHABLE();
|
| return RE_EXCEPTION;
|
| #else // V8_INTERPRETED_REGEXP
|
|
|
| ASSERT(output.length() >= IrregexpNumberOfRegisters(*irregexp));
|
| - bool is_ascii = subject->IsAsciiRepresentation();
|
| // We must have done EnsureCompiledIrregexp, so we can get the number of
|
| // registers.
|
| int* register_vector = output.start();
|
| @@ -2679,7 +2661,8 @@ int TextNode::GreedyLoopTextLength() {
|
| // this alternative and back to this choice node. If there are variable
|
| // length nodes or other complications in the way then return a sentinel
|
| // value indicating that a greedy loop cannot be constructed.
|
| -int ChoiceNode::GreedyLoopTextLength(GuardedAlternative* alternative) {
|
| +int ChoiceNode::GreedyLoopTextLengthForAlternative(
|
| + GuardedAlternative* alternative) {
|
| int length = 0;
|
| RegExpNode* node = alternative->node();
|
| // Later we will generate code for all these text nodes using recursion
|
| @@ -2718,7 +2701,8 @@ void LoopChoiceNode::AddContinueAlternative(GuardedAlternative alt) {
|
| void LoopChoiceNode::Emit(RegExpCompiler* compiler, Trace* trace) {
|
| RegExpMacroAssembler* macro_assembler = compiler->macro_assembler();
|
| if (trace->stop_node() == this) {
|
| - int text_length = GreedyLoopTextLength(&(alternatives_->at(0)));
|
| + int text_length =
|
| + GreedyLoopTextLengthForAlternative(&(alternatives_->at(0)));
|
| ASSERT(text_length != kNodeIsTooComplexForGreedyLoops);
|
| // Update the counter-based backtracking info on the stack. This is an
|
| // optimization for greedy loops (see below).
|
| @@ -2911,7 +2895,7 @@ void ChoiceNode::Emit(RegExpCompiler* compiler, Trace* trace) {
|
|
|
| Trace* current_trace = trace;
|
|
|
| - int text_length = GreedyLoopTextLength(&(alternatives_->at(0)));
|
| + int text_length = GreedyLoopTextLengthForAlternative(&(alternatives_->at(0)));
|
| bool greedy_loop = false;
|
| Label greedy_loop_label;
|
| Trace counter_backtrack_trace;
|
|
|