Make sanitize_depth variable automatic and not passed through function args
diff --git a/src/hb-open-type-private.hh b/src/hb-open-type-private.hh
index 72dd3c8..dcaea21 100644
--- a/src/hb-open-type-private.hh
+++ b/src/hb-open-type-private.hh
@@ -112,6 +112,26 @@
 #define Null(Type) Null<Type>()
 
 
+/*
+ * Debug
+ */
+
+/* Helper object to increment debug_depth and decrement
+ * when returning from the object. */
+template <int debug_level>
+struct hb_auto_debug_depth_t {
+  explicit hb_auto_debug_depth_t (unsigned int *p) : p(p) { ++*p; }
+  ~hb_auto_debug_depth_t (void) { --*p; }
+
+  private:
+  unsigned int *p;
+};
+template <> /* Optimize when debugging is disabled */
+struct hb_auto_debug_depth_t<0> {
+  explicit hb_auto_debug_depth_t (unsigned int *p) {}
+};
+
+
 
 /*
  * Sanitize
@@ -121,19 +141,17 @@
 #define HB_DEBUG_SANITIZE HB_DEBUG+0
 #endif
 
+
 #define TRACE_SANITIZE() \
-	HB_STMT_START { \
-	  if (HB_DEBUG_SANITIZE) \
-		  _hb_trace ("SANITIZE", HB_FUNC, this, sanitize_depth, HB_DEBUG_SANITIZE); \
-	} HB_STMT_END
+	hb_auto_debug_depth_t<HB_DEBUG_SANITIZE> auto_debug_depth (&context->debug_depth); \
+	if (HB_DEBUG_SANITIZE) \
+	  _hb_trace ("SANITIZE", HB_FUNC, this, context->debug_depth, HB_DEBUG_SANITIZE); \
 
 
 #define SANITIZE_ARG_DEF \
-	hb_sanitize_context_t *context, \
-	unsigned int sanitize_depth HB_UNUSED
+	hb_sanitize_context_t *context
 #define SANITIZE_ARG \
-	context, \
-	(HB_DEBUG_SANITIZE ? sanitize_depth + 1 : 0)
+	context
 
 struct hb_sanitize_context_t
 {
@@ -144,6 +162,7 @@
     this->end = this->start + hb_blob_get_length (blob);
     this->writable = hb_blob_is_writable (blob);
     this->edit_count = 0;
+    this->debug_depth = 0;
 
     if (HB_DEBUG_SANITIZE)
       fprintf (stderr, "sanitize %p init [%p..%p] (%u bytes)\n",
@@ -162,18 +181,16 @@
     this->start = this->end = NULL;
   }
 
-  inline bool check (unsigned int sanitize_depth,
-		     const char *base,
-		     unsigned int len) const
+  inline bool check (const char *base, unsigned int len) const
   {
     bool ret = this->start <= base &&
 	       base <= this->end &&
 	       (unsigned int) (this->end - base) >= len;
 
-    if (HB_DEBUG_SANITIZE && (int) sanitize_depth < (int) HB_DEBUG_SANITIZE) \
+    if (HB_DEBUG_SANITIZE && (int) this->debug_depth < (int) HB_DEBUG_SANITIZE) \
       fprintf (stderr, "SANITIZE(%p) %-*d-> check [%p..%p] (%d bytes) in [%p..%p] -> %s\n", \
 	       base,
-	       sanitize_depth, sanitize_depth,
+	       this->debug_depth, this->debug_depth,
 	       base, base+len, len,
 	       this->start, this->end,
 	       ret ? "pass" : "FAIL");
@@ -181,35 +198,30 @@
     return ret;
   }
 
-  inline bool check_array (unsigned int sanitize_depth,
-			   const char *base,
-			   unsigned int record_size,
-			   unsigned int len) const
+  inline bool check_array (const char *base, unsigned int record_size, unsigned int len) const
   {
     bool overflows = len >= ((unsigned int) -1) / record_size;
 
 
-    if (HB_DEBUG_SANITIZE && (int) sanitize_depth < (int) HB_DEBUG_SANITIZE)
+    if (HB_DEBUG_SANITIZE && (int) this->debug_depth < (int) HB_DEBUG_SANITIZE)
       fprintf (stderr, "SANITIZE(%p) %-*d-> array [%p..%p] (%d*%d=%ld bytes) in [%p..%p] -> %s\n", \
 	       base,
-	       sanitize_depth, sanitize_depth,
+	       this->debug_depth, this->debug_depth,
 	       base, base + (record_size * len), record_size, len, (unsigned long) record_size * len,
 	       this->start, this->end,
 	       !overflows ? "does not overflow" : "OVERFLOWS FAIL");
 
-    return likely (!overflows) && this->check (sanitize_depth, base, record_size * len);
+    return likely (!overflows) && this->check (base, record_size * len);
   }
 
-  inline bool can_edit (unsigned int sanitize_depth,
-			const char *base HB_UNUSED,
-			unsigned int len HB_UNUSED)
+  inline bool can_edit (const char *base HB_UNUSED, unsigned int len HB_UNUSED)
   {
     this->edit_count++;
 
-    if (HB_DEBUG_SANITIZE && (int) sanitize_depth < (int) HB_DEBUG_SANITIZE)
+    if (HB_DEBUG_SANITIZE && (int) this->debug_depth < (int) HB_DEBUG_SANITIZE)
       fprintf (stderr, "SANITIZE(%p) %-*d-> edit(%u) [%p..%p] (%d bytes) in [%p..%p] -> %s\n", \
 	       base,
-	       sanitize_depth, sanitize_depth,
+	       this->debug_depth, this->debug_depth,
 	       this->edit_count,
 	       base, base+len, len,
 	       this->start, this->end,
@@ -225,6 +237,9 @@
 
   inline void reset_edit_count (void) { this->edit_count = 0; }
 
+  public:
+  unsigned int debug_depth;
+
   private:
   const char *start, *end;
   bool writable;
@@ -239,9 +254,9 @@
 
 #define SANITIZE_SELF() SANITIZE_MEM(this, sizeof (*this))
 
-#define SANITIZE_MEM(B,L) likely (context->check (sanitize_depth, CharP(B), (L)))
+#define SANITIZE_MEM(B,L) likely (context->check (CharP(B), (L)))
 
-#define SANITIZE_ARRAY(A,S,L) likely (context->check_array (sanitize_depth, CharP(A), S, L))
+#define SANITIZE_ARRAY(A,S,L) likely (context->check_array (CharP(A), S, L))
 
 
 /* Template to sanitize an object. */
@@ -250,7 +265,6 @@
 {
   static hb_blob_t *sanitize (hb_blob_t *blob) {
     hb_sanitize_context_t context[1];
-    unsigned int sanitize_depth = 0;
     bool sane;
 
     /* TODO is_sane() stuff */
@@ -464,7 +478,7 @@
   private:
   /* Set the offset to Null */
   inline bool neuter (SANITIZE_ARG_DEF) {
-    if (context->can_edit (sanitize_depth, CharP(this), this->get_size ())) {
+    if (context->can_edit (CharP(this), this->get_size ())) {
       this->set (0); /* 0 is Null offset */
       return true;
     }