mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-19 00:09:26 +02:00
* fixed the label resolution for asmlists with WebAssembly native exceptions
This commit is contained in:
parent
da37fabc42
commit
545978b290
@ -802,6 +802,38 @@ implementation
|
|||||||
proc_body.insertList(asmlist);
|
proc_body.insertList(asmlist);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure resolve_labels_of_asmlist_with_try_blocks_recursive(asmlist: TAsmList);
|
||||||
|
var
|
||||||
|
hp: tai;
|
||||||
|
i: Integer;
|
||||||
|
begin
|
||||||
|
if not assigned(asmlist) then
|
||||||
|
exit;
|
||||||
|
hp:=tai(asmlist.First);
|
||||||
|
while assigned(hp) do
|
||||||
|
begin
|
||||||
|
if hp.typ=ait_wasm_structured_instruction then
|
||||||
|
begin
|
||||||
|
if not (hp is tai_wasmstruc_try) then
|
||||||
|
internalerror(2023102201);
|
||||||
|
resolve_labels_of_asmlist_with_try_blocks_recursive(tai_wasmstruc_try(hp).try_asmlist);
|
||||||
|
if hp is tai_wasmstruc_try_catch then
|
||||||
|
with tai_wasmstruc_try_catch(hp) do
|
||||||
|
begin
|
||||||
|
for i:=low(catch_list) to high(catch_list) do
|
||||||
|
resolve_labels_of_asmlist_with_try_blocks_recursive(catch_list[i].asmlist);
|
||||||
|
resolve_labels_of_asmlist_with_try_blocks_recursive(catch_all_asmlist);
|
||||||
|
end
|
||||||
|
else if hp is tai_wasmstruc_try_delegate then
|
||||||
|
{nothing}
|
||||||
|
else
|
||||||
|
internalerror(2023102202);
|
||||||
|
end;
|
||||||
|
hp:=tai(hp.next);
|
||||||
|
end;
|
||||||
|
resolve_labels_via_state_machine(asmlist);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure resolve_labels_complex(var asmlist: TAsmList);
|
procedure resolve_labels_complex(var asmlist: TAsmList);
|
||||||
var
|
var
|
||||||
l2, entry_code, proc_body, exit_code: TAsmList;
|
l2, entry_code, proc_body, exit_code: TAsmList;
|
||||||
@ -826,7 +858,19 @@ implementation
|
|||||||
asmlist:=l2;
|
asmlist:=l2;
|
||||||
|
|
||||||
map_structured_asmlist(asmlist,@StripBlockInstructions);
|
map_structured_asmlist(asmlist,@StripBlockInstructions);
|
||||||
resolve_labels_via_state_machine(asmlist);
|
|
||||||
|
l2:=TAsmList.Create;
|
||||||
|
wasm_convert_to_structured_asmlist(asmlist,l2);
|
||||||
|
asmlist.Free;
|
||||||
|
asmlist:=l2;
|
||||||
|
|
||||||
|
resolve_labels_of_asmlist_with_try_blocks_recursive(asmlist);
|
||||||
|
|
||||||
|
l2:=TAsmList.Create;
|
||||||
|
wasm_convert_to_flat_asmlist(asmlist,l2);
|
||||||
|
asmlist.Free;
|
||||||
|
asmlist:=l2;
|
||||||
|
|
||||||
asmlist.insertList(entry_code);
|
asmlist.insertList(entry_code);
|
||||||
entry_code.free;
|
entry_code.free;
|
||||||
asmlist.concatList(exit_code);
|
asmlist.concatList(exit_code);
|
||||||
|
Loading…
Reference in New Issue
Block a user