* Add event handler for exceptions

This commit is contained in:
Michaël Van Canneyt 2024-08-06 09:08:42 +02:00
parent ba76fe4b78
commit 44f8c7e352

View File

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