pastojs: always write catch($e), needed by nodejs

git-svn-id: trunk@35903 -
This commit is contained in:
Mattias Gaertner 2017-04-22 15:42:54 +00:00
parent ef850a1238
commit 92af835850
3 changed files with 10 additions and 36 deletions

View File

@ -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

View File

@ -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');

View File

@ -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 {',