You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by ro...@apache.org on 2012/04/09 18:25:47 UTC

svn commit: r1311311 - /thrift/trunk/compiler/cpp/src/generate/t_delphi_generator.cc

Author: roger
Date: Mon Apr  9 16:25:47 2012
New Revision: 1311311

URL: http://svn.apache.org/viewvc?rev=1311311&view=rev
Log:
THRIFT-1554 Inherited service methods are not resolved in derived service implementations
Patch: Jens Geyer

Modified:
    thrift/trunk/compiler/cpp/src/generate/t_delphi_generator.cc

Modified: thrift/trunk/compiler/cpp/src/generate/t_delphi_generator.cc
URL: http://svn.apache.org/viewvc/thrift/trunk/compiler/cpp/src/generate/t_delphi_generator.cc?rev=1311311&r1=1311310&r2=1311311&view=diff
==============================================================================
--- thrift/trunk/compiler/cpp/src/generate/t_delphi_generator.cc (original)
+++ thrift/trunk/compiler/cpp/src/generate/t_delphi_generator.cc Mon Apr  9 16:25:47 2012
@@ -1440,8 +1440,19 @@ void t_delphi_generator::generate_servic
   indent_impl(s_service_impl) << "constructor " << full_cls << ".Create( iface_: Iface );" << endl;
   indent_impl(s_service_impl) << "begin" << endl;
   indent_up_impl();
+  if (tservice->get_extends() != NULL)
+  {
+    indent_impl(s_service_impl) << "inherited Create( iface_);" << endl;
+  } else {
+    indent_impl(s_service_impl) << "inherited Create;" << endl;
+  }
   indent_impl(s_service_impl) << "Self.iface_ := iface_;" << endl;
-  indent_impl(s_service_impl) << "processMap_ := TThriftDictionaryImpl<string, TProcessFunction>.Create;" << endl;
+  if (tservice->get_extends() != NULL)
+  {
+    indent_impl(s_service_impl) << "ASSERT( processMap_ <> nil);  // inherited" << endl;
+  } else {
+    indent_impl(s_service_impl) << "processMap_ := TThriftDictionaryImpl<string, TProcessFunction>.Create;" << endl;
+  }
 
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     indent_impl(s_service_impl) << 
@@ -1451,28 +1462,32 @@ void t_delphi_generator::generate_servic
   indent_impl(s_service_impl) << "end;" << endl << endl;
 
   indent_impl(s_service_impl) << "destructor " << full_cls << ".Destroy;" << endl;
-  indent_impl(s_service_impl) << "begin;" << endl;
+  indent_impl(s_service_impl) << "begin" << endl;
   indent_up_impl();
   indent_impl(s_service_impl) << "inherited;" << endl;
   indent_down_impl();
   indent_impl(s_service_impl) << "end;" << endl << endl;
 
-  indent(s_service) << "protected" << endl;
-  indent_up();
-  indent(s_service) << "type" << endl;
-  indent_up();
-  indent(s_service) << "TProcessFunction = reference to procedure( seqid: Integer; const iprot: IProtocol; const oprot: IProtocol);" << endl;
-  indent_down();
-  indent_down();
-
   indent(s_service) << "private" << endl;
   indent_up();
   indent(s_service) << "iface_: Iface;" << endl;
   indent_down();
-  indent(s_service) << "protected" << endl;
-  indent_up();
-  indent(s_service) << "processMap_: IThriftDictionary<string, TProcessFunction>;" << endl;
-  indent_down();
+
+  if (tservice->get_extends() == NULL)
+  {
+    indent(s_service) << "protected" << endl;
+    indent_up();
+    indent(s_service) << "type" << endl;
+    indent_up();
+    indent(s_service) << "TProcessFunction = reference to procedure( seqid: Integer; const iprot: IProtocol; const oprot: IProtocol);" << endl;
+    indent_down();
+    indent_down();
+    indent(s_service) << "protected" << endl;
+    indent_up();
+    indent(s_service) << "processMap_: IThriftDictionary<string, TProcessFunction>;" << endl;
+    indent_down();
+  }
+
   indent(s_service) << "public" << endl;
   indent_up();
   if (extends.empty()) {
@@ -1494,8 +1509,8 @@ void t_delphi_generator::generate_servic
   indent_up_impl();
   indent_impl(s_service_impl) << "msg := iprot.ReadMessageBegin();" << endl;
   indent_impl(s_service_impl) << "fn := nil;" << endl;
-  indent_impl(s_service_impl) << "processMap_.TryGetValue(msg.Name, fn);" << endl;
-  indent_impl(s_service_impl) << "if (@fn = nil) then" << endl;
+  indent_impl(s_service_impl) << "if not processMap_.TryGetValue(msg.Name, fn)" << endl;
+  indent_impl(s_service_impl) << "or not Assigned(fn) then" << endl;
   indent_impl(s_service_impl) << "begin" << endl;
   indent_up_impl();
   indent_impl(s_service_impl) << "TProtocolUtil.Skip(iprot, TType.Struct);" << endl;