mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-27 15:30:26 +02:00
+ implemented the 'on' node code generation (try except 'on' ...) for the
branchful exceptions mode
This commit is contained in:
parent
a5dcd1c44d
commit
464b3ebbed
@ -603,8 +603,8 @@ implementation
|
|||||||
|
|
||||||
flowcontrol:=[fc_inflowcontrol]+trystate.oldflowcontrol*[fc_catching_exceptions];
|
flowcontrol:=[fc_inflowcontrol]+trystate.oldflowcontrol*[fc_catching_exceptions];
|
||||||
{ on statements }
|
{ on statements }
|
||||||
//if assigned(right) then
|
if assigned(right) then
|
||||||
// secondpass(right);
|
secondpass(right);
|
||||||
|
|
||||||
afteronflowcontrol:=flowcontrol;
|
afteronflowcontrol:=flowcontrol;
|
||||||
|
|
||||||
@ -1407,7 +1407,9 @@ implementation
|
|||||||
exceptvarsym : tlocalvarsym;
|
exceptvarsym : tlocalvarsym;
|
||||||
exceptlocdef: tdef;
|
exceptlocdef: tdef;
|
||||||
exceptlocreg: tregister;
|
exceptlocreg: tregister;
|
||||||
|
oldRaiseBr: Integer;
|
||||||
begin
|
begin
|
||||||
|
oldRaiseBr:=0;
|
||||||
location_reset(location,LOC_VOID,OS_NO);
|
location_reset(location,LOC_VOID,OS_NO);
|
||||||
|
|
||||||
cexceptionstatehandler.begin_catch(current_asmdata.CurrAsmList,excepttype,nil,exceptlocdef,exceptlocreg);
|
cexceptionstatehandler.begin_catch(current_asmdata.CurrAsmList,excepttype,nil,exceptlocdef,exceptlocreg);
|
||||||
@ -1428,21 +1430,29 @@ implementation
|
|||||||
{ in the case that another exception is risen
|
{ in the case that another exception is risen
|
||||||
we've to destroy the old one, so create a new
|
we've to destroy the old one, so create a new
|
||||||
exception frame for the catch-handler }
|
exception frame for the catch-handler }
|
||||||
//current_asmdata.CurrAsmList.concat(taicpu.op_none(a_try));
|
current_asmdata.CurrAsmList.concat(taicpu.op_none(a_block));
|
||||||
//thlcgwasm(hlcg).incblock;
|
thlcgwasm(hlcg).incblock;
|
||||||
|
|
||||||
|
current_asmdata.CurrAsmList.concat(taicpu.op_none(a_block));
|
||||||
|
thlcgwasm(hlcg).incblock;
|
||||||
|
oldRaiseBr:=thlcgwasm(hlcg).raiseBr;
|
||||||
|
thlcgwasm(hlcg).raiseBr:=thlcgwasm(hlcg).br_blocks;
|
||||||
|
|
||||||
if assigned(right) then
|
if assigned(right) then
|
||||||
secondpass(right);
|
secondpass(right);
|
||||||
|
|
||||||
hlcg.g_call_system_proc(current_asmdata.CurrAsmList,'fpc_doneexception',[],nil).resetiftemp;
|
hlcg.g_call_system_proc(current_asmdata.CurrAsmList,'fpc_doneexception',[],nil).resetiftemp;
|
||||||
current_asmdata.CurrAsmList.concat(taicpu.op_const(a_br,2));
|
current_asmdata.CurrAsmList.concat(taicpu.op_const(a_br,3));
|
||||||
|
|
||||||
//current_asmdata.CurrAsmList.concat(taicpu.op_sym(a_catch,current_asmdata.WeakRefAsmSymbol(FPC_EXCEPTION_TAG_SYM,AT_WASM_EXCEPTION_TAG)));
|
current_asmdata.CurrAsmList.concat(taicpu.op_none(a_end_block));
|
||||||
|
thlcgwasm(hlcg).decblock;
|
||||||
|
thlcgwasm(hlcg).raiseBr:=oldRaiseBr;
|
||||||
|
|
||||||
|
hlcg.g_call_system_proc(current_asmdata.CurrAsmList,'fpc_clear_exception_flag',[],nil).resetiftemp;
|
||||||
hlcg.g_call_system_proc(current_asmdata.CurrAsmList,'fpc_raise_nested',[],nil).resetiftemp;
|
hlcg.g_call_system_proc(current_asmdata.CurrAsmList,'fpc_raise_nested',[],nil).resetiftemp;
|
||||||
|
|
||||||
//current_asmdata.CurrAsmList.concat(taicpu.op_none(a_end_try));
|
current_asmdata.CurrAsmList.concat(taicpu.op_none(a_end_block));
|
||||||
//thlcgwasm(hlcg).decblock;
|
thlcgwasm(hlcg).decblock;
|
||||||
|
|
||||||
{ clear some stuff }
|
{ clear some stuff }
|
||||||
if assigned(exceptvarsym) then
|
if assigned(exceptvarsym) then
|
||||||
|
Loading…
Reference in New Issue
Block a user