mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-07 14:27:59 +02:00
+ WASM resource writer: write the Data and DataCount sections (with 0 data segments for now)
This commit is contained in:
parent
55e55cf247
commit
73462ff8fe
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user