Turn special page pointer validation to static inline function
authorKevin Grittner <kgrittn@postgresql.org>
Sat, 9 Apr 2016 13:17:22 +0000 (08:17 -0500)
committerKevin Grittner <kgrittn@postgresql.org>
Sat, 9 Apr 2016 13:17:22 +0000 (08:17 -0500)
Inclusion of multiple macros inside another macro was pushing MSVC
past its size liimit.  Reported by buildfarm.

src/include/storage/bufpage.h

index 2ce3be765c0154699e1307e9d0b3a98be2ae9fc4..bdf7b0d3c582c20250edc58ca095417d5ed7845a 100644 (file)
@@ -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) \
 )