summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeal H. Walfield <neal@gnu.org>2009-03-17 20:31:22 +0100
committerNeal H. Walfield <neal@gnu.org>2009-03-17 20:31:22 +0100
commitb8ed270b55f50f25379f2c236fff41afe41ab12d (patch)
tree4ff4a9fe2b14296de02c2953e888b1cb9b7cdb3c
parent979756b27981ecd8983716e022b408512ababf48 (diff)
Replace some macros with inline functions.
-rw-r--r--viengoos/object.h87
1 files changed, 52 insertions, 35 deletions
diff --git a/viengoos/object.h b/viengoos/object.h
index 9452add..52b4c4c 100644
--- a/viengoos/object.h
+++ b/viengoos/object.h
@@ -225,6 +225,58 @@ struct object_desc
is cheap but problematic if there are large holes in the physical
memory map. */
extern struct object_desc *object_descs;
+
+static inline void
+object_desc_p (struct object_desc *desc)
+{
+ struct object_desc *first = object_descs;
+ struct object_desc *last = &object_descs[(last_frame - first_frame)
+ / PAGESIZE];
+
+ assertx ((uintptr_t) first <= (uintptr_t) desc
+ && (uintptr_t) desc <= (uintptr_t) last,
+ "Invalid object desc: %"PRIxPTR" <= %"PRIxPTR" <= %"PRIxPTR,
+ (uintptr_t) first, (uintptr_t) desc, (uintptr_t) last);
+}
+
+static inline int
+object_desc_index(struct object_desc *desc)
+{
+ object_desc_p (desc);
+ return ((uintptr_t) desc - (uintptr_t) object_descs)
+ / sizeof (struct object_desc);
+}
+
+/* Return the object corresponding to the object descriptor DESC. */
+static struct vg_object *
+object_desc_to_object(struct object_desc *desc)
+{
+ return (struct vg_object *)
+ (first_frame + object_desc_index (desc) * PAGESIZE);
+}
+
+/* Return the object descriptor corresponding to the object
+ OBJECT. */
+static struct object_desc *
+object_to_object_desc (struct vg_object *object)
+{
+ /* Objects better be on a page boundary. */
+ assert (((uintptr_t) object & (PAGESIZE - 1)) == 0);
+ /* And they better be in memory. */
+ assertx (first_frame <= (uintptr_t) object,
+ "%"PRIxPTR" <= %p <= %"PRIxPTR,
+ first_frame, object, last_frame);
+ assertx ((uintptr_t) object <= last_frame,
+ "%"PRIxPTR" <= %p <= %"PRIxPTR,
+ first_frame, object, last_frame);
+
+ struct object_desc *desc = &object_descs[((uintptr_t) object - first_frame)
+ / PAGESIZE];
+ object_desc_p (desc);
+
+ return desc;
+}
+
/* This does not really belong here but there isn't really a better
place. The first reason is that it relies on the definition of
@@ -303,41 +355,6 @@ extern struct vg_object *memory_object_alloc (struct activity *activity,
extern void memory_object_destroy (struct activity *activity,
struct vg_object *object);
-/* Return the object corresponding to the object descriptor DESC. */
-#define object_desc_to_object(desc_) \
- ({ \
- struct object_desc *desc__ = (desc_); \
- /* There is only one legal area for descriptors. */ \
- assertx ((uintptr_t) object_descs <= (uintptr_t) (desc__), \
- "%"PRIxPTR" > %"PRIxPTR, \
- (uintptr_t) object_descs, (uintptr_t) (desc__)); \
- assert ((uintptr_t) (desc__) \
- <= (uintptr_t) &object_descs[(last_frame - first_frame) \
- / PAGESIZE]); \
- \
- (struct vg_object *) (first_frame \
- + (((uintptr_t) (desc__) - (uintptr_t) object_descs) \
- / sizeof (struct object_desc)) * PAGESIZE); \
- })
-
-/* Return the object descriptor corresponding to the object
- OBJECT. */
-#define object_to_object_desc(object_) \
- ({ \
- struct vg_object *object__ = (object_); \
- /* Objects better be on a page boundary. */ \
- assert (((uintptr_t) (object__) & (PAGESIZE - 1)) == 0); \
- /* And they better be in memory. */ \
- assertx (first_frame <= (uintptr_t) (object__), \
- "%"PRIxPTR" <= %p <= %"PRIxPTR, \
- first_frame, object__, last_frame); \
- assertx ((uintptr_t) (object__) <= last_frame, \
- "%"PRIxPTR" <= %p <= %"PRIxPTR, \
- first_frame, object__, last_frame); \
- \
- &object_descs[((uintptr_t) (object__) - first_frame) / PAGESIZE]; \
- })
-
/* Return a vg_cap referencing the object designated by OBJECT_DESC. */
static inline struct vg_cap
object_desc_to_cap (struct object_desc *desc)