mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2026-01-09 14:21:37 +01:00
* cloned twasmraisenode.pass_1_no_exceptions into twasmraisenode.pass_1_native_exceptions
This commit is contained in:
parent
c2754eac3f
commit
334ea46b44
@ -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;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user