diff options
Diffstat (limited to 'src/include/utils/relptr.h')
-rw-r--r-- | src/include/utils/relptr.h | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/src/include/utils/relptr.h b/src/include/utils/relptr.h index e71c7d0bdca..2ed4b5187d1 100644 --- a/src/include/utils/relptr.h +++ b/src/include/utils/relptr.h @@ -42,7 +42,7 @@ #define relptr_access(base, rp) \ (AssertVariableIsOfTypeMacro(base, char *), \ (__typeof__((rp).relptr_type)) ((rp).relptr_off == 0 ? NULL : \ - (base + (rp).relptr_off))) + (base) + (rp).relptr_off - 1)) #else /* * If we don't have __builtin_types_compatible_p, assume we might not have @@ -50,12 +50,15 @@ */ #define relptr_access(base, rp) \ (AssertVariableIsOfTypeMacro(base, char *), \ - (void *) ((rp).relptr_off == 0 ? NULL : (base + (rp).relptr_off))) + (void *) ((rp).relptr_off == 0 ? NULL : (base) + (rp).relptr_off - 1)) #endif #define relptr_is_null(rp) \ ((rp).relptr_off == 0) +#define relptr_offset(rp) \ + ((rp).relptr_off - 1) + /* We use this inline to avoid double eval of "val" in relptr_store */ static inline Size relptr_store_eval(char *base, char *val) @@ -64,8 +67,8 @@ relptr_store_eval(char *base, char *val) return 0; else { - Assert(val > base); - return val - base; + Assert(val >= base); + return val - base + 1; } } @@ -73,7 +76,7 @@ relptr_store_eval(char *base, char *val) #define relptr_store(base, rp, val) \ (AssertVariableIsOfTypeMacro(base, char *), \ AssertVariableIsOfTypeMacro(val, __typeof__((rp).relptr_type)), \ - (rp).relptr_off = relptr_store_eval(base, (char *) (val))) + (rp).relptr_off = relptr_store_eval((base), (char *) (val))) #else /* * If we don't have __builtin_types_compatible_p, assume we might not have @@ -81,7 +84,7 @@ relptr_store_eval(char *base, char *val) */ #define relptr_store(base, rp, val) \ (AssertVariableIsOfTypeMacro(base, char *), \ - (rp).relptr_off = relptr_store_eval(base, (char *) (val))) + (rp).relptr_off = relptr_store_eval((base), (char *) (val))) #endif #define relptr_copy(rp1, rp2) \ |