+ Reduce the amount of RTTI by not generating 'init' information if it will end up being the same as the 'full' one (which is the case of most simple types). The new behavior can be customized for every tdef by overriding needs_separate_initrtti method.

git-svn-id: trunk@21077 -
This commit is contained in:
sergei 2012-04-27 10:17:59 +00:00
parent 564445da8c
commit a54e342060
3 changed files with 29 additions and 1 deletions

View File

@ -1208,6 +1208,9 @@ implementation
{ only write rtti of definitions from the current module }
if not findunitsymtable(def.owner).iscurrentunit then
exit;
{ check if separate initrtti is actually needed }
if (rt=initrtti) and (not def.needs_separate_initrtti) then
rt:=fullrtti;
{ prevent recursion }
if rttidefstate[rt] in def.defstates then
exit;

View File

@ -80,6 +80,7 @@ interface
function needs_inittable : boolean;override;
function rtti_mangledname(rt:trttitype):string;override;
function OwnerHierarchyName: string; override;
function needs_separate_initrtti:boolean;override;
function in_currentunit: boolean;
{ regvars }
function is_intregable : boolean;
@ -223,6 +224,7 @@ interface
function GetTypeName:string;override;
{ debug }
function needs_inittable : boolean;override;
function needs_separate_initrtti:boolean;override;
{ jvm }
function is_related(d : tdef) : boolean;override;
end;
@ -328,6 +330,7 @@ interface
function is_publishable : boolean;override;
function is_related(d : tdef) : boolean;override;
function needs_inittable : boolean;override;
function needs_separate_initrtti : boolean;override;
function rtti_mangledname(rt:trttitype):string;override;
function vmt_mangledname : TSymStr;
procedure check_forwards; override;
@ -393,6 +396,7 @@ interface
function alignment : shortint;override;
{ returns the label of the range check string }
function needs_inittable : boolean;override;
function needs_separate_initrtti : boolean;override;
property elementdef : tdef read _elementdef write setelementdef;
function is_publishable : boolean;override;
end;
@ -1402,11 +1406,16 @@ implementation
end;
function tstoreddef.needs_separate_initrtti:boolean;
begin
result:=false;
end;
function Tstoreddef.rtti_mangledname(rt:trttitype):string;
var
prefix : string[4];
begin
if rt=fullrtti then
if (rt=fullrtti) or (not needs_separate_initrtti) then
begin
prefix:='RTTI';
include(defstates,ds_rtti_table_used);
@ -3055,6 +3064,13 @@ implementation
needs_inittable:=(ado_IsDynamicArray in arrayoptions) or elementdef.needs_inittable;
end;
function tarraydef.needs_separate_initrtti : boolean;
begin
if ado_IsBitPacked in arrayoptions then
result:=false
else
result:=elementdef.needs_separate_initrtti;
end;
function tarraydef.GetTypeName : string;
begin
@ -3397,6 +3413,10 @@ implementation
needs_inittable:=trecordsymtable(symtable).needs_init_final
end;
function trecorddef.needs_separate_initrtti : boolean;
begin
result:=true;
end;
function trecorddef.is_related(d: tdef): boolean;
begin
@ -5846,6 +5866,10 @@ implementation
end;
end;
function tobjectdef.needs_separate_initrtti : boolean;
begin
result:=not (objecttype in [odt_interfacecom,odt_interfacecorba,odt_dispinterface]);
end;
function tobjectdef.rtti_mangledname(rt: trttitype): string;
begin

View File

@ -82,6 +82,7 @@ interface
function geTSymtable(t:tgeTSymtable):TSymtable;virtual;
function is_publishable:boolean;virtual;abstract;
function needs_inittable:boolean;virtual;abstract;
function needs_separate_initrtti:boolean;virtual;abstract;
function is_related(def:tdef):boolean;virtual;
procedure ChangeOwner(st:TSymtable);
procedure register_created_object_type;virtual;