Index: src/ia32/lithium-codegen-ia32.cc |
diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc |
index 033667b1c72b00be64c24b1ba205faec36b2df95..37c96b75e29fe8d8d589b2d868c280a136f57e42 100644 |
--- a/src/ia32/lithium-codegen-ia32.cc |
+++ b/src/ia32/lithium-codegen-ia32.cc |
@@ -139,6 +139,18 @@ bool LCodeGen::GeneratePrologue() { |
__ j(not_zero, &loop); |
} else { |
__ sub(Operand(esp), Immediate(slots * kPointerSize)); |
+#ifdef _MSC_VER |
+ // On windows, you may not access the stack more than one page below |
+ // the most recently mapped page. To make the allocated area randomly |
+ // accessible, we write to each page in turn (the value is irrelevant). |
+ const int kPageSize = 4 * KB; |
+ for (int offset = slots * kPointerSize - kPageSize; |
+ offset > 0; |
+ offset -= kPageSize) { |
+ __ mov(Operand(esp, offset), eax); |
+ } |
+#endif |
+ |
} |
} |