From 56dffb5a73ab157fc8d35a76c1170d656a051f14 Mon Sep 17 00:00:00 2001
From: Kevin Grittner <kgrittn@postgresql.org>
Date: Sat, 9 Apr 2016 08:17:22 -0500
Subject: [PATCH] Turn special page pointer validation to static inline
 function

Inclusion of multiple macros inside another macro was pushing MSVC
past its size liimit.  Reported by buildfarm.
---
 src/include/storage/bufpage.h | 23 ++++++++++++++++++++---
 1 file changed, 20 insertions(+), 3 deletions(-)

diff --git a/src/include/storage/bufpage.h b/src/include/storage/bufpage.h
index 2ce3be765c..bdf7b0d3c5 100644
--- a/src/include/storage/bufpage.h
+++ b/src/include/storage/bufpage.h
@@ -297,15 +297,32 @@ typedef PageHeaderData *PageHeader;
 #define PageGetSpecialSize(page) \
 	((uint16) (PageGetPageSize(page) - ((PageHeader)(page))->pd_special))
 
+/*
+ * Using assertions, validate that the page special pointer is OK.
+ *
+ * This is intended to catch use of the pointer before page initialization.
+ * It is implemented as a function do to the limitations of the MSVC compiler,
+ * which choked on doing all these tests within another macro.  We return true
+ * so that MacroAssert() can be used while still getting the specifics from
+ * the macro failure within this function.
+ */
+static inline bool
+PageValidateSpecialPointer(Page page)
+{
+	Assert(PageIsValid(page));
+	Assert(((PageHeader) (page))->pd_special <= BLCKSZ);
+	Assert(((PageHeader) (page))->pd_special >= SizeOfPageHeaderData);
+
+	return true;
+}
+
 /*
  * PageGetSpecialPointer
  *		Returns pointer to special space on a page.
  */
 #define PageGetSpecialPointer(page) \
 ( \
-	AssertMacro(PageIsValid(page)), \
-	AssertMacro(((PageHeader) (page))->pd_special <= BLCKSZ), \
-	AssertMacro(((PageHeader) (page))->pd_special >= SizeOfPageHeaderData), \
+	AssertMacro(PageValidateSpecialPointer(page)), \
 	(char *) ((char *) (page) + ((PageHeader) (page))->pd_special) \
 )
 
-- 
2.40.0