On 21 Jul 2007, at 12:42, Bram Kuijvenhoven wrote:

If the vmts are stored in memory in depth-first order [of the class hierarchy], then an O(1) implementation could be made by adding only one field to the vmt: vmtNextSibling; then you'd simply get something like

InheritsFrom := (AClass <= Self) and (Self < PClass(pointer (AClass) + vmtNextSibling)^);

(In this implementation vmtNextSibling should not be nil for those classes that have no NextSibling in the hierarchy, but have a value larger than all vmts. An alternative is to have an vmtLastChild, which is always properly defined; it points to the last one of: itself, its children, its grandchildren, etc.)

I don't think this can work, since a class hierarchy is a tree and not a list. So in case of

TObject
|
+-- TA
|
+-- TB

How would you linearise that in memory? As TObject - TA - TB ?

In that case, TB inherirtsFrom TA would be (afaics)

(TA <= TB) and (TB < TA+(inf))

This would return true, while it's not true. You cannot solve this by duplicating vmt's for different inheritance paths (in fact, duplicating vmt's would complicate the is/as problems a lot).

Are vmts stored in depth first order?

They are probably stored per unit in the order they are declared (not sure about forward-defined classes).

If not, an alternative is to have another vmt field with a number that indicates its index in depth-first order of the class hierarchy.

You would still have to determine that two classes are part of the same hierarchy (same branch of the inheritance tree). I also don't know whether changing the vmt layout is feasible at this point.


Jonas
_______________________________________________
fpc-devel maillist  -  [email protected]
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to