* After run parameter

This commit is contained in:
Michaël Van Canneyt 2022-05-19 08:07:09 +02:00
parent a3a1ba5d28
commit 85ab0dc64d

View File

@ -16,10 +16,17 @@ Type
end;
{ TWASIHostApplication }
TStartCallBack = Reference to Function (Sender : TObject; aDescriptor : TStartDescriptor) : Boolean;
TBeforeStartCallBack = Reference to Function (Sender : TObject; aDescriptor : TStartDescriptor) : Boolean;
TAfterStartCallBack = Reference to Procedure (Sender : TObject; aDescriptor : TStartDescriptor);
TBeforeStartEvent = Procedure (Sender : TObject; aDescriptor : TStartDescriptor; var aAllowRun : Boolean) of object;
TAfterStartEvent = Procedure (Sender : TObject; aDescriptor : TStartDescriptor) of object;
TWASIHostApplication = class(TBrowserApplication)
private
FAfterStart: TAfterStartEvent;
FBeforeStart: TBeforeStartEvent;
FEnv: TPas2JSWASIEnvironment;
FExported: TWASIExports;
FMemoryDescriptor : TJSWebAssemblyMemoryDescriptor;
@ -36,8 +43,9 @@ Type
Constructor Create(aOwner : TComponent); override;
Destructor Destroy; override;
// Load and start webassembly. If DoRun is true, then Webassembly entry point is called.
// If aCallback is specified, then it is called prior to calling run.
Procedure StartWebAssembly(aPath: string; DoRun : Boolean = True; aCallBack : TStartCallback = Nil);
// If aBeforeStart is specified, then it is called prior to calling run, and can disable running.
// If aAfterStart is specified, then it is called after calling run. It is not called is running was disabled.
Procedure StartWebAssembly(aPath: string; DoRun : Boolean = True; aBeforeStart : TBeforeStartCallback = Nil; aAfterStart : TAfterStartCallback = Nil);
// Initial memory descriptor
Property MemoryDescriptor : TJSWebAssemblyMemoryDescriptor Read FMemoryDescriptor Write FMemoryDescriptor;
// Import/export table descriptor
@ -47,6 +55,10 @@ Type
// Exported functions. Also available in start descriptor.
Property Exported : TWASIExports Read FExported;
Property RunEntryFunction : String Read FRunEntryFunction Write FRunEntryFunction;
// Called after webassembly start was run. Not called if webassembly was not run.
Property AfterStart : TAfterStartEvent Read FAfterStart Write FAfterStart;
// Called before running webassembly. If aAllowRun is false, running is disabled
Property BeforeStart : TBeforeStartEvent Read FBeforeStart Write FBeforeStart;
end;
implementation
@ -91,7 +103,8 @@ begin
end;
procedure TWASIHostApplication.StartWebAssembly(aPath: string; DoRun : Boolean = True; ACallBack: TStartCallback = Nil);
procedure TWASIHostApplication.StartWebAssembly(aPath: string; DoRun: Boolean;
aBeforeStart: TBeforeStartCallback = nil; aAfterStart: TAfterStartCallback = nil);
Var
ImportObj : TJSObject;
@ -109,13 +122,21 @@ Var
// These 2 prevent running different instances simultaneously.
FExported:=Res.Exported;
WasiEnvironment.Instance:=Module.Instance;
if Assigned(aCallBack) then
DoRun:=aCallBack(Self,Res) and DoRun;
if Assigned(aBeforeStart) then
DoRun:=aBeforeStart(Self,Res) and DoRun;
if Assigned(FBeforeStart) then
FBeforeStart(Self,Res,DoRun);
if DoRun then
begin
if FRunEntryFunction='' then
Res.Exported.Start
else
TProcedure(Res.Exported[RunEntryFunction])();
if Assigned(aAfterStart) then
aAfterStart(Self,Res);
if Assigned(FAfterStart) then
FAfterStart(Self,Res)
end;
end;