On 11/11/2012 07:12 AM, Max TenEyck Woodbury wrote:
On 11/11/2012 01:01 AM, Nikolay Sivov wrote:
On 11/11/2012 05:00, Max TenEyck Woodbury wrote:
I mentioned this a few days ago. It would have helped if you had raised this point then.
As it stands, it is simply a way to adding data members to an aggregate with an interface.
Data members to an aggregate? What are you talking about and what it has to do with interface definition?
An aggregate is a collection of information, like a class, struct or union.
Your mixing up terminology.
Some aggregates include 'interface's, a COM, OLE or RPC thingy. The interface can have only methods defined, but those methods might want access to some additional data. To get to that data, the method now has to build a pointer to the containing aggregate and reference the data through that pointer. This introduces complications to the code since the data may not be in same place in the aggregate in each instance where the interface is used. You need a slightly different code sequence for each different place the method is needed. However, the source code will be virtually identical for each instance.
This patch allows those aggregate data members associated with the interface, which are not technically part of the interface, to be placed in a fixed relation to the interfaces Vtbl pointer. (Practically the Vtbl pointer is the interface.) By establishing such a relationship, the need to convert from the pointer to the interface (specifically to its Vtbl pointer) to a pointer to its containing aggregate in order to get to the relevant data is removed.
Please check how a C compiler is laying out structs in memory. In both cases the data is at a fixed offset (calculated at compile time) in relation to the interface.
Now, technically, the associated data is not part of the interface. It is part of the aggregate containing and implementing the interface. Moving the declaration from the aggregate to the end of the struc for the interface is a hack that lets simpler and more general code to be generated.
So, it's a hack, that you only use if you want to, to speed up execution and simplify maintenance.
It is a hack that breaks the ABI (sizeof(interface) == sizeof(void*)), doesn't improves the generated code, doesn't simplify maintenance at all, quite the contrary. This sounds more like trolling than a serious attempt to improve Wine.
bye michael