Index: src/jsregexp.h |
=================================================================== |
--- src/jsregexp.h (revision 1489) |
+++ src/jsregexp.h (working copy) |
@@ -51,6 +51,7 @@ |
// Parses the RegExp pattern and prepares the JSRegExp object with |
// generic data and choice of implementation - as well as what |
// the implementation wants to store in the data field. |
+ // Returns false if compilation fails. |
static Handle<Object> Compile(Handle<JSRegExp> re, |
Handle<String> pattern, |
Handle<String> flags); |
@@ -59,38 +60,45 @@ |
// This function calls the garbage collector if necessary. |
static Handle<Object> Exec(Handle<JSRegExp> regexp, |
Handle<String> subject, |
- Handle<Object> index); |
+ int index, |
+ Handle<JSArray> lastMatchInfo); |
// Call RegExp.prototyp.exec(string) in a loop. |
// Used by String.prototype.match and String.prototype.replace. |
// This function calls the garbage collector if necessary. |
static Handle<Object> ExecGlobal(Handle<JSRegExp> regexp, |
- Handle<String> subject); |
+ Handle<String> subject, |
+ Handle<JSArray> lastMatchInfo); |
// Prepares a JSRegExp object with Irregexp-specific data. |
- static Handle<Object> IrregexpPrepare(Handle<JSRegExp> re, |
- Handle<String> pattern, |
- JSRegExp::Flags flags); |
+ static void IrregexpPrepare(Handle<JSRegExp> re, |
+ Handle<String> pattern, |
+ JSRegExp::Flags flags, |
+ int capture_register_count); |
- static Handle<Object> AtomCompile(Handle<JSRegExp> re, |
- Handle<String> pattern, |
- JSRegExp::Flags flags, |
- Handle<String> match_pattern); |
+ static void AtomCompile(Handle<JSRegExp> re, |
+ Handle<String> pattern, |
+ JSRegExp::Flags flags, |
+ Handle<String> match_pattern); |
static Handle<Object> AtomExec(Handle<JSRegExp> regexp, |
Handle<String> subject, |
- Handle<Object> index); |
+ int index, |
+ Handle<JSArray> lastMatchInfo); |
static Handle<Object> AtomExecGlobal(Handle<JSRegExp> regexp, |
- Handle<String> subject); |
+ Handle<String> subject, |
+ Handle<JSArray> lastMatchInfo); |
// Execute an Irregexp bytecode pattern. |
static Handle<Object> IrregexpExec(Handle<JSRegExp> regexp, |
Handle<String> subject, |
- Handle<Object> index); |
+ int index, |
+ Handle<JSArray> lastMatchInfo); |
static Handle<Object> IrregexpExecGlobal(Handle<JSRegExp> regexp, |
- Handle<String> subject); |
+ Handle<String> subject, |
+ Handle<JSArray> lastMatchInfo); |
static void NewSpaceCollectionPrologue(); |
static void OldSpaceCollectionPrologue(); |
@@ -101,26 +109,49 @@ |
static Handle<String> StringToTwoByte(Handle<String> pattern); |
static Handle<String> CachedStringToTwoByte(Handle<String> pattern); |
- static const int kIrregexpImplementationIndex = 0; |
- static const int kIrregexpNumberOfCapturesIndex = 1; |
- static const int kIrregexpNumberOfRegistersIndex = 2; |
- static const int kIrregexpCodeIndex = 3; |
- static const int kIrregexpDataLength = 4; |
+ // Offsets in the lastMatchInfo array. |
+ static const int kLastCaptureCount = 0; |
+ static const int kLastSubject = 1; |
+ static const int kLastInput = 2; |
+ static const int kFirstCapture = 1; |
+ static const int kLastMatchOverhead = 3; |
+ static int GetCapture(FixedArray* array, int index) { |
Mads Ager (chromium)
2009/03/11 13:49:17
This is a general comment on this code. Don't let
Erik Corry
2009/03/11 14:01:06
Changed here, left alone other places in the file.
|
+ return Smi::cast(array->get(index + kFirstCapture))->value(); |
+ } |
+ static void SetLastCaptureCount(FixedArray* array, int to) { |
+ array->set(kLastCaptureCount, Smi::FromInt(to)); |
+ } |
+ static void SetLastSubject(FixedArray* array, String* to) { |
+ int capture_count = GetLastCaptureCount(array); |
+ array->set(capture_count + kLastSubject, to); |
+ } |
+ static void SetLastInput(FixedArray* array, String* to) { |
+ int capture_count = GetLastCaptureCount(array); |
+ array->set(capture_count + kLastInput, to); |
+ } |
+ static void SetCapture(FixedArray* array, int index, int to) { |
+ array->set(index + kFirstCapture, Smi::FromInt(to)); |
+ } |
private: |
static String* last_ascii_string_; |
static String* two_byte_cached_string_; |
- static int IrregexpNumberOfCaptures(Handle<FixedArray> re); |
- static int IrregexpNumberOfRegisters(Handle<FixedArray> re); |
- static Handle<ByteArray> IrregexpByteCode(Handle<FixedArray> re); |
- static Handle<Code> IrregexpNativeCode(Handle<FixedArray> re); |
+ static bool EnsureCompiledIrregexp(Handle<JSRegExp> re, bool is_ascii); |
+ static int IrregexpMaxRegisterCount(FixedArray* re); |
+ static void SetIrregexpMaxRegisterCount(FixedArray* re, int value); |
+ static int IrregexpNumberOfCaptures(FixedArray* re); |
+ static int IrregexpNumberOfRegisters(FixedArray* re); |
+ static ByteArray* IrregexpByteCode(FixedArray* re, bool is_ascii); |
+ static Code* IrregexpNativeCode(FixedArray* re, bool is_ascii); |
+ |
// On a successful match, the result is a JSArray containing |
// captured positions. On a failure, the result is the null value. |
// Returns an empty handle in case of an exception. |
static Handle<Object> IrregexpExecOnce(Handle<FixedArray> regexp, |
int num_captures, |
+ Handle<JSArray> lastMatchInfo, |
Handle<String> subject16, |
int previous_index, |
int* ovector, |
@@ -134,6 +165,10 @@ |
int character_position, |
int utf8_position); |
+ // Used to access the lastMatchInfo array. |
+ static int GetLastCaptureCount(FixedArray* array) { |
+ return Smi::cast(array->get(kLastCaptureCount))->value(); |
+ } |
// A one element cache of the last utf8_subject string and its length. The |
// subject JS String object is cached in the heap. We also cache a |
// translation between position and utf8 position. |
@@ -1319,12 +1354,26 @@ |
class RegExpEngine: public AllStatic { |
public: |
- static Handle<FixedArray> Compile(RegExpCompileData* input, |
- bool ignore_case, |
- bool multiline, |
- Handle<String> pattern, |
- bool is_ascii); |
+ struct CompilationResult { |
+ explicit CompilationResult(const char* error_message) |
+ : error_message(error_message), |
+ code(Heap::the_hole_value()), |
+ num_registers(0) {} |
+ CompilationResult(Object* code, int registers) |
+ : error_message(NULL), |
+ code(code), |
+ num_registers(registers) {} |
+ const char* error_message; |
+ Object* code; |
+ int num_registers; |
+ }; |
+ static CompilationResult Compile(RegExpCompileData* input, |
+ bool ignore_case, |
+ bool multiline, |
+ Handle<String> pattern, |
+ bool is_ascii); |
+ |
static void DotPrint(const char* label, RegExpNode* node, bool ignore_case); |
}; |