+/* -----------------------------------------------------------------------------
+ Threading / unthreading pointers.
+
+ The basic idea here is to chain together all the fields pointing at
+ a particular object, with the root of the chain in the object's
+ info table field. The original contents of the info pointer goes
+ at the end of the chain.
+
+ Adding a new field to the chain is a matter of swapping the
+ contents of the field with the contents of the object's info table
+ field.
+
+ To unthread the chain, we walk down it updating all the fields on
+ the chain with the new location of the object. We stop when we
+ reach the info pointer at the end.
+
+ We use a trick to identify the info pointer, because the
+ LOOKS_LIKE_GHC_INFO() macro involves a function call and can be
+ expensive. The trick is that when swapping pointers for threading,
+ we set the low bit of the original pointer, with the result that
+ all the pointers in the chain have their low bits set except for
+ the info pointer.
+ -------------------------------------------------------------------------- */
+