Browse Source

Provide possibility to select between using a direct and an indirect RTTI reference. This way the references can be changed for selected cases.

ncgrtti, TRTTIWriter:
  * ref_rtti: new "indirect" parameter that's relayed to rtti_mangledname()
  * write_rtti_reference: new "indirect" paramater that's relayed to ref_rtti()

git-svn-id: branches/svenbarth/packages@28262 -
svenbarth 11 years ago
parent
commit
46a5f1fb40
1 changed files with 6 additions and 6 deletions
  1. 6 6
      compiler/ncgrtti.pas

+ 6 - 6
compiler/ncgrtti.pas

@@ -44,11 +44,11 @@ interface
         function  published_properties_count(st:tsymtable):longint;
         function  published_properties_count(st:tsymtable):longint;
         procedure published_properties_write_rtti_data(propnamelist:TFPHashObjectList;st:tsymtable);
         procedure published_properties_write_rtti_data(propnamelist:TFPHashObjectList;st:tsymtable);
         procedure collect_propnamelist(propnamelist:TFPHashObjectList;objdef:tobjectdef);
         procedure collect_propnamelist(propnamelist:TFPHashObjectList;objdef:tobjectdef);
-        function  ref_rtti(def:tdef;rt:trttitype):tasmsymbol;
+        function  ref_rtti(def:tdef;rt:trttitype;indirect:boolean=false):tasmsymbol;
         procedure write_rtti_name(def:tdef);
         procedure write_rtti_name(def:tdef);
         procedure write_rtti_data(def:tdef;rt:trttitype);
         procedure write_rtti_data(def:tdef;rt:trttitype);
         procedure write_child_rtti_data(def:tdef;rt:trttitype);
         procedure write_child_rtti_data(def:tdef;rt:trttitype);
-        procedure write_rtti_reference(def:tdef;rt:trttitype);
+        procedure write_rtti_reference(def:tdef;rt:trttitype;indirect:boolean=false);
         procedure write_header(def: tdef; typekind: byte);
         procedure write_header(def: tdef; typekind: byte);
         procedure write_string(const s: string);
         procedure write_string(const s: string);
         procedure maybe_write_align;
         procedure maybe_write_align;
@@ -1327,18 +1327,18 @@ implementation
         end;
         end;
       end;
       end;
 
 
-    procedure TRTTIWriter.write_rtti_reference(def:tdef;rt:trttitype);
+    procedure TRTTIWriter.write_rtti_reference(def:tdef;rt:trttitype;indirect:boolean);
       begin
       begin
         if not assigned(def) or is_void(def) or ((rt<>initrtti) and is_objc_class_or_protocol(def)) then
         if not assigned(def) or is_void(def) or ((rt<>initrtti) and is_objc_class_or_protocol(def)) then
           current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_nil_dataptr)
           current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_nil_dataptr)
         else
         else
-          current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_sym(ref_rtti(def,rt)));
+          current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_sym(ref_rtti(def,rt,indirect)));
       end;
       end;
 
 
 
 
-    function TRTTIWriter.ref_rtti(def:tdef;rt:trttitype):tasmsymbol;
+    function TRTTIWriter.ref_rtti(def:tdef;rt:trttitype;indirect:boolean):tasmsymbol;
       begin
       begin
-        result:=current_asmdata.RefAsmSymbol(def.rtti_mangledname(rt),AT_DATA);
+        result:=current_asmdata.RefAsmSymbol(def.rtti_mangledname(rt,indirect),AT_DATA);
         if (cs_create_pic in current_settings.moduleswitches) and
         if (cs_create_pic in current_settings.moduleswitches) and
            assigned(current_procinfo) then
            assigned(current_procinfo) then
           include(current_procinfo.flags,pi_needs_got);
           include(current_procinfo.flags,pi_needs_got);