| Index: src/jsregexp.cc
|
| diff --git a/src/jsregexp.cc b/src/jsregexp.cc
|
| index 3455abce2399b3030a172e10ce1e2eb463f43647..cbd0b26a2acc6b30003cbe5183a4bc68609bd858 100644
|
| --- a/src/jsregexp.cc
|
| +++ b/src/jsregexp.cc
|
| @@ -1,4 +1,4 @@
|
| -// Copyright 2011 the V8 project authors. All rights reserved.
|
| +// Copyright 2012 the V8 project authors. All rights reserved.
|
| // Redistribution and use in source and binary forms, with or without
|
| // modification, are permitted provided that the following conditions are
|
| // met:
|
| @@ -429,6 +429,7 @@ bool RegExpImpl::CompileIrregexp(Handle<JSRegExp> re,
|
| RegExpEngine::CompilationResult result =
|
| RegExpEngine::Compile(&compile_data,
|
| flags.is_ignore_case(),
|
| + flags.is_global(),
|
| flags.is_multiline(),
|
| pattern,
|
| sample_subject,
|
| @@ -515,7 +516,23 @@ int RegExpImpl::IrregexpPrepare(Handle<JSRegExp> regexp,
|
| }
|
|
|
|
|
| -RegExpImpl::IrregexpResult RegExpImpl::IrregexpExecOnce(
|
| +int RegExpImpl::GlobalOffsetsVectorSize(Handle<JSRegExp> regexp,
|
| + int registers_per_match,
|
| + int* max_matches) {
|
| +#ifdef V8_INTERPRETED_REGEXP
|
| + // Global loop in interpreted regexp is not implemented. Therefore we choose
|
| + // the size of the offsets vector so that it can only store one match.
|
| + *max_matches = 1;
|
| + return registers_per_match;
|
| +#else // V8_INTERPRETED_REGEXP
|
| + int size = Max(registers_per_match, OffsetsVector::kStaticOffsetsVectorSize);
|
| + *max_matches = size / registers_per_match;
|
| + return size;
|
| +#endif // V8_INTERPRETED_REGEXP
|
| +}
|
| +
|
| +
|
| +int RegExpImpl::IrregexpExecRaw(
|
| Handle<JSRegExp> regexp,
|
| Handle<String> subject,
|
| int index,
|
| @@ -617,7 +634,7 @@ Handle<Object> RegExpImpl::IrregexpExec(Handle<JSRegExp> jsregexp,
|
|
|
| OffsetsVector registers(required_registers, isolate);
|
|
|
| - IrregexpResult res = RegExpImpl::IrregexpExecOnce(
|
| + int res = RegExpImpl::IrregexpExecRaw(
|
| jsregexp, subject, previous_index, Vector<int>(registers.vector(),
|
| registers.length()));
|
| if (res == RE_SUCCESS) {
|
| @@ -5780,6 +5797,7 @@ void DispatchTableConstructor::VisitAction(ActionNode* that) {
|
| RegExpEngine::CompilationResult RegExpEngine::Compile(
|
| RegExpCompileData* data,
|
| bool ignore_case,
|
| + bool is_global,
|
| bool is_multiline,
|
| Handle<String> pattern,
|
| Handle<String> sample_subject,
|
| @@ -5883,6 +5901,8 @@ RegExpEngine::CompilationResult RegExpEngine::Compile(
|
| macro_assembler.SetCurrentPositionFromEnd(max_length);
|
| }
|
|
|
| + macro_assembler.set_global(is_global);
|
| +
|
| return compiler.Assemble(¯o_assembler,
|
| node,
|
| data->capture_count,
|
|
|