Obtain Class hierarchy (in MacPas mode)

classic Classic list List threaded Threaded
11 messages Options
Reply | Threaded
Open this post in threaded view
|

Obtain Class hierarchy (in MacPas mode)

Adriaan van Os-2
I am looking for a way to obtain the class hierarchy of a program in MacPas mode (where there are
no published properties). TObject has ClassParent, so a list of Class types would be sufficient, I
think. I can't find however a routine in the RTL to obtain such a list.

Regards,

Adriaan van Os
_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: Obtain Class hierarchy (in MacPas mode)

Michael Van Canneyt


On Tue, 21 Sep 2010, Adriaan van Os wrote:

> I am looking for a way to obtain the class hierarchy of a program in MacPas
> mode (where there are no published properties). TObject has ClassParent, so a
> list of Class types would be sufficient, I think. I can't find however a
> routine in the RTL to obtain such a list.

There is no such routine in the RTL, to my knowledge.

Michael.
_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: Obtain Class hierarchy (in MacPas mode)

Adriaan van Os-2
Michael Van Canneyt wrote:

>
>
> On Tue, 21 Sep 2010, Adriaan van Os wrote:
>
>> I am looking for a way to obtain the class hierarchy of a program in
>> MacPas mode (where there are no published properties). TObject has
>> ClassParent, so a list of Class types would be sufficient, I think. I
>> can't find however a routine in the RTL to obtain such a list.
>
> There is no such routine in the RTL, to my knowledge.

Can I add it ? I guess a low-level pointer to a list of VMT's would be sufficient to implement it ?
That is, for object definitions that do have virtual methods ...

Regards,

Adriaan van Os

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: Obtain Class hierarchy (in MacPas mode)

Florian Klaempfl
Am 21.09.2010 13:42, schrieb Adriaan van Os:

> Michael Van Canneyt wrote:
>>
>>
>> On Tue, 21 Sep 2010, Adriaan van Os wrote:
>>
>>> I am looking for a way to obtain the class hierarchy of a program in
>>> MacPas mode (where there are no published properties). TObject has
>>> ClassParent, so a list of Class types would be sufficient, I think. I
>>> can't find however a routine in the RTL to obtain such a list.
>>
>> There is no such routine in the RTL, to my knowledge.
>
> Can I add it ? I guess a low-level pointer to a list of VMT's would be
> sufficient to implement it ?

Problem is: it breaks smartlinking.
_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: Obtain Class hierarchy (in MacPas mode)

Michael Van Canneyt
In reply to this post by Adriaan van Os-2


On Tue, 21 Sep 2010, Adriaan van Os wrote:

> Michael Van Canneyt wrote:
>>
>>
>> On Tue, 21 Sep 2010, Adriaan van Os wrote:
>>
>>> I am looking for a way to obtain the class hierarchy of a program in
>>> MacPas mode (where there are no published properties). TObject has
>>> ClassParent, so a list of Class types would be sufficient, I think. I
>>> can't find however a routine in the RTL to obtain such a list.
>>
>> There is no such routine in the RTL, to my knowledge.
>
> Can I add it ? I guess a low-level pointer to a list of VMT's would be
> sufficient to implement it ? That is, for object definitions that do have
> virtual methods ...

Where do you want to add it ?  What is the method declaration you'd use ?

Michael.
_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: Obtain Class hierarchy (in MacPas mode)

Michael Van Canneyt
In reply to this post by Florian Klaempfl


On Tue, 21 Sep 2010, Florian Klaempfl wrote:

> Am 21.09.2010 13:42, schrieb Adriaan van Os:
>> Michael Van Canneyt wrote:
>>>
>>>
>>> On Tue, 21 Sep 2010, Adriaan van Os wrote:
>>>
>>>> I am looking for a way to obtain the class hierarchy of a program in
>>>> MacPas mode (where there are no published properties). TObject has
>>>> ClassParent, so a list of Class types would be sufficient, I think. I
>>>> can't find however a routine in the RTL to obtain such a list.
>>>
>>> There is no such routine in the RTL, to my knowledge.
>>
>> Can I add it ? I guess a low-level pointer to a list of VMT's would be
>> sufficient to implement it ?
>
> Problem is: it breaks smartlinking.

Why? It's just walking the ParentClass hierarchy of a given class; which is
what RTTI does anyway ?

Michael.
_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: Obtain Class hierarchy (in MacPas mode)

Sven Barth-2
Am 21.09.2010 13:49, schrieb Michael Van Canneyt:

>
>
> On Tue, 21 Sep 2010, Florian Klaempfl wrote:
>
>> Am 21.09.2010 13:42, schrieb Adriaan van Os:
>>> Michael Van Canneyt wrote:
>>>>
>>>>
>>>> On Tue, 21 Sep 2010, Adriaan van Os wrote:
>>>>
>>>>> I am looking for a way to obtain the class hierarchy of a program in
>>>>> MacPas mode (where there are no published properties). TObject has
>>>>> ClassParent, so a list of Class types would be sufficient, I think. I
>>>>> can't find however a routine in the RTL to obtain such a list.
>>>>
>>>> There is no such routine in the RTL, to my knowledge.
>>>
>>> Can I add it ? I guess a low-level pointer to a list of VMT's would be
>>> sufficient to implement it ?
>>
>> Problem is: it breaks smartlinking.
>
> Why? It's just walking the ParentClass hierarchy of a given class; which is
> what RTTI does anyway ?

If I understood it right he wants the complete hierachy (or the complete
class tree) which is used in a program. So the opposite of "ClassParent".

Regards,
Sven
_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: Obtain Class hierarchy (in MacPas mode)

Adriaan van Os-2
In reply to this post by Michael Van Canneyt
Michael Van Canneyt wrote:

>
> On Tue, 21 Sep 2010, Florian Klaempfl wrote:
>
>> Am 21.09.2010 13:42, schrieb Adriaan van Os:
>>> Michael Van Canneyt wrote:
>>>>
>>>>
>>>> On Tue, 21 Sep 2010, Adriaan van Os wrote:
>>>>
>>>>> I am looking for a way to obtain the class hierarchy of a program in
>>>>> MacPas mode (where there are no published properties). TObject has
>>>>> ClassParent, so a list of Class types would be sufficient, I think. I
>>>>> can't find however a routine in the RTL to obtain such a list.
>>>>
>>>> There is no such routine in the RTL, to my knowledge.
>>>
>>> Can I add it ? I guess a low-level pointer to a list of VMT's would be
>>> sufficient to implement it ?
>>
>> Problem is: it breaks smartlinking.

Yes, I understand that. I looked at the assembly generated for a simple test program and there are
separate al_globals entries for each vmt and separate al_rtti entries for the vmt rtti. I asssume
the very reason for the separate entries is smart linking.

Hm, I guess I can look at the data section of the executable but it would be highly dependant of
the executable binary format.

Is it possible to produce a separate data section/entry that refers to all al_globals and/or all
al_rtti entries without breaking smart-linking ?

> Why? It's just walking the ParentClass hierarchy of a given class; which is
> what RTTI does anyway ?

And the other way round (from a class to each subclass).

Regards,

Adriaan van Os

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: Obtain Class hierarchy (in MacPas mode)

Adriaan van Os-2
In reply to this post by Sven Barth-2
Sven Barth wrote:
> If I understood it right he wants the complete hierachy (or the complete
> class tree) which is used in a program. So the opposite of "ClassParent".

Right.

Regards,

Adriaan van Os

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: Obtain Class hierarchy (in MacPas mode)

Michael Van Canneyt
In reply to this post by Adriaan van Os-2


On Tue, 21 Sep 2010, Adriaan van Os wrote:

> Michael Van Canneyt wrote:
>>
>> On Tue, 21 Sep 2010, Florian Klaempfl wrote:
>>
>>> Am 21.09.2010 13:42, schrieb Adriaan van Os:
>>>> Michael Van Canneyt wrote:
>>>>>
>>>>>
>>>>> On Tue, 21 Sep 2010, Adriaan van Os wrote:
>>>>>
>>>>>> I am looking for a way to obtain the class hierarchy of a program in
>>>>>> MacPas mode (where there are no published properties). TObject has
>>>>>> ClassParent, so a list of Class types would be sufficient, I think. I
>>>>>> can't find however a routine in the RTL to obtain such a list.
>>>>>
>>>>> There is no such routine in the RTL, to my knowledge.
>>>>
>>>> Can I add it ? I guess a low-level pointer to a list of VMT's would be
>>>> sufficient to implement it ?
>>>
>>> Problem is: it breaks smartlinking.
>
> Yes, I understand that. I looked at the assembly generated for a simple test
> program and there are separate al_globals entries for each vmt and separate
> al_rtti entries for the vmt rtti. I asssume the very reason for the separate
> entries is smart linking.
>
> Hm, I guess I can look at the data section of the executable but it would be
> highly dependant of the executable binary format.
>
> Is it possible to produce a separate data section/entry that refers to all
> al_globals and/or all al_rtti entries without breaking smart-linking ?

Maybe when doing whole-program optimization as implemented by Jonas.
I guess the WPO could be extended to generate the tree you want.

But under 'normal' compilation, I don't think it is possible to do as you
ask without breaking the smartlinking stuff; the tree would of necessity
contain all declared classes of all loaded units.

Michael.
_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: Obtain Class hierarchy (in MacPas mode)

Adriaan van Os-2
Michael Van Canneyt wrote:

>
> On Tue, 21 Sep 2010, Adriaan van Os wrote:
>
>> Michael Van Canneyt wrote:
>>>
>>> On Tue, 21 Sep 2010, Florian Klaempfl wrote:
>>>
>>>> Am 21.09.2010 13:42, schrieb Adriaan van Os:
>>>>> Michael Van Canneyt wrote:
>>>>>>
>>>>>>
>>>>>> On Tue, 21 Sep 2010, Adriaan van Os wrote:
>>>>>>
>>>>>>> I am looking for a way to obtain the class hierarchy of a program in
>>>>>>> MacPas mode (where there are no published properties). TObject has
>>>>>>> ClassParent, so a list of Class types would be sufficient, I
>>>>>>> think. I
>>>>>>> can't find however a routine in the RTL to obtain such a list.
>>>>>>
>>>>>> There is no such routine in the RTL, to my knowledge.
>>>>>
>>>>> Can I add it ? I guess a low-level pointer to a list of VMT's would be
>>>>> sufficient to implement it ?
>>>>
>>>> Problem is: it breaks smartlinking.
>>
>> Yes, I understand that. I looked at the assembly generated for a
>> simple test program and there are separate al_globals entries for each
>> vmt and separate al_rtti entries for the vmt rtti. I asssume the very
>> reason for the separate entries is smart linking.
>>
>> Hm, I guess I can look at the data section of the executable but it
>> would be highly dependant of the executable binary format.
>>
>> Is it possible to produce a separate data section/entry that refers to
>> all al_globals and/or all al_rtti entries without breaking
>> smart-linking ?
>
> Maybe when doing whole-program optimization as implemented by Jonas.
> I guess the WPO could be extended to generate the tree you want.
>
> But under 'normal' compilation, I don't think it is possible to do as you
> ask without breaking the smartlinking stuff; the tree would of necessity
> contain all declared classes of all loaded units.

I implemented it now by looking at the Mach-O symbol table. It works like a charm (only classes
that are actually used are listed and it doesn't break smart-linking).

If someone feels like implementing this for other binary formats (with the purpose of adding it to
the rtl), I can donate the Mach-O source code under the usual license.

Regards,

Adriaan van Os

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal