Browse Source

* Add event handler for exceptions

Michaël Van Canneyt 1 year ago
parent
commit
44f8c7e352
1 changed files with 29 additions and 1 deletions
  1. 29 1
      packages/job/src/job_browser.pp

+ 29 - 1
packages/job/src/job_browser.pp

@@ -55,6 +55,9 @@ Type
     Property Func : TObjectFactory Read FFunc;
   end;
 
+  TCallbackErrorJSEventHandler = reference to procedure(Sender : TObject; Error : TJSError; Args : TJSFunctionArguments; var ReRaise : Boolean);
+  TCallbackErrorPasEventHandler = reference to procedure(Sender : TObject; Error : Exception; Args : TJSFunctionArguments; var ReRaise : Boolean);
+
   { TJSObjectBridge }
 
   TJSObjectBridge = class(TImportExtension)
@@ -64,6 +67,8 @@ Type
     FGlobalNames: TJSObject; // name to id
     FLocalObjects: TJSArray;
     FFreeLocalIds: TJSArray; // free positions in FLocalObjects
+    FOnCallBackJSError: TCallbackErrorJSEventHandler;
+    FOnCallBackPasError: TCallbackErrorPasEventHandler;
     FStringResult: string;
     FFactories : TJSObject;
 
@@ -99,6 +104,8 @@ Type
     Procedure RegisterJSObjectFactory(const aName : string; aFunc : TJSObjectFactory); overload;
     Function GetJOBResult(v: jsvalue): TJOBResult;
     property CallbackHandler: TJOBCallback read FCallbackHandler write FCallbackHandler;
+    property OnCallBackJSError : TCallbackErrorJSEventHandler read FOnCallBackJSError Write FOnCallBackJSError;
+    property OnCallBackPasError : TCallbackErrorPasEventHandler read FOnCallBackPasError Write FOnCallBackPasError;
   end;
 
 Implementation
@@ -664,6 +671,7 @@ var
   var
     aCall, aData, aCode: TWasmNativeInt;
     Obj : TJSObject absolute Result;
+    ReRaise : Boolean;
 
     function MethodCallBack: jsvalue;
       var
@@ -678,7 +686,27 @@ var
           {$IFDEF VerboseJOBCallback}
           writeln('TJSObjectBridge Callback: calling Wasm with');
           {$ENDIF}
-          ResultP:=CallbackHandler(aCall,aData,aCode,Args); // this frees Args, and may detach View
+          try
+            ResultP:=CallbackHandler(aCall,aData,aCode,Args); // this frees Args, and may detach View
+          except
+            on JE : TJSError do
+              begin
+              ReRaise:=True;
+              if Assigned(OnCallBackJSError) then
+                OnCallBackJSError(Self,JE,JSArguments,ReRaise);
+              if ReRaise then
+                Raise;
+              end;
+            on E : Exception do
+              begin
+              ReRaise:=True;
+              if Assigned(OnCallBackPasError) then
+                OnCallBackPasError(Self,E,JSArguments,ReRaise);
+              if ReRaise then
+                Raise;
+              end;
+          end;
+
           View:=getModuleMemoryDataView();
           {$IFDEF VerboseJOBCallback}
           writeln('TJSObjectBridge Callback: called Wasm Call=',aCall,' Data=',aData,' Code=',aCode,' ResultP=',ResultP,' getting Result...');