+ 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 } { only write rtti of definitions from the current module }
if not findunitsymtable(def.owner).iscurrentunit then if not findunitsymtable(def.owner).iscurrentunit then
exit; exit;
{ check if separate initrtti is actually needed }
if (rt=initrtti) and (not def.needs_separate_initrtti) then
rt:=fullrtti;
{ prevent recursion } { prevent recursion }
if rttidefstate[rt] in def.defstates then if rttidefstate[rt] in def.defstates then
exit; exit;

View File

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

View File

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