From 440af0f81f55a802d7dcdecc8758a0b637fe02fa Mon Sep 17 00:00:00 2001 From: mattias Date: Wed, 12 Jul 2023 10:22:02 +0200 Subject: [PATCH] fcl-passrc, pastojs: fixed crash on evaluating ord(int), #39260 --- packages/fcl-passrc/src/pasresolver.pp | 3 ++- packages/fcl-passrc/tests/tcbaseparser.pas | 1 + packages/fcl-passrc/tests/tconstparser.pas | 2 -- packages/pastojs/src/fppas2js.pp | 16 ++++++++-------- packages/pastojs/tests/tcmodules.pas | 2 ++ 5 files changed, 13 insertions(+), 11 deletions(-) diff --git a/packages/fcl-passrc/src/pasresolver.pp b/packages/fcl-passrc/src/pasresolver.pp index b0985fa2e8..a6c36c79d6 100644 --- a/packages/fcl-passrc/src/pasresolver.pp +++ b/packages/fcl-passrc/src/pasresolver.pp @@ -19450,7 +19450,8 @@ begin try Evaluated:=fExprEvaluator.OrdValue(Value,Params); finally - ReleaseEvalValue(Value); + if Evaluated<>Value then + ReleaseEvalValue(Value); end; if Proc=nil then ; end; diff --git a/packages/fcl-passrc/tests/tcbaseparser.pas b/packages/fcl-passrc/tests/tcbaseparser.pas index eb28a10760..8dda6ee64f 100644 --- a/packages/fcl-passrc/tests/tcbaseparser.pas +++ b/packages/fcl-passrc/tests/tcbaseparser.pas @@ -198,6 +198,7 @@ begin Inc(FErrorCount); if aContext.Error is EParserError then FLastErrorNumber:=EParserError(aContext.Error).ErrNo; + if Allow then ; end; procedure TTestParser.SetupParser; diff --git a/packages/fcl-passrc/tests/tconstparser.pas b/packages/fcl-passrc/tests/tconstparser.pas index 28b2d73855..5488dd4528 100644 --- a/packages/fcl-passrc/tests/tconstparser.pas +++ b/packages/fcl-passrc/tests/tconstparser.pas @@ -637,8 +637,6 @@ begin end; procedure TTestConstParser.TestConstErrorRecovery; -Var - D : String; begin Add('Const'); Add(' A : 1;'); diff --git a/packages/pastojs/src/fppas2js.pp b/packages/pastojs/src/fppas2js.pp index 832b201fea..13d9163e78 100644 --- a/packages/pastojs/src/fppas2js.pp +++ b/packages/pastojs/src/fppas2js.pp @@ -13640,16 +13640,16 @@ function TPasToJSConverter.ConvertBuiltIn_Ord(El: TParamsExpr; Result:=nil; OrdValue:=nil; ParamValue:=aResolver.Eval(Param,[]); + if ParamValue=nil then exit; try - if ParamValue<>nil then + OrdValue:=aResolver.ExprEvaluator.OrdValue(ParamValue,El); + if OrdValue=ParamValue then + ParamValue:=nil; + if OrdValue<>nil then begin - OrdValue:=aResolver.ExprEvaluator.OrdValue(ParamValue,El); - if OrdValue<>nil then - begin - // ord(constant) -> constant - Result:=ConvertConstValue(OrdValue,AContext,El); - exit; - end; + // ord(constant) -> constant + Result:=ConvertConstValue(OrdValue,AContext,El); + exit; end; finally ReleaseEvalValue(ParamValue); diff --git a/packages/pastojs/tests/tcmodules.pas b/packages/pastojs/tests/tcmodules.pas index ff050ecf5d..853e7fc80e 100644 --- a/packages/pastojs/tests/tcmodules.pas +++ b/packages/pastojs/tests/tcmodules.pas @@ -7191,6 +7191,7 @@ begin ' Enum: byte;', ' Enums: tenums;', 'begin', + ' Enum:=ord(1);', ' Enums:=[];', ' Enums:=[0];', ' Enums:=[1..2];', @@ -7206,6 +7207,7 @@ begin 'this.Enums = {};', '']), LinesToStr([ + '$mod.Enum = 1;', '$mod.Enums = {};', '$mod.Enums = rtl.createSet(0);', '$mod.Enums = rtl.createSet(null, 1, 2);',