* cloned twasmraisenode.pass_1_no_exceptions into twasmraisenode.pass_1_native_exceptions

This commit is contained in:
Nikolay Nikolov 2021-09-18 02:48:51 +03:00
parent c2754eac3f
commit 334ea46b44

View File

@ -54,6 +54,7 @@ interface
twasmraisenode = class(tcgraisenode)
private
function pass_1_no_exceptions : tnode;
function pass_1_native_exceptions : tnode;
public
function pass_1 : tnode;override;
end;
@ -281,10 +282,69 @@ implementation
end;
function twasmraisenode.pass_1_native_exceptions : tnode;
var
statements : tstatementnode;
//current_addr : tlabelnode;
raisenode : tcallnode;
begin
result:=internalstatements(statements);
if assigned(left) then
begin
{ first para must be a class }
firstpass(left);
{ insert needed typeconvs for addr,frame }
if assigned(right) then
begin
{ addr }
firstpass(right);
{ frame }
if assigned(third) then
firstpass(third)
else
third:=cpointerconstnode.Create(0,voidpointertype);
end
else
begin
third:=cinlinenode.create(in_get_frame,false,nil);
//current_addr:=clabelnode.create(cnothingnode.create,clabelsym.create('$raiseaddr'));
//addstatement(statements,current_addr);
//right:=caddrnode.create(cloadnode.create(current_addr.labsym,current_addr.labsym.owner));
right:=cnilnode.create;
{ raise address off by one so we are for sure inside the action area for the raise }
if tf_use_psabieh in target_info.flags then
right:=caddnode.create_internal(addn,right,cordconstnode.create(1,sizesinttype,false));
end;
raisenode:=ccallnode.createintern('fpc_raiseexception',
ccallparanode.create(third,
ccallparanode.create(right,
ccallparanode.create(left,nil)))
);
include(raisenode.callnodeflags,cnf_call_never_returns);
addstatement(statements,raisenode);
end
else
begin
addstatement(statements,ccallnode.createintern('fpc_popaddrstack',nil));
raisenode:=ccallnode.createintern('fpc_reraise',nil);
include(raisenode.callnodeflags,cnf_call_never_returns);
addstatement(statements,raisenode);
end;
left:=nil;
right:=nil;
third:=nil;
end;
function twasmraisenode.pass_1 : tnode;
begin
if ts_wasm_no_exceptions in current_settings.targetswitches then
result:=pass_1_no_exceptions
else if ts_wasm_native_exceptions in current_settings.targetswitches then
result:=pass_1_native_exceptions
else
result:=inherited;
end;