mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-14 12:49:09 +02:00
+ 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:
parent
564445da8c
commit
a54e342060
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user