mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-10-31 09:32:00 +01:00 
			
		
		
		
	pastojs: fixed mem leaks
git-svn-id: trunk@39439 -
This commit is contained in:
		
							parent
							
								
									c7e07a792c
								
							
						
					
					
						commit
						b11c5943b0
					
				| @ -18545,7 +18545,6 @@ const | |||||||
|     AssignSt.Expr:=FDS; |     AssignSt.Expr:=FDS; | ||||||
|     FD:=FDS.AFunction; |     FD:=FDS.AFunction; | ||||||
|     FD.Params.Add(EqualParamName); |     FD.Params.Add(EqualParamName); | ||||||
|     FD.Body:=TJSFunctionBody(CreateElement(TJSFunctionBody,El)); |  | ||||||
|     // add "return " |     // add "return " | ||||||
|     RetSt:=TJSReturnStatement(CreateElement(TJSReturnStatement,El)); |     RetSt:=TJSReturnStatement(CreateElement(TJSReturnStatement,El)); | ||||||
|     FD.Body.A:=RetSt; |     FD.Body.A:=RetSt; | ||||||
|  | |||||||
| @ -2097,6 +2097,7 @@ begin | |||||||
|     l:=ms.Size-ms.Position; |     l:=ms.Size-ms.Position; | ||||||
|     if l>0 then |     if l>0 then | ||||||
|     begin |     begin | ||||||
|  |       s:=''; | ||||||
|       SetLength(s,l); |       SetLength(s,l); | ||||||
|       ms.Read(s[1],l); |       ms.Read(s[1],l); | ||||||
|     end |     end | ||||||
|  | |||||||
| @ -563,6 +563,10 @@ type | |||||||
|   end; |   end; | ||||||
|   TPCUFilerElementRefArray = array of TPCUFilerElementRef; |   TPCUFilerElementRefArray = array of TPCUFilerElementRef; | ||||||
| 
 | 
 | ||||||
|  |   TPCUFilerElementRef2 = class(TPCUFilerElementRef) | ||||||
|  |     s: string; | ||||||
|  |   end; | ||||||
|  | 
 | ||||||
|   { TPCUFiler - base class TPCUWriter/TPCUReader} |   { TPCUFiler - base class TPCUWriter/TPCUReader} | ||||||
| 
 | 
 | ||||||
|   TPCUFiler = class |   TPCUFiler = class | ||||||
| @ -1822,10 +1826,18 @@ begin | |||||||
| end; | end; | ||||||
| 
 | 
 | ||||||
| function TPCUFiler.CreateElementRef(El: TPasElement): TPCUFilerElementRef; | function TPCUFiler.CreateElementRef(El: TPasElement): TPCUFilerElementRef; | ||||||
|  | var | ||||||
|  |   Node: TAVLTreeNode; | ||||||
| begin | begin | ||||||
|   Result:=TPCUFilerElementRef.Create; |   Result:=TPCUFilerElementRef.Create; | ||||||
|   Result.Element:=El; |   Result.Element:=El; | ||||||
|  |   {$IFDEF MemCheck} | ||||||
|  |   Node:=FElementRefs.Add(Result); | ||||||
|  |   if Node<>FElementRefs.FindKey(El,@CompareElWithPCUFilerElementRef) then | ||||||
|  |     RaiseMsg(20180711222046,El); | ||||||
|  |   {$ELSE} | ||||||
|   FElementRefs.Add(Result); |   FElementRefs.Add(Result); | ||||||
|  |   {$ENDIF} | ||||||
| end; | end; | ||||||
| 
 | 
 | ||||||
| procedure TPCUFiler.AddedBuiltInRef(Ref: TPCUFilerElementRef); | procedure TPCUFiler.AddedBuiltInRef(Ref: TPCUFilerElementRef); | ||||||
| @ -4063,7 +4075,8 @@ begin | |||||||
|   if RefEl is TPasType then |   if RefEl is TPasType then | ||||||
|     begin |     begin | ||||||
|     El.VarType:=TPasType(RefEl); |     El.VarType:=TPasType(RefEl); | ||||||
|     RefEl.AddRef; |     if RefEl.Parent<>El then | ||||||
|  |       RefEl.AddRef; | ||||||
|     end |     end | ||||||
|   else |   else | ||||||
|     RaiseMsg(20180211121809,El,GetObjName(RefEl)); |     RaiseMsg(20180211121809,El,GetObjName(RefEl)); | ||||||
| @ -4076,7 +4089,8 @@ begin | |||||||
|   if RefEl is TPasType then |   if RefEl is TPasType then | ||||||
|     begin |     begin | ||||||
|     El.DestType:=TPasType(RefEl); |     El.DestType:=TPasType(RefEl); | ||||||
|     RefEl.AddRef; |     if RefEl.Parent<>El then | ||||||
|  |       RefEl.AddRef; | ||||||
|     end |     end | ||||||
|   else |   else | ||||||
|     RaiseMsg(20180211121801,El,GetObjName(RefEl)); |     RaiseMsg(20180211121801,El,GetObjName(RefEl)); | ||||||
| @ -4090,7 +4104,8 @@ begin | |||||||
|   if RefEl is TPasType then |   if RefEl is TPasType then | ||||||
|     begin |     begin | ||||||
|     El.DestType:=TPasType(RefEl); |     El.DestType:=TPasType(RefEl); | ||||||
|     RefEl.AddRef; |     if RefEl.Parent<>El then | ||||||
|  |       RefEl.AddRef; | ||||||
|     end |     end | ||||||
|   else |   else | ||||||
|     RaiseMsg(20180211121757,El,GetObjName(RefEl)); |     RaiseMsg(20180211121757,El,GetObjName(RefEl)); | ||||||
| @ -4104,7 +4119,8 @@ begin | |||||||
|   if RefEl is TPasType then |   if RefEl is TPasType then | ||||||
|     begin |     begin | ||||||
|     El.DestType:=TPasType(RefEl); |     El.DestType:=TPasType(RefEl); | ||||||
|     RefEl.AddRef; |     if RefEl.Parent<>El then | ||||||
|  |       RefEl.AddRef; | ||||||
|     end |     end | ||||||
|   else |   else | ||||||
|     RaiseMsg(20180211121750,El,GetObjName(RefEl)); |     RaiseMsg(20180211121750,El,GetObjName(RefEl)); | ||||||
| @ -4117,7 +4133,8 @@ begin | |||||||
|   if RefEl is TPasType then |   if RefEl is TPasType then | ||||||
|     begin |     begin | ||||||
|     El.ElType:=TPasType(RefEl); |     El.ElType:=TPasType(RefEl); | ||||||
|     RefEl.AddRef; |     if RefEl.Parent<>El then | ||||||
|  |       RefEl.AddRef; | ||||||
|     end |     end | ||||||
|   else |   else | ||||||
|     RaiseMsg(20180211121732,El,GetObjName(RefEl)); |     RaiseMsg(20180211121732,El,GetObjName(RefEl)); | ||||||
| @ -4130,7 +4147,8 @@ begin | |||||||
|   if RefEl is TPasType then |   if RefEl is TPasType then | ||||||
|     begin |     begin | ||||||
|     El.ElType:=TPasType(RefEl); |     El.ElType:=TPasType(RefEl); | ||||||
|     RefEl.AddRef; |     if RefEl.Parent<>El then | ||||||
|  |       RefEl.AddRef; | ||||||
|     end |     end | ||||||
|   else |   else | ||||||
|     RaiseMsg(20180211121726,El,GetObjName(RefEl)); |     RaiseMsg(20180211121726,El,GetObjName(RefEl)); | ||||||
| @ -4143,7 +4161,8 @@ begin | |||||||
|   if RefEl is TPasType then |   if RefEl is TPasType then | ||||||
|     begin |     begin | ||||||
|     El.EnumType:=TPasType(RefEl); |     El.EnumType:=TPasType(RefEl); | ||||||
|     RefEl.AddRef; |     if RefEl.Parent<>El then | ||||||
|  |       RefEl.AddRef; | ||||||
|     end |     end | ||||||
|   else |   else | ||||||
|     RaiseMsg(20180211121714,El,GetObjName(RefEl)); |     RaiseMsg(20180211121714,El,GetObjName(RefEl)); | ||||||
| @ -4156,7 +4175,8 @@ begin | |||||||
|   if RefEl is TPasRecordType then |   if RefEl is TPasRecordType then | ||||||
|     begin |     begin | ||||||
|     El.Members:=TPasRecordType(RefEl); |     El.Members:=TPasRecordType(RefEl); | ||||||
|     RefEl.AddRef; |     if RefEl.Parent<>El then | ||||||
|  |       RefEl.AddRef; | ||||||
|     end |     end | ||||||
|   else |   else | ||||||
|     RaiseMsg(20180211121657,El,GetObjName(RefEl)); |     RaiseMsg(20180211121657,El,GetObjName(RefEl)); | ||||||
| @ -4170,7 +4190,8 @@ begin | |||||||
|   if (RefEl is TPasType) or (RefEl.ClassType=TPasVariable) then |   if (RefEl is TPasType) or (RefEl.ClassType=TPasVariable) then | ||||||
|     begin |     begin | ||||||
|     El.VariantEl:=RefEl; |     El.VariantEl:=RefEl; | ||||||
|     RefEl.AddRef; |     if RefEl.Parent<>El then | ||||||
|  |       RefEl.AddRef; | ||||||
|     end |     end | ||||||
|   else |   else | ||||||
|     RaiseMsg(20180210205031,El,GetObjName(RefEl)); |     RaiseMsg(20180210205031,El,GetObjName(RefEl)); | ||||||
| @ -4183,7 +4204,8 @@ begin | |||||||
|   if RefEl is TPasType then |   if RefEl is TPasType then | ||||||
|     begin |     begin | ||||||
|     El.ArgType:=TPasType(RefEl); |     El.ArgType:=TPasType(RefEl); | ||||||
|     RefEl.AddRef; |     if RefEl.Parent<>El then | ||||||
|  |       RefEl.AddRef; | ||||||
|     end |     end | ||||||
|   else |   else | ||||||
|     RaiseMsg(20180211121643,El,GetObjName(RefEl)); |     RaiseMsg(20180211121643,El,GetObjName(RefEl)); | ||||||
| @ -4251,7 +4273,8 @@ begin | |||||||
|   if RefEl is TPasType then |   if RefEl is TPasType then | ||||||
|     begin |     begin | ||||||
|     El.AncestorType:=TPasType(RefEl); |     El.AncestorType:=TPasType(RefEl); | ||||||
|     RefEl.AddRef; |     if RefEl.Parent<>El then | ||||||
|  |       RefEl.AddRef; | ||||||
|     end |     end | ||||||
|   else |   else | ||||||
|     RaiseMsg(20180211121632,El,GetObjName(RefEl)); |     RaiseMsg(20180211121632,El,GetObjName(RefEl)); | ||||||
| @ -4265,7 +4288,8 @@ begin | |||||||
|   if RefEl is TPasType then |   if RefEl is TPasType then | ||||||
|     begin |     begin | ||||||
|     El.HelperForType:=TPasType(RefEl); |     El.HelperForType:=TPasType(RefEl); | ||||||
|     RefEl.AddRef; |     if RefEl.Parent<>El then | ||||||
|  |       RefEl.AddRef; | ||||||
|     end |     end | ||||||
|   else |   else | ||||||
|     RaiseMsg(20180211121612,El,GetObjName(RefEl)); |     RaiseMsg(20180211121612,El,GetObjName(RefEl)); | ||||||
| @ -4279,7 +4303,8 @@ begin | |||||||
|   if RefEl is TPasType then |   if RefEl is TPasType then | ||||||
|     begin |     begin | ||||||
|     El.ResultType:=TPasType(RefEl); |     El.ResultType:=TPasType(RefEl); | ||||||
|     RefEl.AddRef; |     if RefEl.Parent<>El then | ||||||
|  |       RefEl.AddRef; | ||||||
|     end |     end | ||||||
|   else |   else | ||||||
|     RaiseMsg(20180211121537,El,GetObjName(RefEl)); |     RaiseMsg(20180211121537,El,GetObjName(RefEl)); | ||||||
| @ -4358,7 +4383,8 @@ begin | |||||||
|     begin |     begin | ||||||
|     Scope:=El.CustomData as TPasEnumTypeScope; |     Scope:=El.CustomData as TPasEnumTypeScope; | ||||||
|     Scope.CanonicalSet:=TPasSetType(RefEl); |     Scope.CanonicalSet:=TPasSetType(RefEl); | ||||||
|     RefEl.AddRef; |     if RefEl.Parent<>El then | ||||||
|  |       RefEl.AddRef; | ||||||
|     end |     end | ||||||
|   else |   else | ||||||
|     RaiseMsg(20180316215238,Scope.Element,GetObjName(RefEl)); |     RaiseMsg(20180316215238,Scope.Element,GetObjName(RefEl)); | ||||||
| @ -4555,6 +4581,9 @@ var | |||||||
|   RefItem: TPCUFilerPendingElRef; |   RefItem: TPCUFilerPendingElRef; | ||||||
|   PendingElRef: TPCUReaderPendingElRef; |   PendingElRef: TPCUReaderPendingElRef; | ||||||
|   PendingElListRef: TPCUReaderPendingElListRef; |   PendingElListRef: TPCUReaderPendingElListRef; | ||||||
|  |   {$IF defined(VerbosePCUFiler) or defined(memcheck)} | ||||||
|  |   Node: TAVLTreeNode; | ||||||
|  |   {$ENDIF} | ||||||
| begin | begin | ||||||
|   if Id<=0 then |   if Id<=0 then | ||||||
|     RaiseMsg(20180207151233,ErrorEl); |     RaiseMsg(20180207151233,ErrorEl); | ||||||
| @ -4580,18 +4609,30 @@ begin | |||||||
|       end |       end | ||||||
|     else |     else | ||||||
|       begin |       begin | ||||||
|       Ref:=TPCUFilerElementRef.Create; |       Ref:=TPCUFilerElementRef2.Create; | ||||||
|  |       TPCUFilerElementRef2(Ref).s:=IntToStr(Id); | ||||||
|       Ref.Id:=Id; |       Ref.Id:=Id; | ||||||
|       end; |       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; |     FElementRefsArray[Id]:=Ref; | ||||||
|     end; |     end; | ||||||
|   Result:=Ref; |   Result:=Ref; | ||||||
| 
 | 
 | ||||||
|   if El=nil then exit; |   if El=nil then | ||||||
| 
 |     exit | ||||||
|   if Ref.Element=nil then |   else if Ref.Element=nil then | ||||||
|     begin |     begin | ||||||
|     Ref.Element:=El; |     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 |     if Ref.Pending<>nil then | ||||||
|       begin |       begin | ||||||
|       // resolve pending references |       // resolve pending references | ||||||
| @ -7520,13 +7561,19 @@ end; | |||||||
| 
 | 
 | ||||||
| destructor TPCUReader.Destroy; | destructor TPCUReader.Destroy; | ||||||
| begin | begin | ||||||
|  |   FreeAndNil(FJSON); | ||||||
|   inherited Destroy; |   inherited Destroy; | ||||||
|   FreeAndNil(FPendingIdentifierScopes); |   FreeAndNil(FPendingIdentifierScopes); | ||||||
|   FreeAndNil(FInitialFlags); |   FreeAndNil(FInitialFlags); | ||||||
| end; | end; | ||||||
| 
 | 
 | ||||||
| procedure TPCUReader.Clear; | procedure TPCUReader.Clear; | ||||||
|  | var | ||||||
|  |   i: Integer; | ||||||
| begin | begin | ||||||
|  |   for i:=0 to length(FElementRefsArray)-1 do | ||||||
|  |     if (FElementRefsArray[i]<>nil) and (FElementRefsArray[i].Element=nil) then | ||||||
|  |       FElementRefsArray[i].Free; | ||||||
|   FElementRefsArray:=nil; |   FElementRefsArray:=nil; | ||||||
|   FPendingIdentifierScopes.Clear; |   FPendingIdentifierScopes.Clear; | ||||||
|   inherited Clear; |   inherited Clear; | ||||||
| @ -7543,6 +7590,7 @@ var | |||||||
|   Count: Cardinal; |   Count: Cardinal; | ||||||
|   Src: TStream; |   Src: TStream; | ||||||
| begin | begin | ||||||
|  |   FirstBytes:=''; | ||||||
|   SetLength(FirstBytes,4); |   SetLength(FirstBytes,4); | ||||||
|   if aStream.Read(FirstBytes[1],4)<4 then |   if aStream.Read(FirstBytes[1],4)<4 then | ||||||
|     RaiseMsg(20180313232754,nil); |     RaiseMsg(20180313232754,nil); | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Mattias Gaertner
						Mattias Gaertner