Repository: thrift Updated Branches: refs/heads/master 9a8d576c8 -> 7470995ce
THRIFT-4137 Fix remaining undefined behavior invalid vptr casts in Thrift Compiler Project: http://git-wip-us.apache.org/repos/asf/thrift/repo Commit: http://git-wip-us.apache.org/repos/asf/thrift/commit/7470995c Tree: http://git-wip-us.apache.org/repos/asf/thrift/tree/7470995c Diff: http://git-wip-us.apache.org/repos/asf/thrift/diff/7470995c Branch: refs/heads/master Commit: 7470995ce4bb480a86beaf1d8babce95c6f4b8c7 Parents: 9a8d576 Author: Jens Geyer <je...@apache.org> Authored: Sun Mar 26 14:52:35 2017 +0200 Committer: Jens Geyer <je...@apache.org> Committed: Mon Mar 27 22:50:16 2017 +0200 ---------------------------------------------------------------------- compiler/cpp/src/thrift/generate/t_haxe_generator.cc | 2 +- compiler/cpp/src/thrift/generate/t_java_generator.cc | 4 ++-- compiler/cpp/src/thrift/generate/t_json_generator.cc | 6 +++++- compiler/cpp/src/thrift/generate/t_xml_generator.cc | 7 ++++++- compiler/cpp/src/thrift/parse/t_scope.h | 9 ++++++++- 5 files changed, 22 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/thrift/blob/7470995c/compiler/cpp/src/thrift/generate/t_haxe_generator.cc ---------------------------------------------------------------------- diff --git a/compiler/cpp/src/thrift/generate/t_haxe_generator.cc b/compiler/cpp/src/thrift/generate/t_haxe_generator.cc index f5d292f..4de4307 100644 --- a/compiler/cpp/src/thrift/generate/t_haxe_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_haxe_generator.cc @@ -2573,7 +2573,7 @@ string t_haxe_generator::type_name(t_type* ttype, bool in_container, bool in_ini } if (ttype->is_set()) { - t_type* tkey = get_true_type(((t_list*)ttype)->get_elem_type()); + t_type* tkey = get_true_type(((t_set*)ttype)->get_elem_type()); if (tkey->is_base_type()) { t_base_type::t_base tbase = ((t_base_type*)tkey)->get_base(); switch (tbase) { http://git-wip-us.apache.org/repos/asf/thrift/blob/7470995c/compiler/cpp/src/thrift/generate/t_java_generator.cc ---------------------------------------------------------------------- diff --git a/compiler/cpp/src/thrift/generate/t_java_generator.cc b/compiler/cpp/src/thrift/generate/t_java_generator.cc index db70dc5..80b8eef 100644 --- a/compiler/cpp/src/thrift/generate/t_java_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_java_generator.cc @@ -2685,7 +2685,7 @@ void t_java_generator::generate_field_value_meta_data(std::ofstream& out, t_type } else if (type->is_set()) { indent(out) << "new org.apache.thrift.meta_data.SetMetaData(org.apache.thrift.protocol.TType.SET, "; - t_type* elem_type = ((t_list*)type)->get_elem_type(); + t_type* elem_type = ((t_set*)type)->get_elem_type(); generate_field_value_meta_data(out, elem_type); } else { // map indent(out) @@ -3748,7 +3748,7 @@ void t_java_generator::generate_deserialize_container(ofstream& out, } else if (ttype->is_list()) { indent(out) << "org.apache.thrift.protocol.TList " << obj << " = new org.apache.thrift.protocol.TList(" - << type_to_enum(((t_set*)ttype)->get_elem_type()) << ", iprot.readI32());" + << type_to_enum(((t_list*)ttype)->get_elem_type()) << ", iprot.readI32());" << endl; } } http://git-wip-us.apache.org/repos/asf/thrift/blob/7470995c/compiler/cpp/src/thrift/generate/t_json_generator.cc ---------------------------------------------------------------------- diff --git a/compiler/cpp/src/thrift/generate/t_json_generator.cc b/compiler/cpp/src/thrift/generate/t_json_generator.cc index 36e9216..f3d67e0 100644 --- a/compiler/cpp/src/thrift/generate/t_json_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_json_generator.cc @@ -273,10 +273,14 @@ void t_json_generator::write_type_spec(t_type* ttype) { write_key_and_string("valueTypeId", get_type_name(vtype)); write_type_spec_object("keyType", ktype); write_type_spec_object("valueType", vtype); - } else if (ttype->is_list() || ttype->is_set()) { + } else if (ttype->is_list()) { t_type* etype = ((t_list*)ttype)->get_elem_type(); write_key_and_string("elemTypeId", get_type_name(etype)); write_type_spec_object("elemType", etype); + } else if (ttype->is_set()) { + t_type* etype = ((t_set*)ttype)->get_elem_type(); + write_key_and_string("elemTypeId", get_type_name(etype)); + write_type_spec_object("elemType", etype); } } http://git-wip-us.apache.org/repos/asf/thrift/blob/7470995c/compiler/cpp/src/thrift/generate/t_xml_generator.cc ---------------------------------------------------------------------- diff --git a/compiler/cpp/src/thrift/generate/t_xml_generator.cc b/compiler/cpp/src/thrift/generate/t_xml_generator.cc index b35f351..e7e01fd 100644 --- a/compiler/cpp/src/thrift/generate/t_xml_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_xml_generator.cc @@ -391,11 +391,16 @@ void t_xml_generator::write_type(t_type* ttype) { if (type == "id") { write_attribute("type-module", ttype->get_program()->get_name()); write_attribute("type-id", ttype->get_name()); - } else if (type == "list" || type == "set") { + } else if (type == "list") { t_type* etype = ((t_list*)ttype)->get_elem_type(); write_element_start("elemType"); write_type(etype); write_element_end(); + } else if (type == "set") { + t_type* etype = ((t_set*)ttype)->get_elem_type(); + write_element_start("elemType"); + write_type(etype); + write_element_end(); } else if (type == "map") { t_type* ktype = ((t_map*)ttype)->get_key_type(); write_element_start("keyType"); http://git-wip-us.apache.org/repos/asf/thrift/blob/7470995c/compiler/cpp/src/thrift/parse/t_scope.h ---------------------------------------------------------------------- diff --git a/compiler/cpp/src/thrift/parse/t_scope.h b/compiler/cpp/src/thrift/parse/t_scope.h index e196200..02aa550 100644 --- a/compiler/cpp/src/thrift/parse/t_scope.h +++ b/compiler/cpp/src/thrift/parse/t_scope.h @@ -31,6 +31,7 @@ #include "thrift/parse/t_base_type.h" #include "thrift/parse/t_map.h" #include "thrift/parse/t_list.h" +#include "thrift/parse/t_set.h" namespace plugin_output { template <typename From, typename To> @@ -81,12 +82,18 @@ public: resolve_const_value(v_iter->first, ((t_map*)ttype)->get_key_type()); resolve_const_value(v_iter->second, ((t_map*)ttype)->get_val_type()); } - } else if (ttype->is_list() || ttype->is_set()) { + } else if (ttype->is_list()) { const std::vector<t_const_value*>& val = const_val->get_list(); std::vector<t_const_value*>::const_iterator v_iter; for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { resolve_const_value((*v_iter), ((t_list*)ttype)->get_elem_type()); } + } else if (ttype->is_set()) { + const std::vector<t_const_value*>& val = const_val->get_list(); + std::vector<t_const_value*>::const_iterator v_iter; + for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) { + resolve_const_value((*v_iter), ((t_set*)ttype)->get_elem_type()); + } } else if (ttype->is_struct()) { t_struct* tstruct = (t_struct*)ttype; const std::map<t_const_value*, t_const_value*>& map = const_val->get_map();