Browse Source

+ WASM resource writer: write the Data and DataCount sections (with 0 data segments for now)

Nikolay Nikolov 1 year ago
parent
commit
73462ff8fe
1 changed files with 55 additions and 0 deletions
  1. 55 0
      packages/fcl-res/src/wasmwriter.pp

+ 55 - 0
packages/fcl-res/src/wasmwriter.pp

@@ -38,18 +38,53 @@ type
   private
     fExtensions : string;
     fDescription : string;
+    FWasmSections: array [TWasmSectionID] of TMemoryStream;
+    procedure WriteWasmSection(aStream: TStream; wsid: TWasmSectionID);
+    procedure WriteWasmSectionIfNotEmpty(aStream: TStream; wsid: TWasmSectionID);
   protected
     function GetExtensions : string; override;
     function GetDescription : string; override;
     procedure Write(aResources : TResources; aStream : TStream); override;
   public
     constructor Create; override;
+    destructor Destroy; override;
   end;
 
 implementation
 
+procedure WriteUleb(aStream: TStream; v: uint64);
+var
+  b: byte;
+begin
+  repeat
+    b:=byte(v) and 127;
+    v:=v shr 7;
+    if v<>0 then
+      b:=b or 128;
+    aStream.WriteByte(b);
+  until v=0;
+end;
+
 { TWasmResourceWriter }
 
+procedure TWasmResourceWriter.WriteWasmSection(aStream: TStream;
+  wsid: TWasmSectionID);
+var
+  b: byte;
+begin
+  b:=ord(wsid);
+  aStream.WriteByte(b);
+  WriteUleb(aStream,FWasmSections[wsid].size);
+  aStream.CopyFrom(FWasmSections[wsid],0);
+end;
+
+procedure TWasmResourceWriter.WriteWasmSectionIfNotEmpty(aStream: TStream;
+  wsid: TWasmSectionID);
+begin
+  if FWasmSections[wsid].size>0 then
+    WriteWasmSection(aStream,wsid);
+end;
+
 function TWasmResourceWriter.GetExtensions: string;
 begin
   Result:=fExtensions;
@@ -61,15 +96,35 @@ begin
 end;
 
 procedure TWasmResourceWriter.Write(aResources: TResources; aStream: TStream);
+const
+  DataSegmentCount = 0;
 begin
+  WriteUleb(FWasmSections[wsiData],DataSegmentCount);
+  WriteUleb(FWasmSections[wsiDataCount],DataSegmentCount);
+
   aStream.WriteBuffer(WasmModuleMagic,SizeOf(WasmModuleMagic));
   aStream.WriteBuffer(WasmVersion,SizeOf(WasmVersion));
+  WriteWasmSection(aStream,wsiDataCount);
+  WriteWasmSection(aStream,wsiData);
 end;
 
 constructor TWasmResourceWriter.Create;
+var
+  i: TWasmSectionID;
 begin
   fExtensions:='.o .or';
   fDescription:='WebAssembly resource writer';
+  for i in TWasmSectionID do
+    FWasmSections[i] := TMemoryStream.Create;
+end;
+
+destructor TWasmResourceWriter.Destroy;
+var
+  i: TWasmSectionID;
+begin
+  for i in TWasmSectionID do
+    FreeAndNil(FWasmSections[i]);
+  inherited Destroy;
 end;
 
 initialization