Prohibit mixed glyphs/unicode buffers in deserialization
diff --git a/src/hb-buffer-deserialize-text.hh b/src/hb-buffer-deserialize-text.hh
index 90275b8..c437718 100644
--- a/src/hb-buffer-deserialize-text.hh
+++ b/src/hb-buffer-deserialize-text.hh
@@ -409,17 +409,17 @@
 	2, 2, 2, 0, 0, 5, 0, 6, 
 	5, 5, 0, 0, 0, 7, 7, 7, 
 	0, 8, 9, 9, 9, 8, 8, 0, 
-	0, 0, 10, 11, 10, 10, 12, 12, 
-	12, 7, 13, 13, 7, 14, 15, 14, 
-	14, 0, 0
+	0, 10, 11, 12, 11, 11, 13, 13, 
+	13, 7, 14, 14, 7, 15, 16, 15, 
+	15, 0, 10
 };
 
 static const char _deserialize_text_eof_actions[] = {
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 5, 0, 0, 0, 
-	7, 7, 8, 0, 0, 8, 10, 12, 
-	12, 10, 7, 14, 14, 7, 8
+	7, 7, 8, 0, 0, 8, 11, 13, 
+	13, 11, 7, 15, 15, 7, 8
 };
 
 static const int deserialize_text_start = 1;
@@ -429,7 +429,7 @@
 static const int deserialize_text_en_main = 1;
 
 
-#line 100 "hb-buffer-deserialize-text.rl"
+#line 124 "hb-buffer-deserialize-text.rl"
 
 
 static hb_bool_t
@@ -482,22 +482,29 @@
 		goto _again;
 
 	switch ( _deserialize_text_trans_actions[_trans] ) {
-	case 1:
-#line 38 "hb-buffer-deserialize-text.rl"
-	{
-	memset (&info, 0, sizeof (info));
-	memset (&pos , 0, sizeof (pos ));
-}
-	break;
 	case 2:
 #line 51 "hb-buffer-deserialize-text.rl"
 	{
 	tok = p;
 }
 	break;
-	case 9:
+	case 10:
 #line 55 "hb-buffer-deserialize-text.rl"
 	{
+  if (unlikely (buffer->content_type != HB_BUFFER_CONTENT_TYPE_GLYPHS))
+  {
+    if (buffer->content_type != HB_BUFFER_CONTENT_TYPE_INVALID) {
+    	buffer->clear();
+      return false;
+    }
+    assert (buffer->len == 0);
+    buffer->content_type = HB_BUFFER_CONTENT_TYPE_GLYPHS;
+  }
+}
+	break;
+	case 9:
+#line 79 "hb-buffer-deserialize-text.rl"
+	{
 	if (!hb_font_glyph_from_string (font,
 					tok, p - tok,
 					&info.codepoint))
@@ -505,38 +512,46 @@
 }
 	break;
 	case 6:
-#line 62 "hb-buffer-deserialize-text.rl"
+#line 86 "hb-buffer-deserialize-text.rl"
 	{if (!parse_hex (tok, p, &info.codepoint )) return false; }
 	break;
-	case 13:
-#line 64 "hb-buffer-deserialize-text.rl"
+	case 14:
+#line 88 "hb-buffer-deserialize-text.rl"
 	{ if (!parse_uint (tok, p, &info.cluster )) return false; }
 	break;
 	case 4:
-#line 65 "hb-buffer-deserialize-text.rl"
+#line 89 "hb-buffer-deserialize-text.rl"
 	{ if (!parse_int  (tok, p, &pos.x_offset )) return false; }
 	break;
-	case 15:
-#line 66 "hb-buffer-deserialize-text.rl"
+	case 16:
+#line 90 "hb-buffer-deserialize-text.rl"
 	{ if (!parse_int  (tok, p, &pos.y_offset )) return false; }
 	break;
-	case 11:
-#line 67 "hb-buffer-deserialize-text.rl"
+	case 12:
+#line 91 "hb-buffer-deserialize-text.rl"
 	{ if (!parse_int  (tok, p, &pos.x_advance)) return false; }
 	break;
-	case 3:
+	case 1:
 #line 38 "hb-buffer-deserialize-text.rl"
 	{
 	memset (&info, 0, sizeof (info));
 	memset (&pos , 0, sizeof (pos ));
 }
-#line 51 "hb-buffer-deserialize-text.rl"
+#line 67 "hb-buffer-deserialize-text.rl"
 	{
-	tok = p;
+  if (unlikely (buffer->content_type != HB_BUFFER_CONTENT_TYPE_UNICODE))
+  {
+    if (buffer->content_type != HB_BUFFER_CONTENT_TYPE_INVALID) {
+    	buffer->clear();
+      return false;
+    }
+    assert (buffer->len == 0);
+    buffer->content_type = HB_BUFFER_CONTENT_TYPE_UNICODE;
+  }
 }
 	break;
 	case 8:
-#line 55 "hb-buffer-deserialize-text.rl"
+#line 79 "hb-buffer-deserialize-text.rl"
 	{
 	if (!hb_font_glyph_from_string (font,
 					tok, p - tok,
@@ -553,7 +568,7 @@
 }
 	break;
 	case 5:
-#line 62 "hb-buffer-deserialize-text.rl"
+#line 86 "hb-buffer-deserialize-text.rl"
 	{if (!parse_hex (tok, p, &info.codepoint )) return false; }
 #line 43 "hb-buffer-deserialize-text.rl"
 	{
@@ -565,7 +580,7 @@
 }
 	break;
 	case 7:
-#line 64 "hb-buffer-deserialize-text.rl"
+#line 88 "hb-buffer-deserialize-text.rl"
 	{ if (!parse_uint (tok, p, &info.cluster )) return false; }
 #line 43 "hb-buffer-deserialize-text.rl"
 	{
@@ -576,8 +591,8 @@
 	*end_ptr = p;
 }
 	break;
-	case 14:
-#line 66 "hb-buffer-deserialize-text.rl"
+	case 15:
+#line 90 "hb-buffer-deserialize-text.rl"
 	{ if (!parse_int  (tok, p, &pos.y_offset )) return false; }
 #line 43 "hb-buffer-deserialize-text.rl"
 	{
@@ -588,8 +603,8 @@
 	*end_ptr = p;
 }
 	break;
-	case 10:
-#line 67 "hb-buffer-deserialize-text.rl"
+	case 11:
+#line 91 "hb-buffer-deserialize-text.rl"
 	{ if (!parse_int  (tok, p, &pos.x_advance)) return false; }
 #line 43 "hb-buffer-deserialize-text.rl"
 	{
@@ -600,8 +615,8 @@
 	*end_ptr = p;
 }
 	break;
-	case 12:
-#line 68 "hb-buffer-deserialize-text.rl"
+	case 13:
+#line 92 "hb-buffer-deserialize-text.rl"
 	{ if (!parse_int  (tok, p, &pos.y_advance)) return false; }
 #line 43 "hb-buffer-deserialize-text.rl"
 	{
@@ -612,7 +627,30 @@
 	*end_ptr = p;
 }
 	break;
-#line 616 "hb-buffer-deserialize-text.hh"
+	case 3:
+#line 38 "hb-buffer-deserialize-text.rl"
+	{
+	memset (&info, 0, sizeof (info));
+	memset (&pos , 0, sizeof (pos ));
+}
+#line 51 "hb-buffer-deserialize-text.rl"
+	{
+	tok = p;
+}
+#line 55 "hb-buffer-deserialize-text.rl"
+	{
+  if (unlikely (buffer->content_type != HB_BUFFER_CONTENT_TYPE_GLYPHS))
+  {
+    if (buffer->content_type != HB_BUFFER_CONTENT_TYPE_INVALID) {
+    	buffer->clear();
+      return false;
+    }
+    assert (buffer->len == 0);
+    buffer->content_type = HB_BUFFER_CONTENT_TYPE_GLYPHS;
+  }
+}
+	break;
+#line 654 "hb-buffer-deserialize-text.hh"
 	}
 
 _again:
@@ -625,7 +663,7 @@
 	{
 	switch ( _deserialize_text_eof_actions[cs] ) {
 	case 8:
-#line 55 "hb-buffer-deserialize-text.rl"
+#line 79 "hb-buffer-deserialize-text.rl"
 	{
 	if (!hb_font_glyph_from_string (font,
 					tok, p - tok,
@@ -642,7 +680,7 @@
 }
 	break;
 	case 5:
-#line 62 "hb-buffer-deserialize-text.rl"
+#line 86 "hb-buffer-deserialize-text.rl"
 	{if (!parse_hex (tok, p, &info.codepoint )) return false; }
 #line 43 "hb-buffer-deserialize-text.rl"
 	{
@@ -654,7 +692,7 @@
 }
 	break;
 	case 7:
-#line 64 "hb-buffer-deserialize-text.rl"
+#line 88 "hb-buffer-deserialize-text.rl"
 	{ if (!parse_uint (tok, p, &info.cluster )) return false; }
 #line 43 "hb-buffer-deserialize-text.rl"
 	{
@@ -665,8 +703,8 @@
 	*end_ptr = p;
 }
 	break;
-	case 14:
-#line 66 "hb-buffer-deserialize-text.rl"
+	case 15:
+#line 90 "hb-buffer-deserialize-text.rl"
 	{ if (!parse_int  (tok, p, &pos.y_offset )) return false; }
 #line 43 "hb-buffer-deserialize-text.rl"
 	{
@@ -677,8 +715,8 @@
 	*end_ptr = p;
 }
 	break;
-	case 10:
-#line 67 "hb-buffer-deserialize-text.rl"
+	case 11:
+#line 91 "hb-buffer-deserialize-text.rl"
 	{ if (!parse_int  (tok, p, &pos.x_advance)) return false; }
 #line 43 "hb-buffer-deserialize-text.rl"
 	{
@@ -689,8 +727,8 @@
 	*end_ptr = p;
 }
 	break;
-	case 12:
-#line 68 "hb-buffer-deserialize-text.rl"
+	case 13:
+#line 92 "hb-buffer-deserialize-text.rl"
 	{ if (!parse_int  (tok, p, &pos.y_advance)) return false; }
 #line 43 "hb-buffer-deserialize-text.rl"
 	{
@@ -701,14 +739,14 @@
 	*end_ptr = p;
 }
 	break;
-#line 705 "hb-buffer-deserialize-text.hh"
+#line 743 "hb-buffer-deserialize-text.hh"
 	}
 	}
 
 	_out: {}
 	}
 
-#line 124 "hb-buffer-deserialize-text.rl"
+#line 148 "hb-buffer-deserialize-text.rl"
 
 
   *end_ptr = p;