Browse Source

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

git-svn-id: trunk@35903 -
Mattias Gaertner 8 years ago
parent
commit
92af835850

+ 2 - 33
packages/pastojs/src/fppas2js.pp

@@ -245,7 +245,6 @@ Works:
   - use 0o for octal literals
   - use 0o for octal literals
 
 
 ToDos:
 ToDos:
-- if jsvalue then
 - constant evaluation
 - constant evaluation
 - integer ranges
 - integer ranges
 - static arrays
 - static arrays
@@ -1089,13 +1088,6 @@ type
       end;
       end;
       PForLoopFindData = ^TForLoopFindData;
       PForLoopFindData = ^TForLoopFindData;
     procedure ForLoop_OnProcBodyElement(El: TPasElement; arg: pointer);
     procedure ForLoop_OnProcBodyElement(El: TPasElement; arg: pointer);
-  private
-    type
-      TTryExceptFindData = record
-        HasRaiseWithoutObject: boolean;
-      end;
-      PTryExceptFindData = ^TTryExceptFindData;
-    procedure TryExcept_OnElement(El: TPasElement; arg: pointer);
   private
   private
     FBuiltInNames: array[TPas2JSBuiltInName] of string;
     FBuiltInNames: array[TPas2JSBuiltInName] of string;
     FOnIsElementUsed: TPas2JSIsElementUsedEvent;
     FOnIsElementUsed: TPas2JSIsElementUsedEvent;
@@ -7997,14 +7989,6 @@ begin
     end;
     end;
 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);
 procedure TPasToJSConverter.SetUseEnumNumbers(const AValue: boolean);
 begin
 begin
   if AValue then
   if AValue then
@@ -8257,20 +8241,6 @@ end;
 
 
 function TPasToJSConverter.ConvertTryStatement(El: TPasImplTry;
 function TPasToJSConverter.ConvertTryStatement(El: TPasImplTry;
   AContext: TConvertContext): TJSElement;
   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
 Var
   T : TJSTryStatement;
   T : TJSTryStatement;
   ExceptBlock: TPasImplTryHandler;
   ExceptBlock: TPasImplTryHandler;
@@ -8292,9 +8262,8 @@ begin
       begin
       begin
       T:=TJSTryCatchStatement(CreateElement(TJSTryCatchStatement,El));
       T:=TJSTryCatchStatement(CreateElement(TJSTryCatchStatement,El));
       T.Block:=ConvertImplBlockElements(El,AContext,true);
       T.Block:=ConvertImplBlockElements(El,AContext,true);
-      if NeedExceptObject then
-        T.Ident:=TJSString(FBuiltInNames[pbivnExceptObject]);
-      //T.BCatch:=ConvertElement(El.FinallyExcept,AContext);
+      // always set the catch except object, needed by nodejs
+      T.Ident:=TJSString(FBuiltInNames[pbivnExceptObject]);
       ExceptBlock:=El.FinallyExcept;
       ExceptBlock:=El.FinallyExcept;
       if (ExceptBlock.Elements.Count>0)
       if (ExceptBlock.Elements.Count>0)
           and (TPasImplElement(ExceptBlock.Elements[0]) is TPasImplExceptOn) then
           and (TPasImplElement(ExceptBlock.Elements[0]) is TPasImplExceptOn) then

+ 5 - 2
packages/pastojs/tests/tcconverter.pp

@@ -604,6 +604,7 @@ Var
   F : TPasImplTryExcept;
   F : TPasImplTryExcept;
   El : TJSTryCatchStatement;
   El : TJSTryCatchStatement;
   L : TJSStatementList;
   L : TJSStatementList;
+  ExceptObjName: String;
 
 
 begin
 begin
   // Try a:=b except b:=c end;
   // Try a:=b except b:=c end;
@@ -611,7 +612,7 @@ begin
     Becomes:
     Becomes:
     try {
     try {
      a=b;
      a=b;
-    } catch {
+    } catch ($e) {
       b = c;
       b = c;
     }
     }
   *)
   *)
@@ -621,7 +622,9 @@ begin
   F.AddElement(CreateAssignStatement('b','c'));
   F.AddElement(CreateAssignStatement('b','c'));
   // Convert
   // Convert
   El:=TJSTryCatchStatement(Convert(T,TJSTryCatchStatement));
   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;"
   // check "a=b;"
   L:=AssertListStatement('try..except block is statement list',El.Block);
   L:=AssertListStatement('try..except block is statement list',El.Block);
   AssertAssignStatement('Correct assignment in try..except block',L.A,'a','b');
   AssertAssignStatement('Correct assignment in try..except block',L.A,'a','b');

+ 3 - 1
packages/pastojs/tests/tcmodules.pas

@@ -2097,6 +2097,8 @@ begin
   Add('  exit(''abc'');');
   Add('  exit(''abc'');');
   Add('end;');
   Add('end;');
   Add('begin');
   Add('begin');
+  Add('  exit;');
+  Add('  exit(1);');
   ConvertProgram;
   ConvertProgram;
   CheckSource('TestExit',
   CheckSource('TestExit',
     LinesToStr([ // statements
     LinesToStr([ // statements
@@ -4382,7 +4384,7 @@ begin
     LinesToStr([ // $mod.$main
     LinesToStr([ // $mod.$main
     'try {',
     'try {',
     '  $mod.vI = 1;',
     '  $mod.vI = 1;',
-    '} catch {',
+    '} catch ($e) {',
     '  $mod.vI = 2;',
     '  $mod.vI = 2;',
     '};',
     '};',
     'try {',
     'try {',