Am 25.03.2013 10:01, schrieb Sven Barth:
Am 24.03.2013 22:49, schrieb Steve Hildebrandt:
Am 24.03.2013 22:26, schrieb Sven Barth:
I don't know immediately how you can differentiate between anonymous types and named ones, but that would be the key difference.
Since the function building the name usied to access the RTTI table uses only the smytables to decide weather the type is annonymous or referenced by it's name I thought that approach was ok.
(symdef.pas 1434)
    function Tstoreddef.rtti_mangledname(rt:trttitype):string;
     ...
        if assigned(typesym) and
           (owner.symtabletype in [staticsymtable,globalsymtable]) then
          result:=make_mangledname(prefix,owner,typesym.name)
        else
result:=make_mangledname(prefix,findunitsymtable(owner),'DEF'+tostr(DefId))
      end;
Somehow I have the feeling that this should be corrected...
My knowledge of the wokings of the compiler are not detailed enought to judge or fix this issue.
Shall I report it on the bugtracker?
Or are nested types also referenced by the definition id?(I had something on my mind like Unit Type SubType with some seperators("$") in between)
Looking at the code above you could try whether "typesym" of the procvardef is assigned if it is a named one.
Checking for typesym woks fine for my test and use cases.

Index: compiler/ncgrtti.pas
===================================================================
--- compiler/ncgrtti.pas        (revision 24052)
+++ compiler/ncgrtti.pas        (working copy)
@@ -687,67 +687,81 @@
           methodkind : byte;
           i : integer;
         begin
+          { write method id and name }
           if po_methodpointer in def.procoptions then
+            write_header(def,tkMethod)
+          else
             begin
-               { write method id and name }
-               write_header(def,tkMethod);
-               maybe_write_align;
+              write_header(def,tkProcVar);
+              { no rtti for anonymous procdural types e.g. "foo : procedure of 
object;"}
+              if not assigned(def.typesym) then
+                exit;
+            end;
 
-               { write kind of method }
-               case def.proctypeoption of
-                 potype_constructor: methodkind:=mkConstructor;
-                 potype_destructor: methodkind:=mkDestructor;
-                 potype_class_constructor: methodkind:=mkClassConstructor;
-                 potype_class_destructor: methodkind:=mkClassDestructor;
-                 potype_operator: methodkind:=mkOperatorOverload;
-                 potype_procedure:
-                   if po_classmethod in def.procoptions then
-                     methodkind:=mkClassProcedure
-                   else
-                     methodkind:=mkProcedure;
-                 potype_function:
-                   if po_classmethod in def.procoptions then
-                     methodkind:=mkClassFunction
-                   else
-                     methodkind:=mkFunction;
+          maybe_write_align;
+
+          { write kind of method }
+          case def.proctypeoption of
+             potype_constructor       :
+               methodkind := mkConstructor;
+             potype_destructor        :
+               methodkind := mkDestructor;
+             potype_class_constructor :
+               methodkind := mkClassConstructor;
+             potype_class_destructor  :
+               methodkind := mkClassDestructor;
+             potype_operator          :
+               methodkind := mkOperatorOverload;
+             potype_procedure         :
+               begin
+                 if po_classmethod in def.procoptions then
+                   methodkind := mkClassProcedure
+                 else
+                   methodkind := mkProcedure;
+               end;
+             potype_function:
+               begin
+                 if po_classmethod in def.procoptions then
+                   methodkind := mkClassFunction
+                 else
+                   methodkind := mkFunction;
+               end
+           else
+             begin
+               if def.returndef = voidtype then
+                 methodkind := mkProcedure
                else
-                 begin
-                   if def.returndef = voidtype then
-                     methodkind:=mkProcedure
-                   else
-                     methodkind:=mkFunction;
-                 end;
-               end;
-               
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(methodkind));
+                 methodkind := mkFunction;
+             end;
+           end;
 
-               { write parameter info. The parameters must be written in 
reverse order
-                 if this method uses right to left parameter pushing! }
-               
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(def.maxparacount));
+           
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(methodkind));
 
-               for i:=0 to def.paras.count-1 do
-                 write_para(tparavarsym(def.paras[i]));
+           { write parameter info. The parameters must be written in reverse 
order
+             if this method uses right to left parameter pushing! }
+           
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(def.maxparacount));
 
-               if (methodkind=mkFunction) or (methodkind=mkClassFunction) then
-               begin
-                 { write name of result type }
-                 write_rtti_name(def.returndef);
-                 maybe_write_align;
+           for i:=0 to def.paras.count-1 do
+             write_para(tparavarsym(def.paras[i]));
 
-                 { write result typeinfo }
-                 
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_sym(ref_rtti(def.returndef,fullrtti)))
-               end;
+           if (methodkind=mkFunction) or (methodkind=mkClassFunction) then
+           begin
+             { write name of result type }
+             write_rtti_name(def.returndef);
+             maybe_write_align;
 
-               { write calling convention }
-               
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(ProcCallOptionToCallConv[def.proccalloption]));
-               maybe_write_align;
+             { write result typeinfo }
+             
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_sym(ref_rtti(def.returndef,fullrtti)))
+           end;
 
-               { write params typeinfo }
-               for i:=0 to def.paras.count-1 do
-                 if not(vo_is_hidden_para in 
tparavarsym(def.paras[i]).varoptions) then
-                   
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_sym(ref_rtti(tparavarsym(def.paras[i]).vardef,fullrtti)));
-            end
-          else
-            write_header(def,tkProcvar);
+           { write calling convention }
+           
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(ProcCallOptionToCallConv[def.proccalloption]));
+           maybe_write_align;
+
+           { write params typeinfo }
+           for i:=0 to def.paras.count-1 do
+             if not(vo_is_hidden_para in tparavarsym(def.paras[i]).varoptions) 
then
+               
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_sym(ref_rtti(tparavarsym(def.paras[i]).vardef,fullrtti)));
         end;
 
 
Index: rtl/objpas/typinfo.pp
===================================================================
--- rtl/objpas/typinfo.pp       (revision 24052)
+++ rtl/objpas/typinfo.pp       (working copy)
@@ -159,7 +159,7 @@
                HelperUnit : ShortString
                // here the properties follow as array of TPropInfo
               );
-            tkMethod:
+            tkMethod, tkProcVar:
               (MethodKind : TMethodKind;
                ParamCount : Byte;
                ParamList : array[0..1023] of Char
_______________________________________________
fpc-devel maillist  -  [email protected]
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to