mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-09 15:29:16 +02:00
* WebAssembly: optimized the number of nested blocks inside the invoke helper
This commit is contained in:
parent
7b67378206
commit
f3ded5e82e
@ -6143,11 +6143,35 @@ implementation
|
||||
var
|
||||
exesym: TExeSymbol;
|
||||
objsym: TObjSymbol;
|
||||
i: Integer;
|
||||
i, j, TypIdx: Integer;
|
||||
IndirectFunctionTableMap: array of Integer;
|
||||
InvokableTypeIndices: array of Integer;
|
||||
begin
|
||||
exesym:=TExeSymbol(ExeSymbolList.Find('fpc_wasm_invoke_helper'));
|
||||
if not Assigned(exesym) then
|
||||
exit;
|
||||
|
||||
SetLength(IndirectFunctionTableMap, Length(FIndirectFunctionTable));
|
||||
SetLength(InvokableTypeIndices, 1);
|
||||
InvokableTypeIndices[0] := -1;
|
||||
for i:=1 to Length(FIndirectFunctionTable)-1 do
|
||||
begin
|
||||
IndirectFunctionTableMap[i]:=0;
|
||||
TypIdx := FuncIdx2TypeIdx(FIndirectFunctionTable[i].FuncIdx);
|
||||
for j := 1 to Length(InvokableTypeIndices)-1 do
|
||||
if InvokableTypeIndices[j]=TypIdx then
|
||||
begin
|
||||
IndirectFunctionTableMap[i]:=j;
|
||||
break;
|
||||
end;
|
||||
if IndirectFunctionTableMap[i]=0 then
|
||||
begin
|
||||
SetLength(InvokableTypeIndices,Length(InvokableTypeIndices)+1);
|
||||
InvokableTypeIndices[High(InvokableTypeIndices)]:=TypIdx;
|
||||
IndirectFunctionTableMap[i]:=High(InvokableTypeIndices);
|
||||
end;
|
||||
end;
|
||||
|
||||
objsym:=exesym.ObjSymbol;
|
||||
Sec:=objsym.objsection;
|
||||
Sec.Size:=0;
|
||||
@ -6156,7 +6180,7 @@ implementation
|
||||
{ locals }
|
||||
Sec.writeUInt8($00);
|
||||
|
||||
for i:=1 to Length(FIndirectFunctionTable)-1 do
|
||||
for i:=1 to Length(InvokableTypeIndices)-1 do
|
||||
{ block }
|
||||
Sec.writeUInt16BE($0240);
|
||||
|
||||
@ -6168,18 +6192,18 @@ implementation
|
||||
Sec.writeUInt8($0E);
|
||||
WriteUleb(Sec,Length(FIndirectFunctionTable));
|
||||
for i:=0 to Length(FIndirectFunctionTable)-1 do
|
||||
WriteUleb(Sec,i);
|
||||
WriteUleb(Sec,IndirectFunctionTableMap[i]);
|
||||
Sec.writeUInt8($00);
|
||||
{ end }
|
||||
Sec.writeUInt8($0B);
|
||||
{ unreachable }
|
||||
Sec.writeUInt8($00);
|
||||
|
||||
for i:=1 to Length(FIndirectFunctionTable)-1 do
|
||||
for i:=1 to Length(InvokableTypeIndices)-1 do
|
||||
begin
|
||||
{ end }
|
||||
Sec.writeUInt8($0B);
|
||||
InvokeFuncType(FuncIdx2TypeIdx(FIndirectFunctionTable[i].FuncIdx));
|
||||
InvokeFuncType(InvokableTypeIndices[i]);
|
||||
end;
|
||||
|
||||
{ end }
|
||||
|
Loading…
Reference in New Issue
Block a user