Index: src/ia32/regexp-macro-assembler-ia32.cc |
diff --git a/src/ia32/regexp-macro-assembler-ia32.cc b/src/ia32/regexp-macro-assembler-ia32.cc |
index e75c134e7a4f66515a583ecf529a9767d5610867..cba166078914225e56a179c8453f01ee086d0c02 100644 |
--- a/src/ia32/regexp-macro-assembler-ia32.cc |
+++ b/src/ia32/regexp-macro-assembler-ia32.cc |
@@ -790,6 +790,18 @@ Handle<HeapObject> RegExpMacroAssemblerIA32::GetCode(Handle<String> source) { |
// position registers. |
__ mov(Operand(ebp, kInputStartMinusOne), eax); |
+#ifdef WIN32 |
+ // Ensure that we write to each stack page, in order. Skipping a page |
+ // on Windows can cause segmentation faults. Assuming page size is 4k. |
+ const int kPageSize = 4096; |
+ const int kRegistersPerPage = kPageSize / kPointerSize; |
+ for (int i = num_saved_registers_ + kRegistersPerPage - 1; |
+ i < num_registers_; |
+ i += kRegistersPerPage) { |
+ __ mov(register_location(i), eax); // One write every page. |
+ } |
+#endif // WIN32 |
+ |
Label load_char_start_regexp, start_regexp; |
// Load newline if index is at start, previous character otherwise. |
__ cmp(Operand(ebp, kStartIndex), Immediate(0)); |