THRIFT-1554 Inherited service methods are not resolved in derived service implementations
authorRoger Meier <roger@apache.org>
Mon, 9 Apr 2012 16:25:47 +0000 (16:25 +0000)
committerRoger Meier <roger@apache.org>
Mon, 9 Apr 2012 16:25:47 +0000 (16:25 +0000)
Patch: Jens Geyer

git-svn-id: https://svn.apache.org/repos/asf/thrift/trunk@1311311 13f79535-47bb-0310-9956-ffa450edef68

compiler/cpp/src/generate/t_delphi_generator.cc

index c746324..6a89f19 100644 (file)
@@ -1440,8 +1440,19 @@ void t_delphi_generator::generate_service_server(t_service* tservice) {
   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_service_server(t_service* tservice) {
   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_service_server(t_service* tservice) {
   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;