mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-23 00:50:28 +02:00
[PATCH 022/188] update binary reader
From 05f495595b8b0a0c9371473eca44b4dfb47ad302 Mon Sep 17 00:00:00 2001 From: Dmitry Boyarintsev <skalogryz.lists@gmail.com> Date: Fri, 27 Sep 2019 16:43:42 -0400 git-svn-id: branches/wasm@46018 -
This commit is contained in:
parent
b663c9de01
commit
7657055c0c
@ -27,6 +27,24 @@ const
|
||||
WasmId = #0'asm';
|
||||
WasmId_Int = $6D736100;
|
||||
|
||||
type
|
||||
TLimit = record
|
||||
limitType : byte;
|
||||
min : UInt32;
|
||||
max : UInt32;
|
||||
end;
|
||||
TMemoryType = TLimit;
|
||||
|
||||
TTableType = record
|
||||
elemType : Byte; // see "elem_type"
|
||||
limits : TLimit;
|
||||
end;
|
||||
|
||||
TGlobalType = record
|
||||
valtype : Byte; // see "valtype_" consts
|
||||
mut : Byte; // see "global_" consts
|
||||
end;
|
||||
|
||||
const
|
||||
SECT_CUSTOM = 0; // custom section
|
||||
SECT_TYPE = 1; // type section
|
||||
@ -86,12 +104,42 @@ type
|
||||
entries : array of TCodeEntry;
|
||||
end;
|
||||
|
||||
const
|
||||
IMPDESC_FUNC = $00;
|
||||
IMPDESC_TABLE = $01;
|
||||
IMPDESC_MEM = $02;
|
||||
IMPDESC_GLOBAL = $03;
|
||||
|
||||
type
|
||||
TImportEntry = record
|
||||
module : string;
|
||||
name : string;
|
||||
case desc: byte of
|
||||
IMPDESC_FUNC : (
|
||||
fnType : UInt32;
|
||||
);
|
||||
IMPDESC_TABLE: (
|
||||
tblType : TTableType;
|
||||
);
|
||||
IMPDESC_TABLE: (
|
||||
memType : TMemoryType;
|
||||
);
|
||||
IMPDESC_GLOBAL: (
|
||||
glbType : TGlobalType;
|
||||
);
|
||||
end;
|
||||
|
||||
TImportSection = record
|
||||
entries : array of TImportEntry;
|
||||
end;
|
||||
|
||||
const
|
||||
EXPDESC_FUNC = $00;
|
||||
EXPDESC_TABLE = $01;
|
||||
EXPDESC_MEM = $02;
|
||||
EXPDESC_GLOBAL = $03;
|
||||
|
||||
|
||||
type
|
||||
TExportEntry = record
|
||||
name : string;
|
||||
@ -146,12 +194,40 @@ procedure WriteExport(const ex: TExportSection; dst: TStream);
|
||||
function isWasmStream(st: TStream): Boolean;
|
||||
function isWasmFile(const fn: string): Boolean;
|
||||
|
||||
|
||||
procedure ReadElementEntry(st: TStream; var en: TElementEntry);
|
||||
procedure ReadElementSection(st: TStream; var sc: TelementSection);
|
||||
|
||||
procedure ReadLimit(st: TStream; var lm: TLimit);
|
||||
procedure ReadTableType(st: TStream; var tb: TTableType);
|
||||
procedure ReadGlobalType(st: TStream; var gb: TGlobalType);
|
||||
|
||||
function ReadImportEntry(st: TStream; var imp: TImportEntry): Boolean;
|
||||
function ReadImportSection(st: TStream; var imp: TImportSection): Boolean;
|
||||
|
||||
implementation
|
||||
|
||||
procedure ReadLimit(st: TStream; var lm: TLimit);
|
||||
begin
|
||||
lm.limitType := st.ReadByte;
|
||||
lm.min := ReadU(st);
|
||||
if lm.limitType <> limit_min_inf then
|
||||
lm.max := ReadU(st)
|
||||
else
|
||||
lm.max := 0;
|
||||
end;
|
||||
|
||||
procedure ReadTableType(st: TStream; var tb: TTableType);
|
||||
begin
|
||||
tb.elemType := st.ReadByte;
|
||||
ReadLimit(st, tb.limits);
|
||||
end;
|
||||
|
||||
procedure ReadGlobalType(st: TStream; var gb: TGlobalType);
|
||||
begin
|
||||
gb.valtype := st.ReadByte;
|
||||
gb.mut := st.ReadByte;
|
||||
end;
|
||||
|
||||
function ValTypeToStr(id: integer): string;
|
||||
begin
|
||||
case id of
|
||||
@ -342,5 +418,37 @@ begin
|
||||
ReadElementEntry(st, sc.entries[i]);
|
||||
end;
|
||||
|
||||
function ReadImportEntry(st: TStream; var imp: TImportEntry): Boolean;
|
||||
begin
|
||||
Result := true;
|
||||
imp.module := ReadName(st);
|
||||
imp.name := ReadName(st);
|
||||
imp.desc := st.ReadByte;
|
||||
case imp.desc of
|
||||
IMPDESC_FUNC : imp.fnType := ReadU(st);
|
||||
IMPDESC_TABLE: ReadTableType(st, imp.tblType);
|
||||
IMPDESC_MEM: ReadLimit(st, imp.memType);
|
||||
IMPDESC_GLOBAL: ReadGlobalType(st, imp.glbType);
|
||||
else
|
||||
Result := false;
|
||||
end;
|
||||
end;
|
||||
|
||||
function ReadImportSection(st: TStream; var imp: TImportSection): Boolean;
|
||||
var
|
||||
cnt : integer;
|
||||
i : integer;
|
||||
begin
|
||||
cnt := ReadU(st);
|
||||
SetLength(imp.entries, cnt);
|
||||
Result := true;
|
||||
if cnt>0 then
|
||||
for i:=0 to cnt-1 do
|
||||
if not ReadImportEntry(st, imp.entries[i]) then begin
|
||||
Result := false;
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
|
||||
end.
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user