diff options
author | Roger Meier <roger@apache.org> | 2014-09-04 00:24:17 +0200 |
---|---|---|
committer | Roger Meier <roger@apache.org> | 2014-09-04 00:24:17 +0200 |
commit | 0cc6d3c7bd454ad701bf5652a58a49f689babfc5 (patch) | |
tree | 72e725ed0e13610ab74a4bb4badd0e38568b059c /compiler/cpp | |
parent | d62473c3b0fff3f50f5d1f7e9dd6f8bdf91d4a66 (diff) | |
download | thrift-0cc6d3c7bd454ad701bf5652a58a49f689babfc5.tar.gz |
THRIFT-2690
c_glib: Incorrect behaviour when serializing a map with typedef'd keys
Patch: Simon South
Diffstat (limited to 'compiler/cpp')
-rw-r--r-- | compiler/cpp/src/generate/t_c_glib_generator.cc | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/compiler/cpp/src/generate/t_c_glib_generator.cc b/compiler/cpp/src/generate/t_c_glib_generator.cc index 632dbc7f4..96ce99e20 100644 --- a/compiler/cpp/src/generate/t_c_glib_generator.cc +++ b/compiler/cpp/src/generate/t_c_glib_generator.cc @@ -2971,8 +2971,8 @@ void t_c_glib_generator::generate_serialize_container(ofstream &out, t_type *tval = ((t_map *) ttype)->get_val_type(); string tkey_name = type_name (tkey); 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 tkey_ptr; + string tval_ptr; string keyname = tmp("key"); string valname = tmp("val"); @@ -2993,6 +2993,15 @@ void t_c_glib_generator::generate_serialize_container(ofstream &out, indent() << "GList *key_list = NULL, *iter = NULL;" << endl; declare_local_variable(out, tkey, keyname); declare_local_variable(out, tval, valname); + + /* If either the key or value type is a typedef, find its underlying type so + we can correctly determine how to generate a pointer to it */ + tkey = get_true_type(tkey); + tval = get_true_type(tval); + + tkey_ptr = tkey->is_string() || !tkey->is_base_type() ? "" : "*"; + tval_ptr = tval->is_string() || !tval->is_base_type() ? "" : "*"; + out << indent() << "g_hash_table_foreach ((GHashTable *) " << prefix << ", thrift_hash_table_get_keys, &key_list);" << endl << |