Browse Source

pastojs: fixed mem leaks

git-svn-id: trunk@39439 -
Mattias Gaertner 7 years ago
parent
commit
b11c5943b0

+ 0 - 1
packages/pastojs/src/fppas2js.pp

@@ -18545,7 +18545,6 @@ const
     AssignSt.Expr:=FDS;
     FD:=FDS.AFunction;
     FD.Params.Add(EqualParamName);
-    FD.Body:=TJSFunctionBody(CreateElement(TJSFunctionBody,El));
     // add "return "
     RetSt:=TJSReturnStatement(CreateElement(TJSReturnStatement,El));
     FD.Body.A:=RetSt;

+ 1 - 0
packages/pastojs/src/pas2jsfilecache.pp

@@ -2097,6 +2097,7 @@ begin
     l:=ms.Size-ms.Position;
     if l>0 then
     begin
+      s:='';
       SetLength(s,l);
       ms.Read(s[1],l);
     end

+ 66 - 18
packages/pastojs/src/pas2jsfiler.pp

@@ -563,6 +563,10 @@ type
   end;
   TPCUFilerElementRefArray = array of TPCUFilerElementRef;
 
+  TPCUFilerElementRef2 = class(TPCUFilerElementRef)
+    s: string;
+  end;
+
   { TPCUFiler - base class TPCUWriter/TPCUReader}
 
   TPCUFiler = class
@@ -1822,10 +1826,18 @@ begin
 end;
 
 function TPCUFiler.CreateElementRef(El: TPasElement): TPCUFilerElementRef;
+var
+  Node: TAVLTreeNode;
 begin
   Result:=TPCUFilerElementRef.Create;
   Result.Element:=El;
+  {$IFDEF MemCheck}
+  Node:=FElementRefs.Add(Result);
+  if Node<>FElementRefs.FindKey(El,@CompareElWithPCUFilerElementRef) then
+    RaiseMsg(20180711222046,El);
+  {$ELSE}
   FElementRefs.Add(Result);
+  {$ENDIF}
 end;
 
 procedure TPCUFiler.AddedBuiltInRef(Ref: TPCUFilerElementRef);
@@ -4063,7 +4075,8 @@ begin
   if RefEl is TPasType then
     begin
     El.VarType:=TPasType(RefEl);
-    RefEl.AddRef;
+    if RefEl.Parent<>El then
+      RefEl.AddRef;
     end
   else
     RaiseMsg(20180211121809,El,GetObjName(RefEl));
@@ -4076,7 +4089,8 @@ begin
   if RefEl is TPasType then
     begin
     El.DestType:=TPasType(RefEl);
-    RefEl.AddRef;
+    if RefEl.Parent<>El then
+      RefEl.AddRef;
     end
   else
     RaiseMsg(20180211121801,El,GetObjName(RefEl));
@@ -4090,7 +4104,8 @@ begin
   if RefEl is TPasType then
     begin
     El.DestType:=TPasType(RefEl);
-    RefEl.AddRef;
+    if RefEl.Parent<>El then
+      RefEl.AddRef;
     end
   else
     RaiseMsg(20180211121757,El,GetObjName(RefEl));
@@ -4104,7 +4119,8 @@ begin
   if RefEl is TPasType then
     begin
     El.DestType:=TPasType(RefEl);
-    RefEl.AddRef;
+    if RefEl.Parent<>El then
+      RefEl.AddRef;
     end
   else
     RaiseMsg(20180211121750,El,GetObjName(RefEl));
@@ -4117,7 +4133,8 @@ begin
   if RefEl is TPasType then
     begin
     El.ElType:=TPasType(RefEl);
-    RefEl.AddRef;
+    if RefEl.Parent<>El then
+      RefEl.AddRef;
     end
   else
     RaiseMsg(20180211121732,El,GetObjName(RefEl));
@@ -4130,7 +4147,8 @@ begin
   if RefEl is TPasType then
     begin
     El.ElType:=TPasType(RefEl);
-    RefEl.AddRef;
+    if RefEl.Parent<>El then
+      RefEl.AddRef;
     end
   else
     RaiseMsg(20180211121726,El,GetObjName(RefEl));
@@ -4143,7 +4161,8 @@ begin
   if RefEl is TPasType then
     begin
     El.EnumType:=TPasType(RefEl);
-    RefEl.AddRef;
+    if RefEl.Parent<>El then
+      RefEl.AddRef;
     end
   else
     RaiseMsg(20180211121714,El,GetObjName(RefEl));
@@ -4156,7 +4175,8 @@ begin
   if RefEl is TPasRecordType then
     begin
     El.Members:=TPasRecordType(RefEl);
-    RefEl.AddRef;
+    if RefEl.Parent<>El then
+      RefEl.AddRef;
     end
   else
     RaiseMsg(20180211121657,El,GetObjName(RefEl));
@@ -4170,7 +4190,8 @@ begin
   if (RefEl is TPasType) or (RefEl.ClassType=TPasVariable) then
     begin
     El.VariantEl:=RefEl;
-    RefEl.AddRef;
+    if RefEl.Parent<>El then
+      RefEl.AddRef;
     end
   else
     RaiseMsg(20180210205031,El,GetObjName(RefEl));
@@ -4183,7 +4204,8 @@ begin
   if RefEl is TPasType then
     begin
     El.ArgType:=TPasType(RefEl);
-    RefEl.AddRef;
+    if RefEl.Parent<>El then
+      RefEl.AddRef;
     end
   else
     RaiseMsg(20180211121643,El,GetObjName(RefEl));
@@ -4251,7 +4273,8 @@ begin
   if RefEl is TPasType then
     begin
     El.AncestorType:=TPasType(RefEl);
-    RefEl.AddRef;
+    if RefEl.Parent<>El then
+      RefEl.AddRef;
     end
   else
     RaiseMsg(20180211121632,El,GetObjName(RefEl));
@@ -4265,7 +4288,8 @@ begin
   if RefEl is TPasType then
     begin
     El.HelperForType:=TPasType(RefEl);
-    RefEl.AddRef;
+    if RefEl.Parent<>El then
+      RefEl.AddRef;
     end
   else
     RaiseMsg(20180211121612,El,GetObjName(RefEl));
@@ -4279,7 +4303,8 @@ begin
   if RefEl is TPasType then
     begin
     El.ResultType:=TPasType(RefEl);
-    RefEl.AddRef;
+    if RefEl.Parent<>El then
+      RefEl.AddRef;
     end
   else
     RaiseMsg(20180211121537,El,GetObjName(RefEl));
@@ -4358,7 +4383,8 @@ begin
     begin
     Scope:=El.CustomData as TPasEnumTypeScope;
     Scope.CanonicalSet:=TPasSetType(RefEl);
-    RefEl.AddRef;
+    if RefEl.Parent<>El then
+      RefEl.AddRef;
     end
   else
     RaiseMsg(20180316215238,Scope.Element,GetObjName(RefEl));
@@ -4555,6 +4581,9 @@ var
   RefItem: TPCUFilerPendingElRef;
   PendingElRef: TPCUReaderPendingElRef;
   PendingElListRef: TPCUReaderPendingElListRef;
+  {$IF defined(VerbosePCUFiler) or defined(memcheck)}
+  Node: TAVLTreeNode;
+  {$ENDIF}
 begin
   if Id<=0 then
     RaiseMsg(20180207151233,ErrorEl);
@@ -4580,18 +4609,30 @@ begin
       end
     else
       begin
-      Ref:=TPCUFilerElementRef.Create;
+      Ref:=TPCUFilerElementRef2.Create;
+      TPCUFilerElementRef2(Ref).s:=IntToStr(Id);
       Ref.Id:=Id;
       end;
+    {$IF defined(VerbosePCUFiler) or defined(memcheck)}
+    if FElementRefsArray[Id]<>nil then
+      RaiseMsg(20180711212859,ErrorEl,IntToStr(Id)+' is not FElementRefsArray[Id]');
+    {$ENDIF}
     FElementRefsArray[Id]:=Ref;
     end;
   Result:=Ref;
 
-  if El=nil then exit;
-
-  if Ref.Element=nil then
+  if El=nil then
+    exit
+  else if Ref.Element=nil then
     begin
     Ref.Element:=El;
+    {$IF defined(VerbosePCUFiler) or defined(memcheck)}
+    Node:=FElementRefs.FindKey(El,@CompareElWithPCUFilerElementRef);
+    if Node<>nil then
+      RaiseMsg(20180711231646,El,GetObjName(TPCUFilerElementRef2(Node.Data).Element));
+    {$ENDIF}
+    FElementRefs.Add(Ref);
+
     if Ref.Pending<>nil then
       begin
       // resolve pending references
@@ -7520,13 +7561,19 @@ end;
 
 destructor TPCUReader.Destroy;
 begin
+  FreeAndNil(FJSON);
   inherited Destroy;
   FreeAndNil(FPendingIdentifierScopes);
   FreeAndNil(FInitialFlags);
 end;
 
 procedure TPCUReader.Clear;
+var
+  i: Integer;
 begin
+  for i:=0 to length(FElementRefsArray)-1 do
+    if (FElementRefsArray[i]<>nil) and (FElementRefsArray[i].Element=nil) then
+      FElementRefsArray[i].Free;
   FElementRefsArray:=nil;
   FPendingIdentifierScopes.Clear;
   inherited Clear;
@@ -7543,6 +7590,7 @@ var
   Count: Cardinal;
   Src: TStream;
 begin
+  FirstBytes:='';
   SetLength(FirstBytes,4);
   if aStream.Read(FirstBytes[1],4)<4 then
     RaiseMsg(20180313232754,nil);