From f3763a1fae75a7820cfec9a2d16fdaa981fadb63 Mon Sep 17 00:00:00 2001 From: Mark Slee Date: Thu, 18 Jan 2007 02:35:27 +0000 Subject: [PATCH] Do not generate write code for null fields in Java Summary: It will make null pointer exceptions! Reviewed By: martin, alex git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@664923 13f79535-47bb-0310-9956-ffa450edef68 --- compiler/cpp/src/generate/t_java_generator.cc | 24 +++++++++++++++++++ compiler/cpp/src/generate/t_java_generator.h | 13 ++++++++++ 2 files changed, 37 insertions(+) diff --git a/compiler/cpp/src/generate/t_java_generator.cc b/compiler/cpp/src/generate/t_java_generator.cc index ea2d22ab..d8c14592 100644 --- a/compiler/cpp/src/generate/t_java_generator.cc +++ b/compiler/cpp/src/generate/t_java_generator.cc @@ -479,6 +479,13 @@ void t_java_generator::generate_java_struct_writer(ofstream& out, indent() << "oprot.writeStructBegin(struct);" << endl; for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { + bool null_allowed = type_can_be_null((*f_iter)->get_type()); + if (null_allowed) { + out << + indent() << "if (this." << (*f_iter)->get_name() << " != null) {" << endl; + indent_up(); + } + out << indent() << "field.name = \"" << (*f_iter)->get_name() << "\";" << endl << indent() << "field.type = " << type_to_enum((*f_iter)->get_type()) << ";" << endl << @@ -491,6 +498,11 @@ void t_java_generator::generate_java_struct_writer(ofstream& out, // Write field closer indent(out) << "oprot.writeFieldEnd();" << endl; + + if (null_allowed) { + indent_down(); + indent(out) << "}" << endl; + } } // Write the struct map out << @@ -541,6 +553,13 @@ void t_java_generator::generate_java_struct_result_writer(ofstream& out, "(this.__isset." << (*f_iter)->get_name() << ") {" << endl; indent_up(); + bool null_allowed = type_can_be_null((*f_iter)->get_type()); + if (null_allowed) { + out << + indent() << "if (this." << (*f_iter)->get_name() << " != null) {" << endl; + indent_up(); + } + out << indent() << "field.name = \"" << (*f_iter)->get_name() << "\";" << endl << indent() << "field.type = " << type_to_enum((*f_iter)->get_type()) << ";" << endl << @@ -554,6 +573,11 @@ void t_java_generator::generate_java_struct_result_writer(ofstream& out, indent(out) << "oprot.writeFieldEnd();" << endl; + if (null_allowed) { + indent_down(); + indent(out) << "}" << endl; + } + indent_down(); indent(out) << "}"; } diff --git a/compiler/cpp/src/generate/t_java_generator.h b/compiler/cpp/src/generate/t_java_generator.h index b21c76a9..35748e55 100644 --- a/compiler/cpp/src/generate/t_java_generator.h +++ b/compiler/cpp/src/generate/t_java_generator.h @@ -129,6 +129,19 @@ class t_java_generator : public t_oop_generator { std::string argument_list(t_struct* tstruct); std::string type_to_enum(t_type* ttype); + bool type_can_be_null(t_type* ttype) { + while (ttype->is_typedef()) { + ttype = ((t_typedef*)ttype)->get_type(); + } + + return + ttype->is_container() || + ttype->is_struct() || + ttype->is_xception() || + (ttype->is_base_type() && (((t_base_type*)ttype)->get_base() == t_base_type::TYPE_STRING)); + } + + private: /** -- 2.17.1