fcl-passrc, pastojs: fixed crash on evaluating ord(int), #39260

This commit is contained in:
mattias 2023-07-12 10:22:02 +02:00 committed by Pierre Muller
parent 29adfc18ff
commit 7ec6d9e3c1
5 changed files with 13 additions and 11 deletions

View File

@ -19450,6 +19450,7 @@ begin
try try
Evaluated:=fExprEvaluator.OrdValue(Value,Params); Evaluated:=fExprEvaluator.OrdValue(Value,Params);
finally finally
if Evaluated<>Value then
ReleaseEvalValue(Value); ReleaseEvalValue(Value);
end; end;
if Proc=nil then ; if Proc=nil then ;

View File

@ -198,6 +198,7 @@ begin
Inc(FErrorCount); Inc(FErrorCount);
if aContext.Error is EParserError then if aContext.Error is EParserError then
FLastErrorNumber:=EParserError(aContext.Error).ErrNo; FLastErrorNumber:=EParserError(aContext.Error).ErrNo;
if Allow then ;
end; end;
procedure TTestParser.SetupParser; procedure TTestParser.SetupParser;

View File

@ -637,8 +637,6 @@ begin
end; end;
procedure TTestConstParser.TestConstErrorRecovery; procedure TTestConstParser.TestConstErrorRecovery;
Var
D : String;
begin begin
Add('Const'); Add('Const');
Add(' A : 1;'); Add(' A : 1;');

View File

@ -13640,17 +13640,17 @@ function TPasToJSConverter.ConvertBuiltIn_Ord(El: TParamsExpr;
Result:=nil; Result:=nil;
OrdValue:=nil; OrdValue:=nil;
ParamValue:=aResolver.Eval(Param,[]); ParamValue:=aResolver.Eval(Param,[]);
if ParamValue=nil then exit;
try try
if ParamValue<>nil then
begin
OrdValue:=aResolver.ExprEvaluator.OrdValue(ParamValue,El); OrdValue:=aResolver.ExprEvaluator.OrdValue(ParamValue,El);
if OrdValue=ParamValue then
ParamValue:=nil;
if OrdValue<>nil then if OrdValue<>nil then
begin begin
// ord(constant) -> constant // ord(constant) -> constant
Result:=ConvertConstValue(OrdValue,AContext,El); Result:=ConvertConstValue(OrdValue,AContext,El);
exit; exit;
end; end;
end;
finally finally
ReleaseEvalValue(ParamValue); ReleaseEvalValue(ParamValue);
ReleaseEvalValue(OrdValue); ReleaseEvalValue(OrdValue);

View File

@ -7191,6 +7191,7 @@ begin
' Enum: byte;', ' Enum: byte;',
' Enums: tenums;', ' Enums: tenums;',
'begin', 'begin',
' Enum:=ord(1);',
' Enums:=[];', ' Enums:=[];',
' Enums:=[0];', ' Enums:=[0];',
' Enums:=[1..2];', ' Enums:=[1..2];',
@ -7206,6 +7207,7 @@ begin
'this.Enums = {};', 'this.Enums = {};',
'']), '']),
LinesToStr([ LinesToStr([
'$mod.Enum = 1;',
'$mod.Enums = {};', '$mod.Enums = {};',
'$mod.Enums = rtl.createSet(0);', '$mod.Enums = rtl.createSet(0);',
'$mod.Enums = rtl.createSet(null, 1, 2);', '$mod.Enums = rtl.createSet(null, 1, 2);',