mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-02 17:10:34 +02:00
pastojs: fixed mem leaks
git-svn-id: trunk@39412 -
This commit is contained in:
parent
733f220042
commit
6bf3fd6475
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user