THRIFT-1266 generated C code for iterating over nested maps is wrong

Patch: Simon South
diff --git a/compiler/cpp/src/generate/t_c_glib_generator.cc b/compiler/cpp/src/generate/t_c_glib_generator.cc
index 050463f..632dbc7 100644
--- a/compiler/cpp/src/generate/t_c_glib_generator.cc
+++ b/compiler/cpp/src/generate/t_c_glib_generator.cc
@@ -2973,6 +2973,8 @@
     string tval_name = type_name (tval);
     string tkey_ptr = tkey->is_string() || !tkey->is_base_type() ? "" : "*";
     string tval_ptr = tval->is_string() || !tval->is_base_type() ? "" : "*";
+    string keyname = tmp("key");
+    string valname = tmp("val");
 
     /*
      * Some ugliness here.  To maximize backwards compatibility, we
@@ -2988,9 +2990,10 @@
       indent() << "  return " << error_ret << ";" << endl <<
       indent() << "xfer += ret;" << endl <<
       endl <<
-      indent() << "GList *key_list = NULL, *iter = NULL;" << endl <<
-      indent() << tkey_name << tkey_ptr << " key;" << endl <<
-      indent() << tval_name << tval_ptr << " value;" << endl <<
+      indent() << "GList *key_list = NULL, *iter = NULL;" << endl;
+    declare_local_variable(out, tkey, keyname);
+    declare_local_variable(out, tval, valname);
+    out <<
       indent() << "g_hash_table_foreach ((GHashTable *) " << prefix << 
                    ", thrift_hash_table_get_keys, &key_list);" << endl <<
       indent() << tkey_name << tkey_ptr <<
@@ -3009,13 +3012,16 @@
 
     scope_up(out);
     out <<
-      indent() << "key = keys[i];" << endl <<
-      indent() << "value = (" << tval_name << tval_ptr <<
+      indent() << keyname << " = keys[i];" << endl <<
+      indent() << valname << " = (" << tval_name << tval_ptr <<
                    ") g_hash_table_lookup (((GHashTable *) " << prefix <<
-                   "), (gpointer) key);" << endl <<
+                   "), (gpointer) " << keyname << ");" << endl <<
       endl;
-    generate_serialize_map_element (out, (t_map *) ttype, tkey_ptr + " key",
-                                    tval_ptr + " value", error_ret);
+    generate_serialize_map_element (out,
+                                    (t_map *) ttype,
+                                    tkey_ptr + " " + keyname,
+                                    tval_ptr + " " + valname,
+                                    error_ret);
     scope_down(out);
 
     out <<