More Thfirt code-gen improvements

Summary: Move read/write struct methods into PHP class definition, make struct read non-static in Java


git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@664776 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/compiler/cpp/src/generate/t_java_generator.cc b/compiler/cpp/src/generate/t_java_generator.cc
index 1b466f7..66361d5 100644
--- a/compiler/cpp/src/generate/t_java_generator.cc
+++ b/compiler/cpp/src/generate/t_java_generator.cc
@@ -174,12 +174,13 @@
     generate_java_struct_writer(out, tstruct);
   }
   scope_down(out);
+  out << endl;
 }
 
 void t_java_generator::generate_java_struct_reader(ofstream& out,
                                                    t_struct* tstruct) {
   out <<
-    indent() << "public static " << tstruct->get_name() << " read(TProtocol _iprot, TTransport _itrans) throws TException {" << endl;
+    indent() << "public void read(TProtocol _iprot, TTransport _itrans) throws TException {" << endl;
   indent_up();
 
   const vector<t_field*>& fields = tstruct->get_members();
@@ -187,7 +188,6 @@
 
   // Declare stack tmp variables
   out <<
-    indent() << tstruct->get_name() << " _value = new " << tstruct->get_name() << "();" << endl <<
     indent() << "TField _field;" << endl <<
     indent() << "TStruct _struct = _iprot.readStructBegin(_itrans);" << endl;
   
@@ -222,9 +222,9 @@
         indent(out) <<
           "case " << (*f_iter)->get_key() << ":" << endl;
         indent_up();
-        generate_deserialize_field(out, *f_iter, "_value.");
+        generate_deserialize_field(out, *f_iter, "this.");
         out <<
-          indent() << "_value.__isset." << (*f_iter)->get_name() << " = true;" << endl;
+          indent() << "this.__isset." << (*f_iter)->get_name() << " = true;" << endl;
         indent(out) <<
           "break;" << endl;
         indent_down();
@@ -245,8 +245,7 @@
     scope_down(out);
       
     out <<
-      indent() << "_iprot.readStructEnd(_itrans);" << endl <<
-      indent() << "return _value;" << endl; 
+      indent() << "_iprot.readStructEnd(_itrans);" << endl;
 
   indent_down();
   out <<
@@ -290,8 +289,7 @@
 
   indent_down();
   out <<
-    indent() << "}" << endl <<
-    endl;
+    indent() << "}" << endl;
 }
 
 void t_java_generator::generate_java_struct_result_writer(ofstream& out,
@@ -545,7 +543,8 @@
 
       f_service_ <<
         indent() << "TMessage _msg = _iprot.readMessageBegin(_itrans);" << endl <<
-        indent() << resultname << " __result = " << resultname << ".read(_iprot, _itrans);" << endl <<
+        indent() << resultname << " __result = new " << resultname << "();" << endl <<
+        indent() << "__result.read(_iprot, _itrans);" << endl <<
         indent() << "_iprot.readMessageEnd(_itrans);" << endl <<
         endl;
 
@@ -722,7 +721,8 @@
   string resultname = tfunction->get_name() + "_result";
 
   f_service_ <<
-    indent() << argsname << " __args = " << argsname << ".read(_iprot, _itrans);" << endl <<
+    indent() << argsname << " __args = new " << argsname << "();" << endl <<
+    indent() << "__args.read(_iprot, _itrans);" << endl <<
     indent() << "_iprot.readMessageEnd(_itrans);" << endl;
 
   t_struct* xs = tfunction->get_xceptions();
@@ -890,7 +890,8 @@
                                                    t_struct* tstruct,
                                                    string prefix) {
   out <<
-    indent() << prefix << " = " << tstruct->get_name() << ".read(_iprot, _itrans);" << endl;
+    indent() << prefix << " = new " << tstruct->get_name() << "();" << endl <<
+    indent() << prefix << ".read(_iprot, _itrans);" << endl;
 }
 
 void t_java_generator::generate_deserialize_container(ofstream& out,
@@ -1292,10 +1293,12 @@
         break;
     }
 
-    } else  if (ttype->is_enum()) {
+    } else if (ttype->is_enum()) {
       result += " = 0";
+    } else if (ttype->is_container()) {
+      result += " = new " + type_name(ttype) + "()";
     } else {
-      result += " = new " + type_name(tfield->get_type()) + "()";
+      result += " = null";
     }
   }
   return result + ";";
diff --git a/compiler/cpp/src/generate/t_php_generator.cc b/compiler/cpp/src/generate/t_php_generator.cc
index 6f4b76a..74b73b9 100644
--- a/compiler/cpp/src/generate/t_php_generator.cc
+++ b/compiler/cpp/src/generate/t_php_generator.cc
@@ -118,8 +118,6 @@
 void t_php_generator::generate_php_struct(t_struct* tstruct,
                                           bool is_exception) {
   generate_php_struct_definition(f_types_, tstruct, is_exception);
-  generate_php_struct_reader(f_types_, tstruct);
-  generate_php_struct_writer(f_types_, tstruct);
 }
 
 /**
@@ -153,8 +151,12 @@
       "public $" << (*m_iter)->get_name() << " = null;" << endl;
   }
  
-  indent_down();
+  out << endl;
 
+  generate_php_struct_reader(out, tstruct);
+  generate_php_struct_writer(out, tstruct);
+
+  indent_down();
   out <<
     indent() << "}" << endl <<
     endl;
@@ -166,8 +168,7 @@
   vector<t_field*>::const_iterator f_iter;
 
   indent(out) <<
-    "function read_struct_" << tstruct->get_name() <<
-    "($iprot, $itrans, &$value) " << endl;
+    "public function read($iprot, $itrans) " << endl;
   scope_up(out);
 
   out <<
@@ -223,7 +224,7 @@
         indent(out) <<
           "case " << (*f_iter)->get_key() << ":" << endl;
         indent_up();
-        generate_deserialize_field(out, *f_iter, "value->");
+        generate_deserialize_field(out, *f_iter, "this->");
         indent(out) <<
           "break;" << endl;
         indent_down();
@@ -267,12 +268,10 @@
 
   if (binary_inline_) {
     indent(out) <<
-      "function write_struct_" << name <<
-      "(&$_output, &$value) {" << endl;
+      "public function write(&$_output) {" << endl;
   } else {
     indent(out) <<
-      "function write_struct_" << name <<
-      "($oprot, $otrans, &$value) {" << endl;
+      "public function write($oprot, $otrans) {" << endl;
   }
   indent_up();
   
@@ -299,7 +298,7 @@
     }
 
     // Write field contents
-    generate_serialize_field(out, *f_iter, "value->");
+    generate_serialize_field(out, *f_iter, "this->");
 
     // Write field closer
     if (!binary_inline_) {
@@ -370,8 +369,6 @@
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     t_struct* ts = (*f_iter)->get_arglist();
     generate_php_struct_definition(f_service_, ts, false);
-    generate_php_struct_reader(f_service_, ts);
-    generate_php_struct_writer(f_service_, ts);
     generate_php_function_helpers(*f_iter);
   }
 }
@@ -396,7 +393,6 @@
   }
 
   generate_php_struct_definition(f_service_, &result, false);
-  generate_php_struct_reader(f_service_, &result);
 }
 
 /**
@@ -543,11 +539,11 @@
       // Write to the stream
       if (binary_inline_) { 
         f_service_ <<
-          indent() << "write_struct_" << argsname << "($_output, $__args);" << endl <<
+          indent() << "$__args->write($_output, $__args);" << endl <<
           indent() << "$this->_otrans->write($_output);" << endl;
       } else {
         f_service_ <<
-          indent() << "write_struct_" << argsname << "($this->_oprot, $this->_otrans, $__args);" << endl <<
+          indent() << "$__args->write($this->_oprot, $this->_otrans);" << endl <<
           indent() << "$this->_oprot->writeMessageEnd($this->_otrans);" << endl;
       }
       
@@ -594,7 +590,7 @@
 
       f_service_ <<
         indent() << "$__result = new " << resultname << "();" << endl <<
-        indent() << "read_struct_" << resultname << "($this->_iprot, $this->_otrans, $__result);" << endl;
+        indent() << "$__result->read($this->_iprot, $this->_otrans);" << endl;
 
       if (!binary_inline_) {
         f_service_ <<
@@ -794,7 +790,7 @@
                                                   string prefix) {
   out <<
     indent() << "$" << prefix << " = new " << tstruct->get_name() << "();" << endl <<
-    indent() << "$xfer += read_struct_" << tstruct->get_name() << "($iprot, $itrans, $" << prefix << ");" << endl;
+    indent() << "$xfer += $" << prefix << "->read($iprot, $itrans);" << endl;
 }
 
 void t_php_generator::generate_deserialize_container(ofstream &out,
@@ -1067,10 +1063,10 @@
                                                 string prefix) {
   if (binary_inline_) {
     indent(out) <<
-      "$xfer += write_struct_" << tstruct->get_name() << "($_output, $" << prefix << ");" << endl;
+      "$xfer += $" << prefix << "->write($_output);" << endl;
   } else {
     indent(out) <<
-      "$xfer += write_struct_" << tstruct->get_name() << "($oprot, $otrans, $" << prefix << ");" << endl;
+      "$xfer += $" << prefix << "->write($oprot, $otrans);" << endl;
   }
 }
 
@@ -1363,7 +1359,7 @@
     }
   } else if (type->is_enum()) {
     return "TType::I32";
-  } else if (type->is_struct()) {
+  } else if (type->is_struct() || type->is_xception()) {
     return "TType::STRUCT";
   } else if (type->is_map()) {
     return "TType::MAP";