Fix inlining of record methods across units if the unit with the method definitions is already compiled.

symdef.pas:
  + tabstractrecorddef: implement buildderefimpl and derefimpl which works on the symtable (especially derefimpl is important here)
  - trecorddef & tobjectdef: remove buildderefimpl; it's already handled by the tabstractrecorddef one now
  - tobjectdef: remove the part of derefimpl that's already handled by tabstractrecorddef

git-svn-id: trunk@28267 -
This commit is contained in:
svenbarth 2014-07-25 22:01:23 +00:00
parent 0d96963459
commit d46ae01589

View File

@ -259,6 +259,8 @@ interface
constructor ppuload(dt:tdeftyp;ppufile:tcompilerppufile);
procedure ppuwrite(ppufile:tcompilerppufile);override;
destructor destroy; override;
procedure buildderefimpl;override;
procedure derefimpl;override;
procedure check_forwards; virtual;
function find_procdef_bytype(pt:tproctypeoption): tprocdef;
function GetSymtable(t:tGetSymtable):TSymtable;override;
@ -303,7 +305,6 @@ interface
override ppuwrite_platform instead }
procedure ppuwrite(ppufile:tcompilerppufile);override;final;
procedure buildderef;override;
procedure buildderefimpl;override;
procedure deref;override;
function size:asizeint;override;
function alignment : shortint;override;
@ -410,7 +411,6 @@ interface
function GetTypeName:string;override;
procedure buildderef;override;
procedure deref;override;
procedure buildderefimpl;override;
procedure derefimpl;override;
procedure resetvmtentries;
procedure copyvmtentries(objdef:tobjectdef);
@ -3705,6 +3705,23 @@ implementation
inherited destroy;
end;
procedure tabstractrecorddef.buildderefimpl;
begin
inherited buildderefimpl;
if not (df_copied_def in defoptions) then
tstoredsymtable(symtable).buildderefimpl;
end;
procedure tabstractrecorddef.derefimpl;
begin
inherited derefimpl;
if not (df_copied_def in defoptions) then
tstoredsymtable(symtable).derefimpl;
end;
procedure tabstractrecorddef.check_forwards;
begin
{ the defs of a copied def are defined for the original type only }
@ -4016,14 +4033,6 @@ implementation
end;
procedure trecorddef.buildderefimpl;
begin
inherited buildderefimpl;
if not (df_copied_def in defoptions) then
tstoredsymtable(symtable).buildderefimpl;
end;
procedure trecorddef.deref;
begin
inherited deref;
@ -6183,19 +6192,9 @@ implementation
end;
procedure tobjectdef.buildderefimpl;
begin
inherited buildderefimpl;
if not (df_copied_def in defoptions) then
tstoredsymtable(symtable).buildderefimpl;
end;
procedure tobjectdef.derefimpl;
begin
inherited derefimpl;
if not (df_copied_def in defoptions) then
tstoredsymtable(symtable).derefimpl;
{ the procdefs are not owned by the class helper procsyms, so they
are not stored/restored either -> re-add them here }
if (objecttype=odt_objcclass) or