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, |