Просмотр исходного кода

* change RecInitTable into a direct reference to avoid an unnecessary indirection as both the full and init RTTI of a record always reside inside the same unit

git-svn-id: trunk@35128 -
svenbarth 8 лет назад
Родитель
Сommit
7089677a22
3 измененных файлов с 6 добавлено и 4 удалено
  1. 3 1
      compiler/ncgrtti.pas
  2. 2 2
      rtl/inc/rtti.inc
  3. 1 1
      rtl/objpas/typinfo.pp

+ 3 - 1
compiler/ncgrtti.pas

@@ -863,7 +863,9 @@ implementation
              begin
                { point to more optimal init table }
                include(def.defstates,ds_init_table_used);
-               write_rtti_reference(tcb,def,initrtti);
+               { we use a direct reference as the init RTTI is always in the same
+                 unit as the full RTTI }
+               tcb.emit_tai(Tai_const.Create_sym(ref_rtti(def,initrtti,false)),voidpointertype);
              end;
 
            tcb.emit_ord_const(def.size,u32inttype);

+ 2 - 2
rtl/inc/rtti.inc

@@ -49,7 +49,7 @@ type
 {$endif USE_PACKED}
   record
 {$ifndef VER3_0}
-    InitTable: PPointer;
+    InitTable: Pointer;
 {$endif VER3_0}
     Size: Longint;
     Count: Longint;
@@ -116,7 +116,7 @@ begin
   { check terminator, maybe we are already in init table }
   if Assigned(PRecordInfoInit(typeInfo)^.Terminator) then
     { point to more optimal initrtti }
-    result:=PRecordInfoFull(result)^.InitTable^;
+    result:=PRecordInfoFull(result)^.InitTable;
 {$endif VER3_0}
 end;
 

+ 1 - 1
rtl/objpas/typinfo.pp

@@ -270,7 +270,7 @@ unit typinfo;
             tkRecord:
               (
 {$ifndef VER3_0}
-                RecInitTable: PPointer;
+                RecInitTable: Pointer; { points to TTypeInfo followed by init table }
 {$endif VER3_0}
                 RecSize: Integer;
                 ManagedFldCount: Integer;