[OTLayout] Start adding process() tracing
diff --git a/src/hb-ot-layout-gsubgpos-private.hh b/src/hb-ot-layout-gsubgpos-private.hh
index 47f8f6b..30c43bc 100644
--- a/src/hb-ot-layout-gsubgpos-private.hh
+++ b/src/hb-ot-layout-gsubgpos-private.hh
@@ -38,6 +38,12 @@
 
 
 
+#define TRACE_PROCESS(this) \
+	hb_auto_trace_t<context_t::max_debug_depth, typename context_t::return_t> trace \
+	(&c->debug_depth, c->get_name (), this, HB_FUNC, \
+	 "");
+
+
 #ifndef HB_DEBUG_CLOSURE
 #define HB_DEBUG_CLOSURE (HB_DEBUG+0)
 #endif
@@ -49,11 +55,13 @@
 
 struct hb_closure_context_t
 {
+  inline const char *get_name (void) { return "CLOSURE"; }
+  static const unsigned int max_debug_depth = HB_DEBUG_CLOSURE;
   typedef void_t return_t;
   typedef return_t (*recurse_func_t) (hb_closure_context_t *c, unsigned int lookup_index);
   template <typename T>
-  inline return_t process (const T &obj) { obj.closure (this); return void_t (); }
-  static return_t default_return_value (void) { return return_t (); }
+  inline return_t process (const T &obj) { obj.closure (this); return VOID; }
+  static return_t default_return_value (void) { return VOID; }
   bool stop_sublookup_iteration (const return_t r) const { return false; }
   return_t recurse (unsigned int lookup_index)
   {
@@ -96,6 +104,8 @@
 
 struct hb_would_apply_context_t
 {
+  inline const char *get_name (void) { return "WOULD_APPLY"; }
+  static const unsigned int max_debug_depth = HB_DEBUG_WOULD_APPLY;
   typedef bool return_t;
   template <typename T>
   inline return_t process (const T &obj) { return obj.would_apply (this); }
@@ -117,7 +127,7 @@
 			      glyphs (glyphs_),
 			      len (len_),
 			      zero_context (zero_context_),
-			      debug_depth (0) {};
+			      debug_depth (0) {}
 };
 
 
@@ -133,10 +143,12 @@
 
 struct hb_collect_glyphs_context_t
 {
+  inline const char *get_name (void) { return "COLLECT_GLYPHS"; }
+  static const unsigned int max_debug_depth = HB_DEBUG_COLLECT_GLYPHS;
   typedef void_t return_t;
   template <typename T>
-  inline return_t process (const T &obj) { obj.collect_glyphs (this); return void_t (); }
-  static return_t default_return_value (void) { return return_t (); }
+  inline return_t process (const T &obj) { obj.collect_glyphs (this); return VOID; }
+  static return_t default_return_value (void) { return VOID; }
   bool stop_iteration (const return_t r) const { return false; }
   return_t recurse (unsigned int lookup_index)
   {
@@ -163,22 +175,27 @@
 			      input  (glyphs_input  ? *glyphs_input  : *hb_set_get_empty ()),
 			      after  (glyphs_after  ? *glyphs_after  : *hb_set_get_empty ()),
 			      output (glyphs_output ? *glyphs_output : *hb_set_get_empty ()),
-			      debug_depth (0) {};
+			      debug_depth (0) {}
 };
 
 
 
 struct hb_get_coverage_context_t
 {
+  inline const char *get_name (void) { return "GET_COVERAGE"; }
+  static const unsigned int max_debug_depth = 0;
   typedef const Coverage &return_t;
   template <typename T>
   inline return_t process (const T &obj) { return obj.get_coverage (); }
-  static const return_t default_return_value (void) { return Null(Coverage); }
+  static return_t default_return_value (void) { return Null(Coverage); }
   bool stop_sublookup_iteration (const return_t r) const { return true; /* Unused */ }
   return_t recurse (unsigned int lookup_index)
   { return default_return_value (); }
 
-  hb_get_coverage_context_t (void) {}
+  hb_get_coverage_context_t (void) :
+			    debug_depth (0) {}
+
+  unsigned int debug_depth;
 };
 
 
@@ -194,6 +211,8 @@
 
 struct hb_apply_context_t
 {
+  inline const char *get_name (void) { return "APPLY"; }
+  static const unsigned int max_debug_depth = HB_DEBUG_APPLY;
   typedef bool return_t;
   typedef return_t (*recurse_func_t) (hb_apply_context_t *c, unsigned int lookup_index);
   template <typename T>
@@ -205,6 +224,7 @@
     if (unlikely (nesting_level_left == 0 || !recurse_func))
       return default_return_value ();
 
+    /* TODO Reuse context. */
     hb_apply_context_t new_c (*this);
     new_c.nesting_level_left--;
     return recurse_func (&new_c, lookup_index);
@@ -219,9 +239,9 @@
   unsigned int nesting_level_left;
   unsigned int lookup_props;
   unsigned int property; /* propety of first glyph */
-  unsigned int debug_depth;
   const GDEF &gdef;
   bool has_glyph_classes;
+  unsigned int debug_depth;
 
 
   hb_apply_context_t (hb_font_t *font_,
@@ -232,9 +252,10 @@
 			lookup_mask (lookup_mask_),
 			recurse_func (NULL),
 			nesting_level_left (MAX_NESTING_LEVEL),
-			lookup_props (0), property (0), debug_depth (0),
+			lookup_props (0), property (0),
 			gdef (*hb_ot_layout_from_face (face)->gdef),
-			has_glyph_classes (gdef.has_glyph_classes ()) {}
+			has_glyph_classes (gdef.has_glyph_classes ()),
+			debug_depth (0) {}
 
   void set_recurse_func (recurse_func_t func) { recurse_func = func; }
   void set_lookup_props (unsigned int lookup_props_) { lookup_props = lookup_props_; }
@@ -1693,6 +1714,7 @@
   template <typename context_t>
   inline typename context_t::return_t process (context_t *c) const
   {
+    TRACE_PROCESS (this);
     switch (u.format) {
     case 1: return c->process (u.format1);
     case 2: return c->process (u.format2);
diff --git a/src/hb-private.hh b/src/hb-private.hh
index 34f2e15..b5d417c 100644
--- a/src/hb-private.hh
+++ b/src/hb-private.hh
@@ -63,7 +63,9 @@
 
 
 /* Void! */
-typedef struct {} void_t;
+struct _void_t;
+typedef const _void_t &void_t;
+#define VOID (* (const _void_t *) NULL)
 
 
 /* Basics */
@@ -718,7 +720,7 @@
     if (plevel) --*plevel;
   }
 
-  inline ret_t ret (ret_t v, unsigned int line = 0)
+  inline ret_t &ret (ret_t &v, unsigned int line = 0)
   {
     if (unlikely (returned)) {
       fprintf (stderr, "OUCH, double calls to TRACE_RETURN.  This is a bug, please report.\n");