Author: roger
Date: Wed Jun  6 10:32:24 2012
New Revision: 1346814

URL: http://svn.apache.org/viewvc?rev=1346814&view=rev
Log:
THRIFT-1621 Delphi Memory leaks
Patch: Jens Geyer

Modified:
    thrift/trunk/compiler/cpp/src/generate/t_delphi_generator.cc
    thrift/trunk/lib/delphi/src/Thrift.Protocol.JSON.pas

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=1346814&r1=1346813&r2=1346814&view=diff
==============================================================================
--- thrift/trunk/compiler/cpp/src/generate/t_delphi_generator.cc (original)
+++ thrift/trunk/compiler/cpp/src/generate/t_delphi_generator.cc Wed Jun  6 
10:32:24 2012
@@ -1611,7 +1611,8 @@ void t_delphi_generator::generate_servic
   indent_impl(s_service_impl) << "TProtocolUtil.Skip(iprot, TType.Struct);" << 
endl;
   indent_impl(s_service_impl) << "iprot.ReadMessageEnd();" << endl;
   indent_impl(s_service_impl) << "x := 
TApplicationException.Create(TApplicationException.TExceptionType.UnknownMethod,
 'Invalid method name: ''' + msg.Name + '''');" << endl;
-  indent_impl(s_service_impl) << 
"oprot.WriteMessageBegin(TMessageImpl.Create(msg.Name, TMessageType.Exception, 
msg.SeqID));" << endl;
+  indent_impl(s_service_impl) << "msg := TMessageImpl.Create(msg.Name, 
TMessageType.Exception, msg.SeqID);" << endl;
+  indent_impl(s_service_impl) << "oprot.WriteMessageBegin( msg);" << endl;
   indent_impl(s_service_impl) << "x.Write(oprot);" << endl;
   indent_impl(s_service_impl) << "oprot.WriteMessageEnd();" << endl;
   indent_impl(s_service_impl) << "oprot.Transport.Flush();" << endl;
@@ -1691,6 +1692,7 @@ void t_delphi_generator::generate_proces
   indent_up_impl();
   indent_impl(s_service_impl) << "args: " << args_intfnm << ";" << endl;
   if (!tfunction->is_oneway()) {
+    indent_impl(s_service_impl) << "msg: IMessage;" << endl;
     indent_impl(s_service_impl) << "ret: " << result_intfnm << ";" << endl;
   }
 
@@ -1760,7 +1762,8 @@ void t_delphi_generator::generate_proces
   }
 
   if (! tfunction->is_oneway()) {
-    indent_impl(s_service_impl) << "oprot.WriteMessageBegin( 
TMessageImpl.Create('" << tfunction->get_name() << "', TMessageType.Reply, 
seqid)); " << endl;
+    indent_impl(s_service_impl) << "msg := TMessageImpl.Create('" << 
tfunction->get_name() << "', TMessageType.Reply, seqid); " << endl;
+    indent_impl(s_service_impl) << "oprot.WriteMessageBegin( msg); " << endl;
     indent_impl(s_service_impl) << "ret.Write(oprot);" << endl;
     indent_impl(s_service_impl) << "oprot.WriteMessageEnd();" << endl;
     indent_impl(s_service_impl) << "oprot.Transport.Flush();" << endl;

Modified: thrift/trunk/lib/delphi/src/Thrift.Protocol.JSON.pas
URL: 
http://svn.apache.org/viewvc/thrift/trunk/lib/delphi/src/Thrift.Protocol.JSON.pas?rev=1346814&r1=1346813&r2=1346814&view=diff
==============================================================================
--- thrift/trunk/lib/delphi/src/Thrift.Protocol.JSON.pas (original)
+++ thrift/trunk/lib/delphi/src/Thrift.Protocol.JSON.pas Wed Jun  6 10:32:24 
2012
@@ -62,7 +62,7 @@ type
       // This base context does nothing.
       TJSONBaseContext = class
       protected
-        FProto : IJSONProtocol;
+        FProto : Pointer;  // weak IJSONProtocol;
       public
         constructor Create( const aProto : IJSONProtocol);
         procedure Write;  virtual;
@@ -97,7 +97,7 @@ type
       // Holds up to one byte from the transport
       TLookaheadReader = class
       protected
-        FProto : IJSONProtocol;
+        FProto : Pointer;  // weak IJSONProtocol;
         constructor Create( const aProto : IJSONProtocol);
 
       private
@@ -335,7 +335,7 @@ end;
 constructor TJSONProtocolImpl.TJSONBaseContext.Create( const aProto : 
IJSONProtocol);
 begin
   inherited Create;
-  FProto := aProto;
+  FProto := Pointer(aProto);
 end;
 
 
@@ -368,7 +368,7 @@ procedure TJSONProtocolImpl.TJSONListCon
 begin
   if FFirst
   then FFirst := FALSE
-  else FProto.Transport.Write( COMMA);
+  else IJSONProtocol(FProto).Transport.Write( COMMA);
 end;
 
 
@@ -376,7 +376,7 @@ procedure TJSONProtocolImpl.TJSONListCon
 begin
   if FFirst
   then FFirst := FALSE
-  else FProto.ReadJSONSyntaxChar( COMMA[0]);
+  else IJSONProtocol(FProto).ReadJSONSyntaxChar( COMMA[0]);
 end;
 
 
@@ -396,8 +396,8 @@ begin
   end
   else begin
     if FColon
-    then FProto.Transport.Write( COLON)
-    else FProto.Transport.Write( COMMA);
+    then IJSONProtocol(FProto).Transport.Write( COLON)
+    else IJSONProtocol(FProto).Transport.Write( COMMA);
     FColon := not FColon;
   end;
 end;
@@ -411,8 +411,8 @@ begin
   end
   else begin
     if FColon
-    then FProto.ReadJSONSyntaxChar( COLON[0])
-    else FProto.ReadJSONSyntaxChar( COMMA[0]);
+    then IJSONProtocol(FProto).ReadJSONSyntaxChar( COLON[0])
+    else IJSONProtocol(FProto).ReadJSONSyntaxChar( COMMA[0]);
     FColon := not FColon;
   end;
 end;
@@ -427,7 +427,7 @@ end;
 constructor TJSONProtocolImpl.TLookaheadReader.Create( const aProto : 
IJSONProtocol);
 begin
   inherited Create;
-  FProto   := aProto;
+  FProto   := Pointer(aProto);
   FHasData := FALSE;
 end;
 
@@ -438,7 +438,7 @@ begin
   then FHasData := FALSE
   else begin
     SetLength( FData, 1);
-    FProto.Transport.ReadAll( FData, 0, 1);
+    IJSONProtocol(FProto).Transport.ReadAll( FData, 0, 1);
   end;
   result := FData[0];
 end;
@@ -448,7 +448,7 @@ function TJSONProtocolImpl.TLookaheadRea
 begin
   if not FHasData then begin
     SetLength( FData, 1);
-    FProto.Transport.ReadAll( FData, 0, 1);
+    IJSONProtocol(FProto).Transport.ReadAll( FData, 0, 1);
     FHasData := TRUE;
   end;
   result := FData[0];


Reply via email to