mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-14 03:19:55 +02:00
* changed uses of "exit" in constructors to if/then constructs, to
avoid the constructor result/SSA bug in 2.6.x git-svn-id: trunk@26651 -
This commit is contained in:
parent
4e9c54278e
commit
6a4afd3a33
@ -159,51 +159,53 @@ function copy_parasize(var n: tnode; arg: pointer): foreachnoderesult;
|
|||||||
constructor tx64tryfinallynode.create(l, r: TNode);
|
constructor tx64tryfinallynode.create(l, r: TNode);
|
||||||
begin
|
begin
|
||||||
inherited create(l,r);
|
inherited create(l,r);
|
||||||
if (target_info.system<>system_x86_64_win64) or (
|
if (target_info.system=system_x86_64_win64) and
|
||||||
|
(
|
||||||
{ Don't create child procedures for generic methods, their nested-like
|
{ Don't create child procedures for generic methods, their nested-like
|
||||||
behavior causes compilation errors because real nested procedures
|
behavior causes compilation errors because real nested procedures
|
||||||
aren't allowed for generics. Not creating them doesn't harm because
|
aren't allowed for generics. Not creating them doesn't harm because
|
||||||
generic node tree is discarded without generating code. }
|
generic node tree is discarded without generating code. }
|
||||||
assigned(current_procinfo.procdef.struct) and
|
not assigned(current_procinfo.procdef.struct) or
|
||||||
(df_generic in current_procinfo.procdef.struct.defoptions)
|
not(df_generic in current_procinfo.procdef.struct.defoptions)
|
||||||
) then
|
) then
|
||||||
exit;
|
begin
|
||||||
finalizepi:=tcgprocinfo(cprocinfo.create(current_procinfo));
|
finalizepi:=tcgprocinfo(cprocinfo.create(current_procinfo));
|
||||||
finalizepi.force_nested;
|
finalizepi.force_nested;
|
||||||
finalizepi.procdef:=create_finalizer_procdef;
|
finalizepi.procdef:=create_finalizer_procdef;
|
||||||
finalizepi.entrypos:=r.fileinfo;
|
finalizepi.entrypos:=r.fileinfo;
|
||||||
finalizepi.entryswitches:=r.localswitches;
|
finalizepi.entryswitches:=r.localswitches;
|
||||||
finalizepi.exitpos:=current_filepos; // last_endtoken_pos?
|
finalizepi.exitpos:=current_filepos; // last_endtoken_pos?
|
||||||
finalizepi.exitswitches:=current_settings.localswitches;
|
finalizepi.exitswitches:=current_settings.localswitches;
|
||||||
{ the init/final code is messing with asm nodes, so inform the compiler about this }
|
{ the init/final code is messing with asm nodes, so inform the compiler about this }
|
||||||
include(finalizepi.flags,pi_has_assembler_block);
|
include(finalizepi.flags,pi_has_assembler_block);
|
||||||
{ Regvar optimization for symbols is suppressed when using exceptions, but
|
{ Regvar optimization for symbols is suppressed when using exceptions, but
|
||||||
temps may be still placed into registers. This must be fixed. }
|
temps may be still placed into registers. This must be fixed. }
|
||||||
foreachnodestatic(r,@reset_regvars,finalizepi);
|
foreachnodestatic(r,@reset_regvars,finalizepi);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
constructor tx64tryfinallynode.create_implicit(l, r, _t1: TNode);
|
constructor tx64tryfinallynode.create_implicit(l, r, _t1: TNode);
|
||||||
begin
|
begin
|
||||||
inherited create_implicit(l, r, _t1);
|
inherited create_implicit(l, r, _t1);
|
||||||
if (target_info.system<>system_x86_64_win64) then
|
if (target_info.system=system_x86_64_win64) then
|
||||||
exit;
|
begin
|
||||||
|
if assigned(current_procinfo.procdef.struct) and
|
||||||
|
(df_generic in current_procinfo.procdef.struct.defoptions) then
|
||||||
|
InternalError(2013012501);
|
||||||
|
|
||||||
if assigned(current_procinfo.procdef.struct) and
|
finalizepi:=tcgprocinfo(cprocinfo.create(current_procinfo));
|
||||||
(df_generic in current_procinfo.procdef.struct.defoptions) then
|
finalizepi.force_nested;
|
||||||
InternalError(2013012501);
|
finalizepi.procdef:=create_finalizer_procdef;
|
||||||
|
|
||||||
finalizepi:=tcgprocinfo(cprocinfo.create(current_procinfo));
|
finalizepi.entrypos:=current_filepos;
|
||||||
finalizepi.force_nested;
|
finalizepi.exitpos:=current_filepos; // last_endtoken_pos?
|
||||||
finalizepi.procdef:=create_finalizer_procdef;
|
finalizepi.entryswitches:=r.localswitches;
|
||||||
|
finalizepi.exitswitches:=current_settings.localswitches;
|
||||||
finalizepi.entrypos:=current_filepos;
|
include(finalizepi.flags,pi_do_call);
|
||||||
finalizepi.exitpos:=current_filepos; // last_endtoken_pos?
|
{ the init/final code is messing with asm nodes, so inform the compiler about this }
|
||||||
finalizepi.entryswitches:=r.localswitches;
|
include(finalizepi.flags,pi_has_assembler_block);
|
||||||
finalizepi.exitswitches:=current_settings.localswitches;
|
finalizepi.allocate_push_parasize(32);
|
||||||
include(finalizepi.flags,pi_do_call);
|
end;
|
||||||
{ the init/final code is messing with asm nodes, so inform the compiler about this }
|
|
||||||
include(finalizepi.flags,pi_has_assembler_block);
|
|
||||||
finalizepi.allocate_push_parasize(32);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function tx64tryfinallynode.simplify(forinline: boolean): tnode;
|
function tx64tryfinallynode.simplify(forinline: boolean): tnode;
|
||||||
|
Loading…
Reference in New Issue
Block a user