Browse Source

demo: wasidom: invoke no result

mattias 3 years ago
parent
commit
c71dc54e5b

+ 87 - 1
demo/wasienv/dom/BrowserDomTest1.lpr

@@ -4,10 +4,24 @@ program BrowserDomTest1;
 
 uses
   BrowserConsole, BrowserApp, JS, Classes, SysUtils, Web, WebAssembly, Types,
-  wasienv, wadom_browser;
+  wasienv, wadom_browser, wadom_shared;
 
 Type
 
+  { TBird }
+
+  TBird = class
+  public
+    Name: string;
+    constructor Create(const aName: string); reintroduce;
+    procedure Proc;
+    function GetBoolean: boolean;
+    function GetDouble: double;
+    function GetString: string;
+    function CreateChick(const aName: string): TBird;
+    function ArgsToStr(Args: TJSFunctionArguments): string;
+  end;
+
   { TMyApplication }
 
   TMyApplication = class(TBrowserApplication)
@@ -27,6 +41,73 @@ Type
     procedure DoRun; override;
   end;
 
+{ TBird }
+
+constructor TBird.Create(const aName: string);
+begin
+  Name:=aName;
+
+  if false then begin
+    // use, so pas2js includes them
+    Proc;
+    GetBoolean;
+    GetDouble;
+    GetString;
+    CreateChick('');
+  end;
+end;
+
+procedure TBird.Proc;
+begin
+  writeln('TBird.Proc [',Name,'] ',ArgsToStr(JSArguments));
+end;
+
+function TBird.GetBoolean: boolean;
+begin
+  writeln('TBird.GetBoolean [',Name,'] ',ArgsToStr(JSArguments));
+  Result:=JSArguments.Length mod 1 = 0;
+end;
+
+function TBird.GetDouble: double;
+begin
+  writeln('TBird.GetDouble [',Name,'] ',ArgsToStr(JSArguments));
+  Result:=0.3+JSArguments.Length;
+end;
+
+function TBird.GetString: string;
+begin
+  writeln('TBird.GetString [',Name,'] ',ArgsToStr(JSArguments));
+  Result:='TBird.GetString:'+str(JSArguments.Length);
+  if JSArguments.Length>0 then
+    Result:=Result+String(JSArguments[0]);
+end;
+
+function TBird.CreateChick(const aName: string): TBird;
+begin
+  writeln('TBird.CreateChick [',Name,'] ',ArgsToStr(JSArguments));
+  Result:=TBird.Create(Name+'.'+aName);
+end;
+
+function TBird.ArgsToStr(Args: TJSFunctionArguments): string;
+var
+  i: Integer;
+  t: String;
+  a: JSValue;
+begin
+  Result:='[';
+  for i:=0 to Args.Length-1 do
+  begin
+    if i>0 then Result:=Result+',';
+    a:=Args[i];
+    t:=jstypeof(a);
+    if t='string' then
+      Result:=Result+'"'+String(a)+'"'
+    else
+      Result:=Result+String(a);
+  end;
+  Result:=Result+']';
+end;
+
 function TMyApplication.InitEnv(aValue: JSValue): JSValue;
 Var
   Module : TJSInstantiateResult absolute aValue;
@@ -39,6 +120,8 @@ begin
   Exps.Start;
 end;
 
+{ TMyApplication }
+
 procedure TMyApplication.DoWrite(Sender: TObject; const aOutput: String);
 begin
   Writeln(aOutput);
@@ -51,6 +134,9 @@ begin
   FWasiEnv.OnStdErrorWrite:=@DoWrite;
   FWasiEnv.OnStdOutputWrite:=@DoWrite;
   FWADomBridge:=TWADomBridge.Create(FWasiEnv);
+
+  if FWADomBridge.RegisterGlobalObject(TJSObject(TBird.Create('Root')))<>WasiObjIdBird then
+    raise Exception.Create('Root TBird wrong number');
 end;
 
 function TMyApplication.CreateWebAssembly(Path: string; ImportObject: TJSObject): TJSPromise;

+ 9 - 6
demo/wasienv/dom/WasiDomTest1.lpr

@@ -5,18 +5,21 @@ program WasiDomTest1;
 {$codepage UTF8}
 
 uses
-  SysUtils, wadom_wasm;
+  SysUtils, wadom_wasm, wadom_shared;
 
 var
   obj: TJSObject;
   d: Double;
   u: UnicodeString;
 begin
-  obj:=TJSObject.CreateFromID(-1);
-  d:=obj.InvokeJSDoubleResult('fly',[]);
-  writeln('AAA1 ',d);
+  obj:=TJSObject.CreateFromID(WasiObjIdBird);
+  writeln('AAA1 ');
+  obj.InvokeJSNoResult('Proc',[]);
+  writeln('AAA2 ');
+  exit;
+
   u:='äbc';
-  d:=obj.InvokeJSDoubleResult('fly',[u,12345678901]);
-  writeln('AAA2 ',d);
+  d:=obj.InvokeJSDoubleResult('GetDouble',[u,12345678901]);
+  writeln('AAA3 ',d);
 end.
 

+ 8 - 2
demo/wasienv/dom/wadom_browser.pp

@@ -19,7 +19,7 @@ Type
   Protected
     function FindObject(ObjId: TWasiDomObjectID): TJSObject; virtual;
     function Invoke_JSResult(ObjId: TWasiDomObjectID; FuncNameP, FuncNameLen, ArgsP: NativeInt; out JSResult: JSValue): TWasiDomResult; virtual;
-    function Invoke_NoResult(ObjId: TWasiDomObjectID; FuncNameP, FuncNameLen, ArgsP: NativeInt): TWasiDomResult; virtual;
+    function Invoke_NoResult(ObjId: TWasiDomObjectID; FuncNameP, FuncNameLen, ArgsP, Dummy: NativeInt): TWasiDomResult; virtual;
     function Invoke_BooleanResult(ObjId: TWasiDomObjectID; FuncNameP, FuncNameLen, ArgsP, ResultP: NativeInt): TWasiDomResult; virtual;
     function Invoke_DoubleResult(ObjId: TWasiDomObjectID; FuncNameP, FuncNameLen, ArgsP, ResultP: NativeInt): TWasiDomResult; virtual;
     function Invoke_ObjectResult(ObjId: TWasiDomObjectID; FuncNameP, FuncNameLen, ArgsP, ResultP: NativeInt): TWasiDomResult; virtual;
@@ -29,6 +29,7 @@ Type
     Constructor Create(aEnv: TPas2JSWASIEnvironment); override;
     Procedure FillImportObject(aObject: TJSObject); override;
     Function ImportName: String; override;
+    Function RegisterGlobalObject(Obj: TJSObject): TWasiDomObjectID; virtual;
   end;
 
 Implementation
@@ -55,6 +56,11 @@ begin
   Result:=WasiDomExportName;
 end;
 
+function TWADomBridge.RegisterGlobalObject(Obj: TJSObject): TWasiDomObjectID;
+begin
+  Result:=-(FGlobalObjects.push(Obj)-1);
+end;
+
 procedure TWADomBridge.FillImportObject(aObject: TJSObject);
 begin
   aObject[WasiDomInvokeNoResult]:=@Invoke_NoResult;
@@ -110,7 +116,7 @@ begin
 end;
 
 function TWADomBridge.Invoke_NoResult(ObjId: TWasiDomObjectID; FuncNameP,
-  FuncNameLen, ArgsP: NativeInt): TWasiDomResult;
+  FuncNameLen, ArgsP, Dummy: NativeInt): TWasiDomResult;
 var
   JSResult: JSValue;
 begin

+ 2 - 0
demo/wasienv/dom/wadom_shared.pp

@@ -67,6 +67,8 @@ const
   WasiObjIdConsole = -3;
   WasiObjIdCaches = -4;
 
+  WasiObjIdBird = -5;
+
 implementation
 
 end.

+ 6 - 5
demo/wasienv/dom/wadom_wasm.pas

@@ -69,8 +69,9 @@ function __wasidom_invoke_noresult(
   ObjID: TWasiDomObjectID;
   FuncNameP: PChar;
   FuncNameLen: longint;
-  ArgP: PByte
-): TWasiDomResult; external WasiDomExportName name WasiDomInvokeBooleanResult;
+  ArgP: PByte;
+  Dummy: PByte
+): TWasiDomResult; external WasiDomExportName name WasiDomInvokeNoResult;
 
 function __wasidom_invoke_boolresult(
   ObjID: TWasiDomObjectID;
@@ -432,18 +433,18 @@ var
   InvokeArgs: PByte;
 begin
   if length(Args)=0 then
-    aError:=__wasidom_invoke_noresult(ObjectID,PChar(aName),length(aName),nil)
+    aError:=__wasidom_invoke_noresult(ObjectID,PChar(aName),length(aName),nil,nil)
   else begin
     InvokeArgs:=CreateInvokeJSArgs(Args);
     try
-      aError:=__wasidom_invoke_noresult(ObjectID,PChar(aName),length(aName),InvokeArgs);
+      aError:=__wasidom_invoke_noresult(ObjectID,PChar(aName),length(aName),InvokeArgs,nil);
     finally
       if InvokeArgs<>nil then
         FreeMem(InvokeArgs);
     end;
   end;
   if aError<>WasiDomResult_Success then
-    WasiInvokeRaiseResultMismatch(aName,WasiDomResult_Boolean,aError);
+    WasiInvokeRaiseResultMismatch(aName,WasiDomResult_Success,aError);
 end;
 
 function TJSObject.InvokeJSBooleanResult(const aName: string;