+ Helpers for the metacircular interpreter.
+ -------------------------------------------------------------------------- */
+
+#ifdef GHCI
+
+#define CHASE_INDIRECTIONS(lval) \
+ do { \
+ int again; \
+ do { \
+ again = 0; \
+ if (get_itbl((StgClosure*)lval)->type == IND) \
+ { again = 1; lval = ((StgInd*)lval)->indirectee; } \
+ else \
+ if (get_itbl((StgClosure*)lval)->type == IND_OLDGEN) \
+ { again = 1; lval = ((StgIndOldGen*)lval)->indirectee; } \
+ } while (again); \
+ } while (0)
+
+#define indexWordOffClosurezh(r,a,i) \
+ do { StgClosure* tmp = (StgClosure*)(a); \
+ CHASE_INDIRECTIONS(tmp); \
+ r = ((W_ *)tmp)[i]; \
+ } while (0)
+
+#define indexPtrOffClosurezh(r,a,i) \
+ do { StgClosure* tmp = (StgClosure*)(a); \
+ CHASE_INDIRECTIONS(tmp); \
+ r = ((P_ *)tmp)[i]; \
+ } while (0)
+
+#endif
+
+/* -----------------------------------------------------------------------------