Fix compile, make slice.c respect sub_refcount
diff --git a/src/core/lib/slice/slice.c b/src/core/lib/slice/slice.c
index 8188ba9..aecee88 100644
--- a/src/core/lib/slice/slice.c
+++ b/src/core/lib/slice/slice.c
@@ -43,7 +43,7 @@
 
 grpc_slice grpc_empty_slice(void) {
   grpc_slice out;
-  out.refcount = 0;
+  out.refcount = NULL;
   out.data.inlined.length = 0;
   return out;
 }
@@ -129,6 +129,7 @@
   new_slice_refcount *rc = gpr_malloc(sizeof(new_slice_refcount));
   gpr_ref_init(&rc->refs, 1);
   rc->rc.vtable = &new_slice_vtable;
+  rc->rc.sub_refcount = &rc->rc;
   rc->user_destroy = destroy;
   rc->user_data = user_data;
 
@@ -177,6 +178,7 @@
       gpr_malloc(sizeof(new_with_len_slice_refcount));
   gpr_ref_init(&rc->refs, 1);
   rc->rc.vtable = &new_with_len_vtable;
+  rc->rc.sub_refcount = &rc->rc;
   rc->user_destroy = destroy;
   rc->user_data = p;
   rc->user_length = len;
@@ -238,6 +240,7 @@
     gpr_ref_init(&rc->refs, 1);
 
     rc->base.vtable = &malloc_vtable;
+    rc->base.sub_refcount = &rc->base;
 
     /* Build up the slice to be returned. */
     /* The slices refcount points back to the allocated block. */
@@ -264,7 +267,7 @@
     GPR_ASSERT(source.data.refcounted.length >= end);
 
     /* Build the result */
-    subset.refcount = source.refcount;
+    subset.refcount = source.refcount->sub_refcount;
     /* Point into the source array */
     subset.data.refcounted.bytes = source.data.refcounted.bytes + begin;
     subset.data.refcounted.length = end - begin;
@@ -317,7 +320,7 @@
              tail_length);
     } else {
       /* Build the result */
-      tail.refcount = source->refcount;
+      tail.refcount = source->refcount->sub_refcount;
       /* Bump the refcount */
       tail.refcount->vtable->ref(tail.refcount);
       /* Point into the source array */
@@ -355,7 +358,7 @@
     GPR_ASSERT(source->data.refcounted.length >= split);
 
     /* Build the result */
-    head.refcount = source->refcount;
+    head.refcount = source->refcount->sub_refcount;
     /* Bump the refcount */
     head.refcount->vtable->ref(head.refcount);
     /* Point into the source array */
diff --git a/src/core/lib/slice/slice_intern.c b/src/core/lib/slice/slice_intern.c
index 3cae8a9..753bdcc 100644
--- a/src/core/lib/slice/slice_intern.c
+++ b/src/core/lib/slice/slice_intern.c
@@ -176,7 +176,7 @@
 }
 
 uint32_t grpc_static_slice_hash(grpc_slice s) {
-  int id = grpc_static_metadata_index(s);
+  int id = GRPC_STATIC_METADATA_INDEX(s);
   if (id == -1) {
     return grpc_slice_default_hash_impl(s);
   }
@@ -184,8 +184,8 @@
 }
 
 int grpc_static_slice_eq(grpc_slice a, grpc_slice b) {
-  int id_a = grpc_static_metadata_index(a);
-  int id_b = grpc_static_metadata_index(b);
+  int id_a = GRPC_STATIC_METADATA_INDEX(a);
+  int id_b = GRPC_STATIC_METADATA_INDEX(b);
   if (id_a == -1 || id_b == -1) {
     return grpc_slice_default_eq_impl(a, b);
   }
@@ -198,7 +198,7 @@
 }
 
 void grpc_slice_static_intern(grpc_slice *slice) {
-  if (grpc_is_static_metadata_string(*slice)) {
+  if (GRPC_IS_STATIC_METADATA_STRING(*slice)) {
     return;
   }
 
@@ -217,11 +217,11 @@
 
 bool grpc_slice_is_interned(grpc_slice slice) {
   return (slice.refcount && slice.refcount->vtable == &interned_slice_vtable) ||
-         grpc_is_static_metadata_string(slice);
+         GRPC_IS_STATIC_METADATA_STRING(slice);
 }
 
 grpc_slice grpc_slice_intern(grpc_slice slice) {
-  if (grpc_is_static_metadata_string(slice)) {
+  if (GRPC_IS_STATIC_METADATA_STRING(slice)) {
     return slice;
   }
 
diff --git a/src/core/lib/transport/metadata.c b/src/core/lib/transport/metadata.c
index 650f6cc..ce5f85b 100644
--- a/src/core/lib/transport/metadata.c
+++ b/src/core/lib/transport/metadata.c
@@ -260,10 +260,10 @@
     return GRPC_MAKE_MDELEM(allocated, GRPC_MDELEM_STORAGE_ALLOCATED);
   }
 
-  if (grpc_is_static_metadata_string(key) &&
-      grpc_is_static_metadata_string(value)) {
+  if (GRPC_IS_STATIC_METADATA_STRING(key) &&
+      GRPC_IS_STATIC_METADATA_STRING(value)) {
     grpc_mdelem static_elem = grpc_static_mdelem_for_static_strings(
-        grpc_static_metadata_index(key), grpc_static_metadata_index(value));
+        GRPC_STATIC_METADATA_INDEX(key), GRPC_STATIC_METADATA_INDEX(value));
     if (!GRPC_MDISNULL(static_elem)) {
       return static_elem;
     }
diff --git a/src/core/lib/transport/static_metadata.c b/src/core/lib/transport/static_metadata.c
index 13a0fa3..588c098 100644
--- a/src/core/lib/transport/static_metadata.c
+++ b/src/core/lib/transport/static_metadata.c
@@ -832,8 +832,8 @@
     15, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0,  0,  0, 0, 0, 0};
 
 grpc_metadata_batch_callouts_index grpc_batch_index_of(grpc_slice slice) {
-  if (!grpc_is_static_metadata_string(slice)) return GRPC_BATCH_CALLOUTS_COUNT;
-  uint32_t idx = (uint32_t)grpc_static_metadata_index(slice);
+  if (!GRPC_IS_STATIC_METADATA_STRING(slice)) return GRPC_BATCH_CALLOUTS_COUNT;
+  uint32_t idx = (uint32_t)GRPC_STATIC_METADATA_INDEX(slice);
   uint32_t hash = batch_phash(idx);
   if (hash < GPR_ARRAY_SIZE(batch_hash_to_idx) &&
       batch_hash_to_idx[hash] == idx)
diff --git a/src/core/lib/transport/static_metadata.h b/src/core/lib/transport/static_metadata.h
index e03bf24..c9cceeb 100644
--- a/src/core/lib/transport/static_metadata.h
+++ b/src/core/lib/transport/static_metadata.h
@@ -247,19 +247,15 @@
 #define GRPC_MDSTR_IDENTITY_COMMA_DEFLATE_COMMA_GZIP \
   (grpc_static_slice_table[97])
 
-bool grpc_is_static_metadata_string(grpc_slice slice);
-
 extern const grpc_slice_refcount_vtable grpc_static_metadata_vtable;
 extern grpc_slice_refcount
     grpc_static_metadata_refcounts[GRPC_STATIC_MDSTR_COUNT];
-bool grpc_is_static_metadata_string(grpc_slice slice) {
-  return slice.refcount != NULL &&
-         slice.refcount->vtable == &grpc_static_metadata_vtable;
-}
+#define GRPC_IS_STATIC_METADATA_STRING(slice) \
+  ((slice).refcount != NULL &&                \
+   (slice).refcount->vtable == &grpc_static_metadata_vtable)
 
-inline int grpc_static_metadata_index(grpc_slice slice) {
-  return (int)(slice.refcount - grpc_static_metadata_refcounts);
-}
+#define GRPC_STATIC_METADATA_INDEX(static_slice) \
+  ((int)((static_slice).refcount - grpc_static_metadata_refcounts))
 
 #define GRPC_STATIC_MDELEM_COUNT 81
 extern grpc_mdelem_data grpc_static_mdelem_table[GRPC_STATIC_MDELEM_COUNT];
diff --git a/tools/codegen/core/gen_static_metadata.py b/tools/codegen/core/gen_static_metadata.py
index 027719f..7d363a9 100755
--- a/tools/codegen/core/gen_static_metadata.py
+++ b/tools/codegen/core/gen_static_metadata.py
@@ -343,8 +343,6 @@
   print >>H, '/* "%s" */' % elem
   print >>H, '#define %s (grpc_static_slice_table[%d])' % (mangle(elem).upper(), i)
 print >>H
-print >>H, 'bool grpc_is_static_metadata_string(grpc_slice slice);'
-print >>H
 print >>C, 'static uint8_t g_bytes[] = {%s};' % (','.join('%d' % ord(c) for c in ''.join(all_strs)))
 print >>C
 print >>C, 'static void static_ref(void *unused) {}'
@@ -359,18 +357,16 @@
   print >>C, '  {&grpc_static_metadata_vtable, &static_sub_refcnt},'
 print >>C, '};'
 print >>C
-print >>H, 'bool grpc_is_static_metadata_string(grpc_slice slice) {'
-print >>H, '  return slice.refcount != NULL && slice.refcount->vtable == &grpc_static_metadata_vtable;'
-print >>H, '}'
+print >>H, '#define GRPC_IS_STATIC_METADATA_STRING(slice) \\'
+print >>H, '  ((slice).refcount != NULL && (slice).refcount->vtable == &grpc_static_metadata_vtable)'
 print >>H
 print >>C, 'const grpc_slice grpc_static_slice_table[GRPC_STATIC_MDSTR_COUNT] = {'
 for i, elem in enumerate(all_strs):
   print >>C, slice_def(i) + ','
 print >>C, '};'
 print >>C
-print >>H, 'inline int grpc_static_metadata_index(grpc_slice slice) {'
-print >>H, '  return (int)(slice.refcount - grpc_static_metadata_refcounts);'
-print >>H, '}'
+print >>H, '#define GRPC_STATIC_METADATA_INDEX(static_slice) \\'
+print >>H, '  ((int)((static_slice).refcount - grpc_static_metadata_refcounts))'
 print >>H
 
 print >>D, '# hpack fuzzing dictionary'
@@ -511,8 +507,8 @@
 print >>C, 'static const uint8_t batch_hash_to_idx[] = {%s};' % ','.join('%d' % n for n in batch_hash_to_idx)
 print >>C
 print >>C, 'grpc_metadata_batch_callouts_index grpc_batch_index_of(grpc_slice slice) {'
-print >>C, '  if (!grpc_is_static_metadata_string(slice)) return GRPC_BATCH_CALLOUTS_COUNT;'
-print >>C, '  uint32_t idx = (uint32_t)grpc_static_metadata_index(slice);'
+print >>C, '  if (!GRPC_IS_STATIC_METADATA_STRING(slice)) return GRPC_BATCH_CALLOUTS_COUNT;'
+print >>C, '  uint32_t idx = (uint32_t)GRPC_STATIC_METADATA_INDEX(slice);'
 print >>C, '  uint32_t hash = batch_phash(idx);'
 print >>C, '  if (hash < GPR_ARRAY_SIZE(batch_hash_to_idx) && batch_hash_to_idx[hash] == idx) return (grpc_metadata_batch_callouts_index)hash;'
 print >>C, '  return GRPC_BATCH_CALLOUTS_COUNT;'