mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-22 11:49:17 +02:00
* set self to nil in current_module.deflist for registered defs in the
tstoreddef.destroy destructor, instead of doing it after each call to x.owner.deletedef(x) git-svn-id: trunk@49417 -
This commit is contained in:
parent
93fea6de3a
commit
ea5ffd597f
@ -1651,7 +1651,6 @@ implementation
|
|||||||
is_first_type: boolean;
|
is_first_type: boolean;
|
||||||
{$endif powerpc or powerpc64}
|
{$endif powerpc or powerpc64}
|
||||||
old_block_type: tblock_type;
|
old_block_type: tblock_type;
|
||||||
tmpidx: Integer;
|
|
||||||
begin
|
begin
|
||||||
old_block_type:=block_type;
|
old_block_type:=block_type;
|
||||||
block_type:=bt_var;
|
block_type:=bt_var;
|
||||||
@ -2022,10 +2021,6 @@ implementation
|
|||||||
|
|
||||||
trecordsymtable(recst).insertunionst(Unionsymtable,offset);
|
trecordsymtable(recst).insertunionst(Unionsymtable,offset);
|
||||||
uniondef.owner.deletedef(uniondef);
|
uniondef.owner.deletedef(uniondef);
|
||||||
{ this prevents a dangling pointer and use after free }
|
|
||||||
tmpidx:=current_module.deflist.IndexOfItem(uniondef,FromEnd);
|
|
||||||
if tmpidx<>-1 then
|
|
||||||
current_module.deflist[tmpidx]:=nil;
|
|
||||||
end;
|
end;
|
||||||
{ free the list }
|
{ free the list }
|
||||||
sc.free;
|
sc.free;
|
||||||
|
@ -614,7 +614,6 @@ implementation
|
|||||||
i: longint;
|
i: longint;
|
||||||
def: tdef;
|
def: tdef;
|
||||||
sym: tsym;
|
sym: tsym;
|
||||||
tmpidx: Integer;
|
|
||||||
begin
|
begin
|
||||||
for i:=current_module.localsymtable.deflist.count-1 downto 0 do
|
for i:=current_module.localsymtable.deflist.count-1 downto 0 do
|
||||||
begin
|
begin
|
||||||
@ -634,10 +633,6 @@ implementation
|
|||||||
tprocdef(def).procsym.is_registered then
|
tprocdef(def).procsym.is_registered then
|
||||||
tprocsym(tprocdef(def).procsym).ProcdefList.Remove(def);
|
tprocsym(tprocdef(def).procsym).ProcdefList.Remove(def);
|
||||||
current_module.localsymtable.deletedef(def);
|
current_module.localsymtable.deletedef(def);
|
||||||
{ this prevents a dangling pointer and use after free }
|
|
||||||
tmpidx:=current_module.deflist.IndexOfItem(def,FromEnd);
|
|
||||||
if tmpidx<>-1 then
|
|
||||||
current_module.deflist[tmpidx]:=nil;
|
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
{ from high to low so we hopefully have moves of less data }
|
{ from high to low so we hopefully have moves of less data }
|
||||||
|
@ -780,7 +780,6 @@ implementation
|
|||||||
forwardfound : boolean;
|
forwardfound : boolean;
|
||||||
symentry: TSymEntry;
|
symentry: TSymEntry;
|
||||||
item : tlinkedlistitem;
|
item : tlinkedlistitem;
|
||||||
tmpidx: Integer;
|
|
||||||
begin
|
begin
|
||||||
forwardfound:=false;
|
forwardfound:=false;
|
||||||
|
|
||||||
@ -1093,10 +1092,6 @@ implementation
|
|||||||
|
|
||||||
{ Release current procdef }
|
{ Release current procdef }
|
||||||
currpd.owner.deletedef(currpd);
|
currpd.owner.deletedef(currpd);
|
||||||
{ this prevents a dangling pointer and use after free }
|
|
||||||
tmpidx:=current_module.deflist.IndexOfItem(currpd,FromEnd);
|
|
||||||
if tmpidx<>-1 then
|
|
||||||
current_module.deflist[tmpidx]:=nil;
|
|
||||||
currpd:=fwpd;
|
currpd:=fwpd;
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
|
@ -1987,6 +1987,12 @@ implementation
|
|||||||
{$ifndef symansistr}
|
{$ifndef symansistr}
|
||||||
stringdispose(_fullownerhierarchyname);
|
stringdispose(_fullownerhierarchyname);
|
||||||
{$endif not symansistr}
|
{$endif not symansistr}
|
||||||
|
{ set self to nil in current_module's deflist, if the def has been
|
||||||
|
registered, in order to avoid dangling pointers in current_module.deflist }
|
||||||
|
if registered and assigned(current_module) and
|
||||||
|
(defid>=0) and (defid<current_module.deflist.Count) and
|
||||||
|
(current_module.deflist[defid]=self) then
|
||||||
|
current_module.deflist[defid]:=nil;
|
||||||
inherited destroy;
|
inherited destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user