Ver Fonte

+ 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 -
sergei há 13 anos atrás
pai
commit
a54e342060
3 ficheiros alterados com 29 adições e 1 exclusões
  1. 3 0
      compiler/ncgrtti.pas
  2. 25 1
      compiler/symdef.pas
  3. 1 0
      compiler/symtype.pas

+ 3 - 0
compiler/ncgrtti.pas

@@ -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;

+ 25 - 1
compiler/symdef.pas

@@ -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

+ 1 - 0
compiler/symtype.pas

@@ -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;