memtesthost.lpr 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. program memtesthost;
  2. {$mode objfpc}
  3. uses
  4. browserconsole, browserapp, JS, Classes, SysUtils, Web, WebAssembly, types, wasienv, wasm.pas2js.memutils;
  5. Type
  6. { TMyApplication }
  7. TMyApplication = class(TBrowserApplication)
  8. Private
  9. FWasiEnv: TPas2JSWASIEnvironment;
  10. FMemUtils : TWasiMemUtils;
  11. FMemory : TJSWebAssemblyMemory; // Memory of webassembly
  12. FTable : TJSWebAssemblyTable; // exported functions.
  13. function CreateWebAssembly(Path: string; ImportObject: TJSObject
  14. ): TJSPromise;
  15. procedure DoWrite(Sender: TObject; const aOutput: String);
  16. procedure HandleMemoryGrow(aPages: Integer);
  17. function initEnv(aValue: JSValue): JSValue;
  18. procedure InitWebAssembly;
  19. Public
  20. Constructor Create(aOwner : TComponent); override;
  21. Destructor Destroy; override;
  22. procedure doRun; override;
  23. end;
  24. function TMyApplication.InitEnv(aValue: JSValue): JSValue;
  25. Var
  26. Module : TJSInstantiateResult absolute aValue;
  27. exps : TWASIExports;
  28. begin
  29. Result:=True;
  30. Exps := TWASIExports(TJSObject(Module.Instance.exports_));
  31. FWasiEnv.Instance:=Module.Instance;
  32. Exps.Start;
  33. end;
  34. procedure TMyApplication.DoWrite(Sender: TObject; const aOutput: String);
  35. begin
  36. Writeln(aOutput);
  37. end;
  38. procedure TMyApplication.HandleMemoryGrow(aPages: Integer);
  39. begin
  40. Writeln('Webassembly host: memory has grown with ',aPages,' pages of 64k');
  41. end;
  42. constructor TMyApplication.Create(aOwner: TComponent);
  43. begin
  44. inherited Create(aOwner);
  45. FWasiEnv:=TPas2JSWASIEnvironment.Create;
  46. FWasiEnv.OnStdErrorWrite:=@DoWrite;
  47. FWasiEnv.OnStdOutputWrite:=@DoWrite;
  48. FMemUtils:=TWasiMemUtils.Create(FWasiEnv);
  49. FMemUtils.OnMemoryGrow:=@HandleMemoryGrow;
  50. end;
  51. function TMyApplication.CreateWebAssembly(Path: string; ImportObject: TJSObject): TJSPromise;
  52. begin
  53. Result:=window.fetch(Path)._then(Function (res : jsValue) : JSValue
  54. begin
  55. Result:=TJSResponse(Res).arrayBuffer._then(Function (res2 : jsValue) : JSValue
  56. begin
  57. Result:=TJSWebAssembly.instantiate(TJSArrayBuffer(res2),ImportObject);
  58. end,Nil)
  59. end,Nil
  60. );
  61. end;
  62. procedure TMyApplication.InitWebAssembly;
  63. Var
  64. mDesc : TJSWebAssemblyMemoryDescriptor;
  65. tDesc: TJSWebAssemblyTableDescriptor;
  66. ImportObj : TJSObject;
  67. begin
  68. // Setup memory
  69. mDesc.initial:=256;
  70. mDesc.maximum:=256;
  71. FMemory:=TJSWebAssemblyMemory.New(mDesc);
  72. // Setup table
  73. tDesc.initial:=0;
  74. tDesc.maximum:=0;
  75. tDesc.element:='anyfunc';
  76. FTable:=TJSWebAssemblyTable.New(tDesc);
  77. // Setup ImportObject
  78. ImportObj:=new([
  79. 'js', new([
  80. 'mem', FMemory,
  81. 'tbl', FTable
  82. ])
  83. ]);
  84. FWasiEnv.AddImports(ImportObj);
  85. CreateWebAssembly('memtest.wasm',ImportObj)._then(@initEnv)
  86. end;
  87. destructor TMyApplication.Destroy;
  88. begin
  89. FreeAndNil(FWasiEnv);
  90. inherited Destroy;
  91. end;
  92. procedure TMyApplication.doRun;
  93. begin
  94. // Your code here
  95. Terminate;
  96. InitWebAssembly;
  97. end;
  98. var
  99. Application : TMyApplication;
  100. begin
  101. Application:=TMyApplication.Create(nil);
  102. Application.Initialize;
  103. Application.Run;
  104. end.