Index: src/x64/regexp-macro-assembler-x64.cc |
diff --git a/src/x64/regexp-macro-assembler-x64.cc b/src/x64/regexp-macro-assembler-x64.cc |
index 9b07f68e31241f25463975e3575655ffa734bfae..13a4caa3fbca8862aa3efc18fca1fde18d1727a6 100644 |
--- a/src/x64/regexp-macro-assembler-x64.cc |
+++ b/src/x64/regexp-macro-assembler-x64.cc |
@@ -855,6 +855,18 @@ Handle<HeapObject> RegExpMacroAssemblerX64::GetCode(Handle<String> source) { |
// position registers. |
__ movq(Operand(rbp, kInputStartMinusOne), rax); |
+#ifdef WIN32 |
+ // Ensure that we have written 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) { |
+ __ movq(register_location(i), rax); // One write every page. |
+ } |
+#endif // WIN32 |
+ |
// Initialize code object pointer. |
__ Move(code_object_pointer(), masm_.CodeObject()); |