mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-12 20:33:13 +02:00
+ implemented try..finally in branchful exceptions mode
This commit is contained in:
parent
7afb665c92
commit
7ce19c1ad7
@ -1088,6 +1088,7 @@ implementation
|
||||
oldLoopContBr: integer;
|
||||
oldLoopBreakBr: integer;
|
||||
oldExitBr: integer;
|
||||
oldRaiseBr: integer;
|
||||
finallyexceptionstate: tcgexceptionstatehandler.texceptionstate;
|
||||
excepttemps : tcgexceptionstatehandler.texceptiontemps;
|
||||
exceptframekind: tcgexceptionstatehandler.texceptframekind;
|
||||
@ -1108,7 +1109,7 @@ implementation
|
||||
thlcgwasm(hlcg).decblock;
|
||||
end;
|
||||
|
||||
procedure generate_exceptreason_throw(reason: tcgint);
|
||||
procedure generate_exceptreason_reraise(reason: tcgint);
|
||||
var
|
||||
reasonreg : tregister;
|
||||
begin
|
||||
@ -1118,7 +1119,7 @@ implementation
|
||||
current_asmdata.CurrAsmList.concat(taicpu.op_none(a_if));
|
||||
thlcgwasm(hlcg).incblock;
|
||||
thlcgwasm(hlcg).decstack(current_asmdata.CurrAsmList,1);
|
||||
//current_asmdata.CurrAsmList.Concat(taicpu.op_sym(a_throw,current_asmdata.WeakRefAsmSymbol(FPC_EXCEPTION_TAG_SYM,AT_WASM_EXCEPTION_TAG)));
|
||||
hlcg.g_call_system_proc(current_asmdata.CurrAsmList,'fpc_reraise',[],nil).resetiftemp;
|
||||
current_asmdata.CurrAsmList.concat(taicpu.op_none(a_end_if));
|
||||
thlcgwasm(hlcg).decblock;
|
||||
end;
|
||||
@ -1131,6 +1132,7 @@ implementation
|
||||
breakfinallylabel:=nil;
|
||||
oldLoopBreakBr:=0;
|
||||
oldLoopContBr:=0;
|
||||
oldRaiseBr:=0;
|
||||
|
||||
in_loop:=assigned(current_procinfo.CurrBreakLabel);
|
||||
|
||||
@ -1190,8 +1192,10 @@ implementation
|
||||
end;
|
||||
|
||||
{ the inner 'try..end_try' block }
|
||||
//current_asmdata.CurrAsmList.concat(taicpu.op_none(a_try));
|
||||
//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;
|
||||
|
||||
{ try code }
|
||||
if assigned(left) then
|
||||
@ -1210,14 +1214,14 @@ implementation
|
||||
hlcg.g_exception_reason_save_const(current_asmdata.CurrAsmList,exceptionreasontype,0,excepttemps.reasonbuf);
|
||||
current_asmdata.CurrAsmList.concat(taicpu.op_const(a_br,4)); // jump to the 'finally' section
|
||||
|
||||
//current_asmdata.CurrAsmList.concat(taicpu.op_sym(a_catch,current_asmdata.WeakRefAsmSymbol(FPC_EXCEPTION_TAG_SYM,AT_WASM_EXCEPTION_TAG)));
|
||||
{ exceptionreason:=1 (exception) }
|
||||
hlcg.g_exception_reason_save_const(current_asmdata.CurrAsmList,exceptionreasontype,1,excepttemps.reasonbuf);
|
||||
current_asmdata.CurrAsmList.concat(taicpu.op_const(a_br,4)); // jump to the 'finally' section
|
||||
|
||||
{ exit the inner 'try..end_try' block }
|
||||
//current_asmdata.CurrAsmList.concat(taicpu.op_none(a_end_try));
|
||||
//thlcgwasm(hlcg).decblock;
|
||||
current_asmdata.CurrAsmList.concat(taicpu.op_none(a_end_block));
|
||||
thlcgwasm(hlcg).decblock;
|
||||
|
||||
{ exceptionreason:=1 (exception) }
|
||||
hlcg.g_call_system_proc(current_asmdata.CurrAsmList,'fpc_clear_exception_flag',[],nil).resetiftemp;
|
||||
hlcg.g_exception_reason_save_const(current_asmdata.CurrAsmList,exceptionreasontype,1,excepttemps.reasonbuf);
|
||||
current_asmdata.CurrAsmList.concat(taicpu.op_const(a_br,3)); // jump to the 'finally' section
|
||||
|
||||
{ exit the 'continue' block }
|
||||
current_asmdata.CurrAsmList.concat(taicpu.op_none(a_end_block));
|
||||
@ -1247,6 +1251,9 @@ implementation
|
||||
{ end cleanup }
|
||||
current_asmdata.CurrAsmList.concat(tai_marker.create(mark_NoLineInfoEnd));
|
||||
|
||||
{ restore previous raiseBr }
|
||||
thlcgwasm(hlcg).raiseBr:=oldRaiseBr;
|
||||
|
||||
{ finally code (don't unconditionally set fc_inflowcontrol, since the
|
||||
finally code is unconditionally executed; we do have to filter out
|
||||
flags regarding break/contrinue/etc. because we have to give an
|
||||
@ -1269,7 +1276,7 @@ implementation
|
||||
generate_exceptreason_check_br(3,thlcgwasm(hlcg).br_blocks-oldLoopBreakBr);
|
||||
if fc_continue in finallyexceptionstate.newflowcontrol then
|
||||
generate_exceptreason_check_br(4,thlcgwasm(hlcg).br_blocks-oldLoopContBr);
|
||||
generate_exceptreason_throw(1);
|
||||
generate_exceptreason_reraise(1);
|
||||
|
||||
cexceptionstatehandler.unget_exception_temps(current_asmdata.CurrAsmList,excepttemps);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user