pastojs: fixed mem leaks

git-svn-id: trunk@39412 -
This commit is contained in:
Mattias Gaertner 2018-07-07 18:18:18 +00:00
parent 733f220042
commit 6bf3fd6475
3 changed files with 116 additions and 98 deletions

View File

@ -1209,6 +1209,7 @@ type
public public
constructor Create; constructor Create;
destructor Destroy; override; destructor Destroy; override;
procedure ClearBuiltInIdentifiers; override;
// base types // base types
function IsJSBaseType(TypeEl: TPasType; Typ: TPas2jsBaseType): boolean; function IsJSBaseType(TypeEl: TPasType; Typ: TPas2jsBaseType): boolean;
function IsJSBaseType(const TypeResolved: TPasResolverResult; function IsJSBaseType(const TypeResolved: TPasResolverResult;
@ -3905,6 +3906,15 @@ begin
inherited Destroy; inherited Destroy;
end; end;
procedure TPas2JSResolver.ClearBuiltInIdentifiers;
var
bt: TPas2jsBaseType;
begin
inherited ClearBuiltInIdentifiers;
for bt in TPas2jsBaseType do
ReleaseAndNil(TPasElement(FJSBaseTypes[bt]));
end;
function TPas2JSResolver.IsJSBaseType(TypeEl: TPasType; Typ: TPas2jsBaseType function TPas2JSResolver.IsJSBaseType(TypeEl: TPasType; Typ: TPas2jsBaseType
): boolean; ): boolean;
begin begin
@ -6813,11 +6823,13 @@ begin
begin begin
// const with expression // const with expression
Value:=aResolver.Eval(TPasConst(Decl).Expr,[refConst]); Value:=aResolver.Eval(TPasConst(Decl).Expr,[refConst]);
if (Value<>nil) if Value<>nil then
and (Value.Kind in [revkNil,revkBool,revkInt,revkUInt,revkFloat,revkEnum]) then
try try
Result:=ConvertConstValue(Value,AContext,El); if Value.Kind in [revkNil,revkBool,revkInt,revkUInt,revkFloat,revkEnum] then
exit; begin
Result:=ConvertConstValue(Value,AContext,El);
exit;
end;
finally finally
ReleaseEvalValue(Value); ReleaseEvalValue(Value);
end; end;
@ -7343,110 +7355,112 @@ var
LowRg:=ArgContext.Resolver.EvalRangeLimit(Ranges[i-1],[refConst],true,El); LowRg:=ArgContext.Resolver.EvalRangeLimit(Ranges[i-1],[refConst],true,El);
if LowRg=nil then if LowRg=nil then
RaiseNotSupported(Param,ArgContext,20170910163341); RaiseNotSupported(Param,ArgContext,20170910163341);
Int:=0; try
case LowRg.Kind of Int:=0;
revkBool: case LowRg.Kind of
if TResEvalBool(LowRg).B=false then revkBool:
begin if TResEvalBool(LowRg).B=false then
// array starts at 'false'
if (Arg is TJSLiteral) and (TJSLiteral(Arg).Value.ValueType=jstBoolean) then
begin begin
// convert Pascal boolean literal to JS number // array starts at 'false'
if TJSLiteral(Arg).Value.AsBoolean then if (Arg is TJSLiteral) and (TJSLiteral(Arg).Value.ValueType=jstBoolean) then
TJSLiteral(Arg).Value.AsNumber:=1 begin
// convert Pascal boolean literal to JS number
if TJSLiteral(Arg).Value.AsBoolean then
TJSLiteral(Arg).Value.AsNumber:=1
else
TJSLiteral(Arg).Value.AsNumber:=0;
end
else else
TJSLiteral(Arg).Value.AsNumber:=0; begin
// -> convert bool to int with unary plus: +bool
JSUnaryPlus:=TJSUnaryPlusExpression(CreateElement(TJSUnaryPlusExpression,Param));
JSUnaryPlus.A:=Arg;
Arg:=JSUnaryPlus;
end;
end end
else else
begin begin
// -> convert bool to int with unary plus: +bool // array starts at 'true'
JSUnaryPlus:=TJSUnaryPlusExpression(CreateElement(TJSUnaryPlusExpression,Param)); if (Arg is TJSLiteral) and (TJSLiteral(Arg).Value.ValueType=jstBoolean) then
JSUnaryPlus.A:=Arg; begin
Arg:=JSUnaryPlus; if TJSLiteral(Arg).Value.AsBoolean then
end; TJSLiteral(Arg).Value.AsNumber:=0
end else
else ArgContext.Resolver.ExprEvaluator.EmitRangeCheckConst(
begin 20170910203312,'false','true','true',Param,mtError);
// array starts at 'true' end
if (Arg is TJSLiteral) and (TJSLiteral(Arg).Value.ValueType=jstBoolean) then
begin
if TJSLiteral(Arg).Value.AsBoolean then
TJSLiteral(Arg).Value.AsNumber:=0
else else
ArgContext.Resolver.ExprEvaluator.EmitRangeCheckConst( begin
20170910203312,'false','true','true',Param,mtError); // convert bool to int with offset: 1-bool
JSAdd:=TJSAdditiveExpressionMinus(CreateElement(TJSAdditiveExpressionMinus,Param));
JSAdd.A:=CreateLiteralNumber(Param,1);
JSAdd.B:=Arg;
Arg:=JSAdd;
end;
end;
revkEnum:
Int:=TResEvalEnum(LowRg).Index;
revkInt:
Int:=TResEvalInt(LowRg).Int;
revkString:
begin
if length(TResEvalString(LowRg).S)<>1 then
begin
if ArgContext.Resolver.ExprEvaluator.GetWideChar(TResEvalString(LowRg).S,w) then
Int:=ord(w)
else
ArgContext.Resolver.RaiseXExpectedButYFound(20170910213203,'char','string',Param);
end
else
Int:=ord(TResEvalString(LowRg).S[1]);
if (Arg is TJSLiteral) and (TJSLiteral(Arg).Value.ValueType=jstString) then
begin
// convert char literal to int
ConvertCharLiteralToInt(TJSLiteral(Arg),Param,ArgContext);
end end
else else
begin begin
// convert bool to int with offset: 1-bool // convert char to int -> Arg.charCodeAt(0)
JSAdd:=TJSAdditiveExpressionMinus(CreateElement(TJSAdditiveExpressionMinus,Param)); Arg:=CreateCallCharCodeAt(Arg,0,Param);
JSAdd.A:=CreateLiteralNumber(Param,1);
JSAdd.B:=Arg;
Arg:=JSAdd;
end; end;
end; end;
revkEnum: revkUnicodeString:
Int:=TResEvalEnum(LowRg).Index; if length(TResEvalUTF16(LowRg).S)<>1 then
revkInt: ArgContext.Resolver.RaiseXExpectedButYFound(20170910213247,'char','string',Param)
Int:=TResEvalInt(LowRg).Int;
revkString:
begin
if length(TResEvalString(LowRg).S)<>1 then
begin
if ArgContext.Resolver.ExprEvaluator.GetWideChar(TResEvalString(LowRg).S,w) then
Int:=ord(w)
else else
ArgContext.Resolver.RaiseXExpectedButYFound(20170910213203,'char','string',Param); Int:=ord(TResEvalUTF16(LowRg).S[1]);
end
else else
Int:=ord(TResEvalString(LowRg).S[1]); RaiseNotSupported(Param,ArgContext,20170910170446);
if (Arg is TJSLiteral) and (TJSLiteral(Arg).Value.ValueType=jstString) then
begin
// convert char literal to int
ConvertCharLiteralToInt(TJSLiteral(Arg),Param,ArgContext);
end
else
begin
// convert char to int -> Arg.charCodeAt(0)
Arg:=CreateCallCharCodeAt(Arg,0,Param);
end;
end; end;
revkUnicodeString: if Int<>0 then
if length(TResEvalUTF16(LowRg).S)<>1 then begin
ArgContext.Resolver.RaiseXExpectedButYFound(20170910213247,'char','string',Param) if (Arg is TJSLiteral) and (TJSLiteral(Arg).Value.ValueType=jstNumber) then
else // parameter is single number -> simply subtract the offset
Int:=ord(TResEvalUTF16(LowRg).S[1]); TJSLiteral(Arg).Value.AsNumber:=TJSLiteral(Arg).Value.AsNumber-Int
else else
begin
// parameter is an expression -> add offset
if Int>0 then
begin
// Arg-Offset
JSAdd:=TJSAdditiveExpressionMinus(CreateElement(TJSAdditiveExpressionMinus,Param));
JSAdd.A:=Arg;
JSAdd.B:=CreateLiteralNumber(Param,Int);
Arg:=JSAdd;
end
else
begin
// Arg+Offset
JSAdd:=TJSAdditiveExpressionPlus(CreateElement(TJSAdditiveExpressionPlus,Param));
JSAdd.A:=Arg;
JSAdd.B:=CreateLiteralNumber(Param,-Int);
Arg:=JSAdd;
end;
end;
end;
finally
ReleaseEvalValue(LowRg); ReleaseEvalValue(LowRg);
RaiseNotSupported(Param,ArgContext,20170910170446);
end; end;
if Int<>0 then
begin
if (Arg is TJSLiteral) and (TJSLiteral(Arg).Value.ValueType=jstNumber) then
// parameter is single number -> simply subtract the offset
TJSLiteral(Arg).Value.AsNumber:=TJSLiteral(Arg).Value.AsNumber-Int
else
begin
// parameter is an expression -> add offset
if Int>0 then
begin
// Arg-Offset
JSAdd:=TJSAdditiveExpressionMinus(CreateElement(TJSAdditiveExpressionMinus,Param));
JSAdd.A:=Arg;
JSAdd.B:=CreateLiteralNumber(Param,Int);
Arg:=JSAdd;
end
else
begin
// Arg+Offset
JSAdd:=TJSAdditiveExpressionPlus(CreateElement(TJSAdditiveExpressionPlus,Param));
JSAdd.A:=Arg;
JSAdd.B:=CreateLiteralNumber(Param,-Int);
Arg:=JSAdd;
end;
end;
end;
ReleaseEvalValue(LowRg);
end; end;
ArgList.Add(Arg); ArgList.Add(Arg);
@ -7514,10 +7528,10 @@ var
begin begin
ArrJS.Free; ArrJS.Free;
for i:=0 to ArgList.Count-1 do TJSElement(ArgList[i]).Free; for i:=0 to ArgList.Count-1 do TJSElement(ArgList[i]).Free;
ArgList.Free;
Arg.Free; Arg.Free;
Result.Free; Result.Free;
end; end;
ArgList.Free;
end; end;
end; end;

View File

@ -772,15 +772,15 @@ begin
FreeAndNil(FUsedBy[ub]); FreeAndNil(FUsedBy[ub]);
FreeAndNil(FJSModule); FreeAndNil(FJSModule);
FreeAndNil(FConverter); FreeAndNil(FConverter);
FreeAndNil(FParser);
FreeAndNil(FScanner);
FreeAndNil(FFileResolver);
FreeAndNil(FPasResolver);
if FPasModule<>nil then if FPasModule<>nil then
begin begin
FPasModule.Release; FPasModule.Release;
FPasModule:=nil; FPasModule:=nil;
end; end;
FreeAndNil(FParser);
FreeAndNil(FScanner);
FreeAndNil(FFileResolver);
FreeAndNil(FPasResolver);
inherited Destroy; inherited Destroy;
end; end;
@ -840,6 +840,8 @@ var
begin begin
FFileResolver:=aFileResolver; FFileResolver:=aFileResolver;
// scanner // scanner
if FScanner<>nil then
RaiseInternalError(20180707193258,PasFilename);
FScanner := TPascalScanner.Create(FileResolver); FScanner := TPascalScanner.Create(FileResolver);
Scanner.LogEvents:=PascalResolver.ScannerLogEvents; Scanner.LogEvents:=PascalResolver.ScannerLogEvents;
Scanner.OnLog:=@OnScannerLog; Scanner.OnLog:=@OnScannerLog;

View File

@ -66,7 +66,7 @@ type
private private
FChangeStamp: TChangeStamp; FChangeStamp: TChangeStamp;
FPath: string; FPath: string;
FEntries: TFPList; // if Sorted=true FEntries: TFPList; // list of TPas2jsCachedDirectoryEntry
FPool: TPas2jsCachedDirectories; FPool: TPas2jsCachedDirectories;
FRefCount: integer; FRefCount: integer;
FSorted: boolean; FSorted: boolean;
@ -581,6 +581,7 @@ end;
destructor TPas2jsCachedDirectory.Destroy; destructor TPas2jsCachedDirectory.Destroy;
begin begin
Clear;
FreeAndNil(FEntries); FreeAndNil(FEntries);
inherited Destroy; inherited Destroy;
end; end;
@ -886,6 +887,7 @@ end;
destructor TPas2jsCachedDirectories.Destroy; destructor TPas2jsCachedDirectories.Destroy;
begin begin
Clear; Clear;
FreeAndNil(FDirectories);
inherited Destroy; inherited Destroy;
end; end;