From: Roger Meier Date: Mon, 9 Apr 2012 16:25:47 +0000 (+0000) Subject: THRIFT-1554 Inherited service methods are not resolved in derived service implementations X-Git-Tag: 0.9.1~417 X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=380e919a13b9adbecebeb4e03c6f44d803cb13c6;p=common%2Fthrift.git 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 c746324c..6a89f19e 100644 --- a/compiler/cpp/src/generate/t_delphi_generator.cc +++ b/compiler/cpp/src/generate/t_delphi_generator.cc @@ -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.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.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;" << 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;" << 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;