On 2009-12-18 17:07:57 -0800, bearophile <bearophileh...@lycos.com> said:

Yigal Chripun:

.Net generics for example work by creating an instantiation for each
value type (same as c++ templates) and one instantiation for all
reference types since at the binary level all reference types are simply
addresses. C++ can't do this since it has no separation between
"structs" and "classes".
there is no casting involved since the full type info is stored.
so a Foo<Bar> will be typed as Foo<Bar> at the binary level as well and
you can use APIs to query this at runtime.

In D structs and classes are distinct enough, but they currently produce duplicated templated code, this may be fixed:

void foo(T)(T o) {
    printf("foo: %d\n", o.y);
}

class A { int x = 1; }
class B : A { int y = 2; }
class C : A { int y = 3; }

void main() {
    B b = new B();
    C c = new C();
    foo(b);
    foo(c);
}

/*
DMD1:

_D4temp17__T3fooTC4temp1BZ3fooFC4temp1BZv   comdat
        push    EAX
        mov ECX,offset FLAT:_D4temp1C6__vtblZ[018h]
        push    dword ptr 0Ch[EAX]
        push    ECX
        call    near ptr _printf
        add ESP,8
        pop EAX
        ret

_D4temp17__T3fooTC4temp1CZ3fooFC4temp1CZv   comdat
        push    EAX
        mov ECX,offset FLAT:_D4temp1C6__vtblZ[018h]
        push    dword ptr 0Ch[EAX]
        push    ECX
        call    near ptr _printf
        add ESP,8
        pop EAX
        ret


LDC:

_D13testtemplates27__T3fooTC13testtemplates1BZ3fooFC13testtemplates1BZv:
    subl    $12, %esp
    movl    12(%eax), %eax
    movl    %eax, 4(%esp)
    movl    $.str3, (%esp)
    call    printf
    addl    $12, %esp
    ret

_D13testtemplates27__T3fooTC13testtemplates1CZ3fooFC13testtemplates1CZv:
    subl    $12, %esp
    movl    12(%eax), %eax
    movl    %eax, 4(%esp)
    movl    $.str3, (%esp)
    call    printf
    addl    $12, %esp
    ret
*/

Bye,
bearophile

This isn't a bug. This is how it is template code is supposed to work. However, there does seem to be one problem in the output you're giving.

LDC should not be producing different name mangling than DMD! This is part of the D ABI last I checked, so as to avoid all the problems C++ has associated with libraries from different compilers not playing nice.

-S



Reply via email to