diff --git a/packages/fcl-passrc/src/pasresolveeval.pas b/packages/fcl-passrc/src/pasresolveeval.pas index 2954fd2307..cb41ef0d5c 100644 --- a/packages/fcl-passrc/src/pasresolveeval.pas +++ b/packages/fcl-passrc/src/pasresolveeval.pas @@ -3573,6 +3573,7 @@ begin sRangeCheckInSetConstructor,[],El); end; Result.Add(RangeStart,RangeEnd); + ReleaseEvalValue(Value); end; ok:=OnlyConstElements; finally diff --git a/packages/fcl-passrc/src/pasresolver.pp b/packages/fcl-passrc/src/pasresolver.pp index 2cab80d7f5..94d81ec3d9 100644 --- a/packages/fcl-passrc/src/pasresolver.pp +++ b/packages/fcl-passrc/src/pasresolver.pp @@ -7094,6 +7094,7 @@ begin Item:=PRangeItem(Values[i]); Dispose(Item); end; + Values.Free; end; end; @@ -19952,13 +19953,17 @@ begin Range:=Eval(RangeExpr,[refConst]); if Range=nil then RaiseNotYetImplemented(20170910210416,RangeExpr); - case Range.Kind of - revkRangeInt: - Result:=TResEvalRangeInt(Range).RangeEnd-TResEvalRangeInt(Range).RangeStart+1; - revkRangeUInt: - Result:=TResEvalRangeUInt(Range).RangeEnd-TResEvalRangeUInt(Range).RangeStart+1; - else - RaiseNotYetImplemented(20170910210554,RangeExpr); + try + case Range.Kind of + revkRangeInt: + Result:=TResEvalRangeInt(Range).RangeEnd-TResEvalRangeInt(Range).RangeStart+1; + revkRangeUInt: + Result:=TResEvalRangeUInt(Range).RangeEnd-TResEvalRangeUInt(Range).RangeStart+1; + else + RaiseNotYetImplemented(20170910210554,RangeExpr); + end; + finally + ReleaseEvalValue(Range); end; {$IFDEF VerbosePasResolver} {AllowWriteln} @@ -20089,7 +20094,6 @@ begin TResEvalRangeInt(Result).ElKind:=revskInt; GetIntegerRange(BaseTypeData.BaseType, TResEvalRangeInt(Result).RangeStart,TResEvalRangeInt(Result).RangeEnd); - exit; end; end; end; diff --git a/packages/fcl-passrc/src/pastree.pp b/packages/fcl-passrc/src/pastree.pp index e081e5c65b..5893ee37a9 100644 --- a/packages/fcl-passrc/src/pastree.pp +++ b/packages/fcl-passrc/src/pastree.pp @@ -2920,6 +2920,7 @@ begin TPasElement(AList[i]).Parent:=Self; GenericTemplateTypes.Add(AList[i]); end; + AList.Clear; ObjKind:=okGeneric; end; @@ -3225,6 +3226,7 @@ begin ReleaseAndNil(TPasElement(PublicName){$IFDEF CheckPasTreeRefCount},'TPasProcedure.PublicName'{$ENDIF}); ReleaseAndNil(TPasElement(LibraryExpr){$IFDEF CheckPasTreeRefCount},'TPasProcedure.LibraryExpr'{$ENDIF}); ReleaseAndNil(TPasElement(LibrarySymbolName){$IFDEF CheckPasTreeRefCount},'TPasProcedure.LibrarySymbolName'{$ENDIF}); + ReleaseAndNil(TPasElement(DispIDExpr){$IFDEF CheckPasTreeRefCount},'TPasProcedure.DispIDExpr'{$ENDIF}); inherited Destroy; end; @@ -3999,6 +4001,7 @@ begin TPasElement(AList[i]).Parent:=Self; GenericTemplateTypes.Add(AList[i]); end; + AList.Clear; end; procedure TPasProcedureType.GetArguments(List : TStrings); diff --git a/packages/fcl-passrc/src/pparser.pp b/packages/fcl-passrc/src/pparser.pp index 78745892bf..0e33b90131 100644 --- a/packages/fcl-passrc/src/pparser.pp +++ b/packages/fcl-passrc/src/pparser.pp @@ -3476,6 +3476,8 @@ begin ParseExc(nParserGenericClassOrArray,SParserGenericClassOrArray); end; finally + for i:=0 to List.Count-1 do + TPasElement(List[i]).Release{$IFDEF CheckPasTreeRefCount}('CreateElement'){$ENDIF}; List.Free; end; end; @@ -4058,6 +4060,7 @@ var NamePos: TPasSourcePos; OldForceCaret : Boolean; List : TFPList; + i: Integer; begin TypeName := CurTokenString; @@ -4075,7 +4078,12 @@ begin Result:=ParseType(Parent,NamePos,TypeName,True,List); finally Scanner.SetForceCaret(OldForceCaret); - List.Free; + if List<>nil then + begin + for i:=0 to List.Count-1 do + TPasElement(List[i]).Release{$IFDEF CheckPasTreeRefCount}('CreateElement'){$ENDIF}; + List.Free; + end; end; end; @@ -5868,6 +5876,7 @@ begin // label mark. todo: check mark identifier in the list of labels El:=TPasImplLabelMark(CreateElement(TPasImplLabelMark,'', CurBlock,SrcPos)); TPasImplLabelMark(El).LabelId:=TPrimitiveExpr(Left).Value; + ReleaseAndNil(TPasElement(Left){$IFDEF CheckPasTreeRefCount},'CreateElement'{$ENDIF}); CurBlock.AddElement(El); CmdElem:=TPasImplLabelMark(El); El:=nil; @@ -5875,7 +5884,7 @@ begin else // simple statement (function call) El:=TPasImplSimple(CreateElement(TPasImplSimple,'',CurBlock,SrcPos)); - TPasImplSimple(El).expr:=Left; + TPasImplSimple(El).Expr:=Left; Left:=nil; AddStatement(El); El:=nil;