mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-06 11:50:19 +02:00
* during specialization use the symtable stack at
definition time, fixes tgeneric14 git-svn-id: trunk@7348 -
This commit is contained in:
parent
4ff8d4f15c
commit
83ccc62cf0
@ -1718,10 +1718,32 @@ implementation
|
|||||||
|
|
||||||
|
|
||||||
procedure specialize_objectdefs(p:TObject;arg:pointer);
|
procedure specialize_objectdefs(p:TObject;arg:pointer);
|
||||||
|
|
||||||
|
function find_module_from_symtable(st:tsymtable):tmodule;
|
||||||
|
var
|
||||||
|
hp : tmodule;
|
||||||
|
begin
|
||||||
|
result:=nil;
|
||||||
|
hp:=tmodule(loaded_units.first);
|
||||||
|
while assigned(hp) do
|
||||||
|
begin
|
||||||
|
if (hp.globalsymtable=st) or
|
||||||
|
(hp.localsymtable=st) then
|
||||||
|
begin
|
||||||
|
result:=hp;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
hp:=tmodule(hp.next);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
var
|
var
|
||||||
i : longint;
|
i : longint;
|
||||||
hp : tdef;
|
hp : tdef;
|
||||||
oldcurrent_filepos : tfileposinfo;
|
oldcurrent_filepos : tfileposinfo;
|
||||||
|
oldsymtablestack : tsymtablestack;
|
||||||
|
pu : tused_unit;
|
||||||
|
hmodule : tmodule;
|
||||||
begin
|
begin
|
||||||
if not((tsym(p).typ=typesym) and
|
if not((tsym(p).typ=typesym) and
|
||||||
(ttypesym(p).typedef.typ=objectdef) and
|
(ttypesym(p).typedef.typ=objectdef) and
|
||||||
@ -1729,6 +1751,25 @@ implementation
|
|||||||
) then
|
) then
|
||||||
exit;
|
exit;
|
||||||
|
|
||||||
|
{ Setup symtablestack a definition time }
|
||||||
|
oldsymtablestack:=symtablestack;
|
||||||
|
symtablestack:=tsymtablestack.create;
|
||||||
|
if not assigned(tobjectdef(ttypesym(p).typedef).genericdef) then
|
||||||
|
internalerror(200705151);
|
||||||
|
hmodule:=find_module_from_symtable(tobjectdef(ttypesym(p).typedef).genericdef.owner);
|
||||||
|
if hmodule=nil then
|
||||||
|
internalerror(200705152);
|
||||||
|
pu:=tused_unit(hmodule.used_units.first);
|
||||||
|
while assigned(pu) do
|
||||||
|
begin
|
||||||
|
if not assigned(pu.u.globalsymtable) then
|
||||||
|
internalerror(200705153);
|
||||||
|
symtablestack.push(pu.u.globalsymtable);
|
||||||
|
pu:=tused_unit(pu.next);
|
||||||
|
end;
|
||||||
|
symtablestack.push(hmodule.globalsymtable);
|
||||||
|
symtablestack.push(hmodule.localsymtable);
|
||||||
|
|
||||||
{ definitions }
|
{ definitions }
|
||||||
for i:=0 to tobjectdef(ttypesym(p).typedef).symtable.DefList.Count-1 do
|
for i:=0 to tobjectdef(ttypesym(p).typedef).symtable.DefList.Count-1 do
|
||||||
begin
|
begin
|
||||||
@ -1750,6 +1791,10 @@ implementation
|
|||||||
MessagePos1(tprocdef(tprocdef(hp).genericdef).fileinfo,sym_e_forward_not_resolved,tprocdef(tprocdef(hp).genericdef).fullprocname(false));
|
MessagePos1(tprocdef(tprocdef(hp).genericdef).fileinfo,sym_e_forward_not_resolved,tprocdef(tprocdef(hp).genericdef).fullprocname(false));
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ Restore symtablestack }
|
||||||
|
symtablestack.free;
|
||||||
|
symtablestack:=oldsymtablestack;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -1758,11 +1803,7 @@ implementation
|
|||||||
if assigned(current_module.globalsymtable) then
|
if assigned(current_module.globalsymtable) then
|
||||||
current_module.globalsymtable.SymList.ForEachCall(@specialize_objectdefs,nil);
|
current_module.globalsymtable.SymList.ForEachCall(@specialize_objectdefs,nil);
|
||||||
if assigned(current_module.localsymtable) then
|
if assigned(current_module.localsymtable) then
|
||||||
begin
|
current_module.localsymtable.SymList.ForEachCall(@specialize_objectdefs,nil);
|
||||||
symtablestack.push(current_module.localsymtable);
|
|
||||||
current_module.localsymtable.SymList.ForEachCall(@specialize_objectdefs,nil);
|
|
||||||
symtablestack.pop(current_module.localsymtable);
|
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
Loading…
Reference in New Issue
Block a user