THRIFT-1554 Inherited service methods are not resolved in derived service implementations
Patch: Jens Geyer
git-svn-id: https://svn.apache.org/repos/asf/thrift/trunk@1311311 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/compiler/cpp/src/generate/t_delphi_generator.cc b/compiler/cpp/src/generate/t_delphi_generator.cc
index c746324..6a89f19 100644
--- a/compiler/cpp/src/generate/t_delphi_generator.cc
+++ b/compiler/cpp/src/generate/t_delphi_generator.cc
@@ -1440,8 +1440,19 @@
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 @@
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 @@
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;