#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) \
)