Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(131)

Unified Diff: src/regexp-macro-assembler.h

Issue 165443: X64: Implement RegExp natively. (Closed)
Patch Set: Addressed review comments. Created 11 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/regexp-macro-assembler.h
diff --git a/src/regexp-macro-assembler.h b/src/regexp-macro-assembler.h
index 484986428b95d62b2296836371b5dff6bac097f0..7a3c8a8149884f118b5328348bd94597ed6095d3 100644
--- a/src/regexp-macro-assembler.h
+++ b/src/regexp-macro-assembler.h
@@ -46,6 +46,7 @@ class RegExpMacroAssembler {
enum IrregexpImplementation {
kIA32Implementation,
kARMImplementation,
+ kX64Implementation,
kBytecodeImplementation
};
@@ -67,12 +68,6 @@ class RegExpMacroAssembler {
virtual void Backtrack() = 0;
virtual void Bind(Label* label) = 0;
virtual void CheckAtStart(Label* on_at_start) = 0;
- // Check the current character against a bitmap. The range of the current
- // character must be from start to start + length_of_bitmap_in_bits.
- virtual void CheckBitmap(
- uc16 start, // The bitmap is indexed from this character.
- Label* bitmap, // Where the bitmap is emitted.
- Label* on_zero) = 0; // Where to go if the bit is 0. Fall through on 1.
// Dispatch after looking the current character up in a 2-bits-per-entry
// map. The destinations vector has up to 4 labels.
virtual void CheckCharacter(uint32_t c, Label* on_equal) = 0;
@@ -132,23 +127,6 @@ class RegExpMacroAssembler {
Label* on_no_match) {
return false;
}
- // Dispatch after looking the current character up in a byte map. The
- // destinations vector has up to 256 labels.
- virtual void DispatchByteMap(
- uc16 start,
- Label* byte_map,
- const Vector<Label*>& destinations) = 0;
- virtual void DispatchHalfNibbleMap(
- uc16 start,
- Label* half_nibble_map,
- const Vector<Label*>& destinations) = 0;
- // Dispatch after looking the high byte of the current character up in a byte
- // map. The destinations vector has up to 256 labels.
- virtual void DispatchHighByteMap(
- byte start,
- Label* byte_map,
- const Vector<Label*>& destinations) = 0;
- virtual void EmitOrLink(Label* label) = 0;
virtual void Fail() = 0;
virtual Handle<Object> GetCode(Handle<String> source) = 0;
virtual void GoTo(Label* label) = 0;
@@ -181,49 +159,49 @@ class RegExpMacroAssembler {
virtual void WriteCurrentPositionToRegister(int reg, int cp_offset) = 0;
virtual void ClearRegisters(int reg_from, int reg_to) = 0;
virtual void WriteStackPointerToRegister(int reg) = 0;
-
- private:
};
-struct ArraySlice {
+class NativeRegExpMacroAssembler: public RegExpMacroAssembler {
public:
- ArraySlice(Handle<ByteArray> array, size_t offset)
- : array_(array), offset_(offset) {}
- Handle<ByteArray> array() { return array_; }
- // Offset in the byte array data.
- size_t offset() { return offset_; }
- // Offset from the ByteArray pointer.
- size_t base_offset() {
- return ByteArray::kHeaderSize - kHeapObjectTag + offset_;
- }
- void* location() {
- return reinterpret_cast<void*>(array_->GetDataStartAddress() + offset_);
- }
- template <typename T>
- T& at(int idx) {
- return reinterpret_cast<T*>(array_->GetDataStartAddress() + offset_)[idx];
- }
- private:
- Handle<ByteArray> array_;
- size_t offset_;
-};
+ // Type of input string to generate code for.
+ enum Mode { ASCII = 1, UC16 = 2 };
+ // Result of calling generated native RegExp code.
+ // RETRY: Something significant changed during execution, and the matching
+ // should be retried from scratch.
+ // EXCEPTION: Something failed during execution. If no exception has been
+ // thrown, it's an internal out-of-memory, and the caller should
+ // throw the exception.
+ // FAILURE: Matching failed.
+ // SUCCESS: Matching succeeded, and the output array has been filled with
+ // capture positions.
+ enum Result { RETRY = -2, EXCEPTION = -1, FAILURE = 0, SUCCESS = 1 };
-class ByteArrayProvider {
- public:
- explicit ByteArrayProvider(unsigned int initial_size);
- // Provides a place to put "size" elements of size "element_size".
- // The information can be stored in the provided ByteArray at the "offset".
- // The offset is aligned to the element size.
- ArraySlice GetBuffer(unsigned int size,
- unsigned int element_size);
- template <typename T>
- ArraySlice GetBuffer(Vector<T> values);
- private:
- size_t byte_array_size_;
- Handle<ByteArray> current_byte_array_;
- int current_byte_array_free_offset_;
+ NativeRegExpMacroAssembler();
+ virtual ~NativeRegExpMacroAssembler();
+
+ static Result Match(Handle<Code> regexp,
+ Handle<String> subject,
+ int* offsets_vector,
+ int offsets_vector_length,
+ int previous_index);
+
+ // Compares two-byte strings case insensitively.
+ // Called from generated RegExp code.
+ static int CaseInsensitiveCompareUC16(Address byte_offset1,
+ Address byte_offset2,
+ size_t byte_length);
+
+ static const byte* StringCharacterPosition(String* subject, int start_index);
+
+ static Result Execute(Code* code,
+ String* input,
+ int start_offset,
+ const byte* input_start,
+ const byte* input_end,
+ int* output,
+ bool at_start);
};
} } // namespace v8::internal
« no previous file with comments | « src/jsregexp.cc ('k') | src/regexp-macro-assembler.cc » ('j') | src/regexp-macro-assembler.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698