[Issue 5380] Subtyping with "alias this" doesn't mix with regular inheritance

d-bugmail at puremagic.com d-bugmail at puremagic.com
Wed Nov 28 07:16:17 PST 2012


http://d.puremagic.com/issues/show_bug.cgi?id=5380



--- Comment #2 from Max Samukha <samukha at voliacable.com> 2012-11-28 07:16:16 PST ---
This one is blocking a design for QtD (and potentially other C++ projects using
single inheritance with interfaces) that should allow at the cost of relatively
small constant overhead to avoid:
1) unnecessary and undesirable allocations or lookups of wrapper objects for
object pointers returned by the C++ code.
2) bloating the library with virtual call dispatchers for objects that are
never inherited in D code.

Very roughly:

// Instead of classes, fat pointers are generated for C++ classes:
struct QObject 
{
    bool isDWrapper;
    void* pointerToCppObject;

    // a virtual
    void foo() {
        if (isDWrapper)
            // dispatch to the D override
        else
            // make static call to C++        
    }

    enum dispatchers = q{
        void foo() {
            // dispatch to C++
        }
    }; 
}

// Library
class Inherit(T)
{
    T ref_;
    alias ref_ this;    
    mixin(T.dispatchers);

    this() { isDWrapper = true; }
}

// User
class MyObject : Inherit!QObject
{
    override void foo()
    {
        ...
        super.foo();
        ...
    }
}

// Some function taking a QObject
void bar(QObject obj)
{
    obj.foo();
}

void main()
{
    // Here is the problem: MyObject is not a subtype of QObject 
    bar(new MyObject);
}

The Inherit template subtypes the struct and provides the implementation of the
overrides dispatching calls to the C++ side. If the user does not inherit from
a Qt class (which will be true for most classes), the overrides are never
compiled into the library. When receiving an object from the C++ side, we do
not need to allocated a wrapper objects, just initialize the fat pointer with
the relevant information.

I am not sure whether the craziness of the above is going to make it into the
project but a prototype I've created does work. 

Now that we can link to 64-bit C++ libraries directly on windows, we *maybe*
could try to use (and improve) extern(C++) interfaces in order to avoid the
complications. I am still not sure what to do with 32-bit Windows and would
rather give a try to the design described.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list