aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/include/storage/bufpage.h23
1 files changed, 20 insertions, 3 deletions
diff --git a/src/include/storage/bufpage.h b/src/include/storage/bufpage.h
index 2ce3be765c0..bdf7b0d3c58 100644
--- a/src/include/storage/bufpage.h
+++ b/src/include/storage/bufpage.h
@@ -298,14 +298,31 @@ typedef PageHeaderData *PageHeader;
((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) \
)