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

This commit is contained in:
Nikolay Nikolov 2024-06-27 05:01:18 +03:00
parent 55e55cf247
commit 73462ff8fe

View File

@ -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