mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-10-24 01:51:36 +02:00
* overload chaining checks if the procdef is in the same symtable, this
prevents keeping references to staticsymtable only procdefs that are
not accessible through the globalsymtable. And can cause crashes when
the staticsymtable is already released.
git-svn-id: trunk@644 -
This commit is contained in:
parent
f0efddff9b
commit
24f6bb1594
@ -634,7 +634,6 @@ interface
|
||||
tprocdeflist = record
|
||||
def : tprocdef;
|
||||
defderef : tderef;
|
||||
own : boolean;
|
||||
next : pprocdeflist;
|
||||
end;
|
||||
|
||||
|
||||
@ -665,8 +665,7 @@ implementation
|
||||
begin
|
||||
{ only write the proc definitions that belong
|
||||
to this procsym and are in the global symtable }
|
||||
if p^.own and
|
||||
(p^.def.owner.symtabletype in [globalsymtable,objectsymtable]) then
|
||||
if p^.def.owner=owner then
|
||||
inc(n);
|
||||
p:=p^.next;
|
||||
end;
|
||||
@ -677,8 +676,7 @@ implementation
|
||||
begin
|
||||
{ only write the proc definitions that belong
|
||||
to this procsym and are in the global symtable }
|
||||
if p^.own and
|
||||
(p^.def.owner.symtabletype in [globalsymtable,objectsymtable]) then
|
||||
if p^.def.owner=owner then
|
||||
ppufile.putderef(p^.defderef);
|
||||
p:=p^.next;
|
||||
end;
|
||||
@ -717,7 +715,7 @@ implementation
|
||||
p:=pdlistfirst;
|
||||
while assigned(p) do
|
||||
begin
|
||||
if p^.own and (p^.def.forwarddef) then
|
||||
if (p^.def.owner=owner) and (p^.def.forwarddef) then
|
||||
begin
|
||||
if (m_mac in aktmodeswitches) and (p^.def.interfacedef) then
|
||||
import_implict_external(p^.def)
|
||||
@ -740,7 +738,7 @@ implementation
|
||||
p:=pdlistfirst;
|
||||
while assigned(p) do
|
||||
begin
|
||||
if p^.own then
|
||||
if p^.def.owner=owner then
|
||||
p^.defderef.build(p^.def);
|
||||
p:=p^.next;
|
||||
end;
|
||||
@ -760,7 +758,10 @@ implementation
|
||||
p:=pdlistfirst;
|
||||
while assigned(p) do
|
||||
begin
|
||||
if not p^.own then
|
||||
if not(
|
||||
(p^.def=nil) or
|
||||
(p^.def.owner=owner)
|
||||
) then
|
||||
internalerror(200310291);
|
||||
p^.def:=tprocdef(p^.defderef.resolve);
|
||||
p:=p^.next;
|
||||
@ -776,7 +777,6 @@ implementation
|
||||
pd^.def:=p;
|
||||
pd^.defderef.reset;
|
||||
pd^.next:=nil;
|
||||
pd^.own:=(pd^.def.procsym=self);
|
||||
{ Add at end of list to keep always
|
||||
a correct order, also after loading from ppu }
|
||||
if assigned(pdlistlast) then
|
||||
@ -801,7 +801,6 @@ implementation
|
||||
pd^.def:=nil;
|
||||
pd^.defderef:=d;
|
||||
pd^.next:=nil;
|
||||
pd^.own:=true;
|
||||
{ Add at end of list to keep always
|
||||
a correct order, also after loading from ppu }
|
||||
if assigned(pdlistlast) then
|
||||
@ -1066,7 +1065,7 @@ implementation
|
||||
p:=pdlistfirst;
|
||||
while assigned(p) do
|
||||
begin
|
||||
if p^.own then
|
||||
if p^.def.owner=owner then
|
||||
p^.def.write_references(ppufile,locals);
|
||||
p:=p^.next;
|
||||
end;
|
||||
@ -1087,7 +1086,12 @@ implementation
|
||||
while assigned(p) do
|
||||
begin
|
||||
hp:=p^.next;
|
||||
if p^.own then
|
||||
{ only keep the proc definitions:
|
||||
- are not deref'd (def=nil)
|
||||
- are in the same symtable as the procsym (for example both
|
||||
are in the staticsymtable) }
|
||||
if (p^.def=nil) or
|
||||
(p^.def.owner=owner) then
|
||||
begin
|
||||
{ keep, add to list }
|
||||
if assigned(pdlistlast) then
|
||||
@ -1123,7 +1127,7 @@ implementation
|
||||
p:=pdlistfirst;
|
||||
while assigned(p) do
|
||||
begin
|
||||
if p^.own and
|
||||
if (p^.def.owner=owner) and
|
||||
p^.def.is_visible_for_object(tobjectdef(currobjdef)) then
|
||||
begin
|
||||
result:=true;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user