mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-17 15:49:33 +02:00
pastojs: always write catch($e), needed by nodejs
git-svn-id: trunk@35903 -
This commit is contained in:
parent
ef850a1238
commit
92af835850
@ -245,7 +245,6 @@ Works:
|
||||
- use 0o for octal literals
|
||||
|
||||
ToDos:
|
||||
- if jsvalue then
|
||||
- constant evaluation
|
||||
- integer ranges
|
||||
- static arrays
|
||||
@ -1089,13 +1088,6 @@ type
|
||||
end;
|
||||
PForLoopFindData = ^TForLoopFindData;
|
||||
procedure ForLoop_OnProcBodyElement(El: TPasElement; arg: pointer);
|
||||
private
|
||||
type
|
||||
TTryExceptFindData = record
|
||||
HasRaiseWithoutObject: boolean;
|
||||
end;
|
||||
PTryExceptFindData = ^TTryExceptFindData;
|
||||
procedure TryExcept_OnElement(El: TPasElement; arg: pointer);
|
||||
private
|
||||
FBuiltInNames: array[TPas2JSBuiltInName] of string;
|
||||
FOnIsElementUsed: TPas2JSIsElementUsedEvent;
|
||||
@ -7997,14 +7989,6 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TPasToJSConverter.TryExcept_OnElement(El: TPasElement; arg: pointer);
|
||||
var
|
||||
Data: PTryExceptFindData absolute arg;
|
||||
begin
|
||||
if (El is TPasImplRaise) and (TPasImplRaise(El).ExceptObject=nil) then
|
||||
Data^.HasRaiseWithoutObject:=true;
|
||||
end;
|
||||
|
||||
procedure TPasToJSConverter.SetUseEnumNumbers(const AValue: boolean);
|
||||
begin
|
||||
if AValue then
|
||||
@ -8257,20 +8241,6 @@ end;
|
||||
|
||||
function TPasToJSConverter.ConvertTryStatement(El: TPasImplTry;
|
||||
AContext: TConvertContext): TJSElement;
|
||||
|
||||
function NeedExceptObject: boolean;
|
||||
var
|
||||
Data: TTryExceptFindData;
|
||||
begin
|
||||
Result:=false;
|
||||
if El.FinallyExcept.Elements.Count=0 then exit;
|
||||
if TPasElement(El.FinallyExcept.Elements[0]) is TPasImplExceptOn then
|
||||
exit(true);
|
||||
Data:=Default(TTryExceptFindData);
|
||||
El.FinallyExcept.ForEachCall(@TryExcept_OnElement,@Data);
|
||||
Result:=Data.HasRaiseWithoutObject;
|
||||
end;
|
||||
|
||||
Var
|
||||
T : TJSTryStatement;
|
||||
ExceptBlock: TPasImplTryHandler;
|
||||
@ -8292,9 +8262,8 @@ begin
|
||||
begin
|
||||
T:=TJSTryCatchStatement(CreateElement(TJSTryCatchStatement,El));
|
||||
T.Block:=ConvertImplBlockElements(El,AContext,true);
|
||||
if NeedExceptObject then
|
||||
// always set the catch except object, needed by nodejs
|
||||
T.Ident:=TJSString(FBuiltInNames[pbivnExceptObject]);
|
||||
//T.BCatch:=ConvertElement(El.FinallyExcept,AContext);
|
||||
ExceptBlock:=El.FinallyExcept;
|
||||
if (ExceptBlock.Elements.Count>0)
|
||||
and (TPasImplElement(ExceptBlock.Elements[0]) is TPasImplExceptOn) then
|
||||
|
@ -604,6 +604,7 @@ Var
|
||||
F : TPasImplTryExcept;
|
||||
El : TJSTryCatchStatement;
|
||||
L : TJSStatementList;
|
||||
ExceptObjName: String;
|
||||
|
||||
begin
|
||||
// Try a:=b except b:=c end;
|
||||
@ -611,7 +612,7 @@ begin
|
||||
Becomes:
|
||||
try {
|
||||
a=b;
|
||||
} catch {
|
||||
} catch ($e) {
|
||||
b = c;
|
||||
}
|
||||
*)
|
||||
@ -621,7 +622,9 @@ begin
|
||||
F.AddElement(CreateAssignStatement('b','c'));
|
||||
// Convert
|
||||
El:=TJSTryCatchStatement(Convert(T,TJSTryCatchStatement));
|
||||
AssertEquals('No exception object name','',String(El.Ident));
|
||||
// check "catch(exceptobject)"
|
||||
ExceptObjName:=lowercase(Pas2JSBuiltInNames[pbivnExceptObject]);
|
||||
AssertEquals('Correct exception object name',ExceptObjName,String(El.Ident));
|
||||
// check "a=b;"
|
||||
L:=AssertListStatement('try..except block is statement list',El.Block);
|
||||
AssertAssignStatement('Correct assignment in try..except block',L.A,'a','b');
|
||||
|
@ -2097,6 +2097,8 @@ begin
|
||||
Add(' exit(''abc'');');
|
||||
Add('end;');
|
||||
Add('begin');
|
||||
Add(' exit;');
|
||||
Add(' exit(1);');
|
||||
ConvertProgram;
|
||||
CheckSource('TestExit',
|
||||
LinesToStr([ // statements
|
||||
@ -4382,7 +4384,7 @@ begin
|
||||
LinesToStr([ // $mod.$main
|
||||
'try {',
|
||||
' $mod.vI = 1;',
|
||||
'} catch {',
|
||||
'} catch ($e) {',
|
||||
' $mod.vI = 2;',
|
||||
'};',
|
||||
'try {',
|
||||
|
Loading…
Reference in New Issue
Block a user