瀏覽代碼

Switch further simple types (sets, enums, class references, pointers) to indirect type information (again without breaking backwards compatibility).

compiler/ncgrtti.pas, TRTTIWriter.write_rtti_data:
  * enumdef_rtti, setdef_rtti, classrefdef_rtti & pointerdef_rtti: write an indirect RTTI reference

rtl/objpas/typinfo.pp, TTypeData:
  * rename BaseType to BaseTypeRef, CompType to CompTypeRef, InstanceType to InstanceTypeRef and RefType to RefTypeRef and change their type to TypeInfoPtr
  + add properties BaseType, CompType, InstanceType & RefType which return a PTypeInfo out of the corresponding *Ref field depending on the compiler version

git-svn-id: branches/svenbarth/packages@28265 -
svenbarth 11 年之前
父節點
當前提交
c231042384
共有 2 個文件被更改,包括 45 次插入8 次删除
  1. 4 4
      compiler/ncgrtti.pas
  2. 41 4
      rtl/objpas/typinfo.pp

+ 4 - 4
compiler/ncgrtti.pas

@@ -483,7 +483,7 @@ implementation
           current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_32bit(def.max));
           maybe_write_align;  // is align necessary here?
           { write base type }
-          write_rtti_reference(def.basedef,rt);
+          write_rtti_reference(def.basedef,rt,true);
           for i := 0 to def.symtable.SymList.Count - 1 do
             begin
               hp:=tenumsym(def.symtable.SymList[i]);
@@ -587,7 +587,7 @@ implementation
                current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(otUByte));
            end;
            maybe_write_align;
-           write_rtti_reference(def.elementdef,rt);
+           write_rtti_reference(def.elementdef,rt,true);
         end;
 
 
@@ -666,14 +666,14 @@ implementation
         begin
           write_header(def,tkClassRef);
           maybe_write_align;
-          write_rtti_reference(def.pointeddef,rt);
+          write_rtti_reference(def.pointeddef,rt,true);
         end;
 
         procedure pointerdef_rtti(def:tpointerdef);
         begin
           write_header(def,tkPointer);
           maybe_write_align;
-          write_rtti_reference(def.pointeddef,rt);
+          write_rtti_reference(def.pointeddef,rt,true);
         end;
 
         procedure recorddef_rtti(def:trecorddef);

+ 41 - 4
rtl/objpas/typinfo.pp

@@ -174,6 +174,21 @@ unit typinfo;
       packed
 {$endif FPC_REQUIRES_PROPER_ALIGNMENT}
       record
+      private
+        function GetBaseType: PTypeInfo; inline;
+        function GetCompType: PTypeInfo; inline;
+        function GetInstanceType: PTypeInfo; inline;
+        function GetRefType: PTypeInfo; inline;
+      public
+        { tkEnumeration }
+        property BaseType: PTypeInfo read GetBaseType;
+        { tkSet }
+        property CompType: PTypeInfo read GetCompType;
+        { tkClassRef }
+        property InstanceType: PTypeInfo read GetInstanceType;
+        { tkPointer }
+        property RefType: PTypeInfo read GetRefType;
+      public
          case TTypeKind of
             tkUnKnown,tkLString,tkWString,tkVariant,tkUString:
               ();
@@ -187,12 +202,12 @@ unit typinfo;
                     case TTypeKind of
                       tkEnumeration:
                         (
-                        BaseType : PTypeInfo;
+                        BaseTypeRef : TypeInfoPtr;
                         NameList : ShortString;
                         {EnumUnitName: ShortString;})
                     );
                   tkSet:
-                    (CompType : PTypeInfo)
+                    (CompTypeRef : TypeInfoPtr)
               );
 {$ifndef FPUNONE}
             tkFloat:
@@ -268,9 +283,9 @@ unit typinfo;
               DynUnitName: ShortStringBase
               );
             tkClassRef:
-              (InstanceType: PTypeInfo);
+              (InstanceTypeRef: TypeInfoPtr);
             tkPointer:
-              (RefType: PTypeInfo);
+              (RefTypeRef: TypeInfoPtr);
       end;
 
       TPropData =
@@ -2072,6 +2087,28 @@ begin
     end;
 end;
 
+{ TTypeData }
+
+function TTypeData.GetBaseType: PTypeInfo;
+begin
+  Result := BaseTypeRef{$ifndef ver2_6}^{$endif};
+end;
+
+function TTypeData.GetCompType: PTypeInfo;
+begin
+  Result := CompTypeRef{$ifndef ver2_6}^{$endif};
+end;
+
+function TTypeData.GetInstanceType: PTypeInfo;
+begin
+  Result := InstanceTypeRef{$ifndef ver2_6}^{$endif};
+end;
+
+function TTypeData.GetRefType: PTypeInfo;
+begin
+  Result := RefTypeRef{$ifndef ver2_6}^{$endif}
+end;
+
 { TPropInfo }
 
 function TPropInfo.GetPropType: PTypeInfo;