'this' in base class out contract

bearophile bearophileHUGS at lycos.com
Sat Jun 4 04:25:09 PDT 2011


Michael Shulman:

> Why does the following code fail the assertion?

I don't know the answer yet, but I suggest to generally compile your D code with the -w compiler switch.

I have modified the code, the __gshared and the assert removal are to simplify the asm:

import std.c.stdio: printf;

class Klass1 {
    void foo()
        out {
            printf("Klass1.this: %x\n", cast(void*)this);
            printf("Klass1.stored: %x\n", cast(void*)stored);
            //assert(stored is this);
        } body {}
}

__gshared Klass1 stored;

class Klass2 : Klass1 {
    override void foo() {
        printf("Klass2.this: %x\n", cast(void*)this);
        stored = this;
    }
}

void main () {
    Klass2 x = new Klass2();
    printf("x: %x\n", cast(void*)x);
    x.foo();
}

Output:
x: 14e2fd0
Klass2.this: 14e2fd0
Klass1.this: 41d1b0
Klass1.stored: 14e2fd0

I have compiled it with (dmd 2.053):
dmd -O


The asm:

_D4test6Klass13fooMFZv	comdat
L0:		push	EBP
		mov	EBP,ESP
		sub	ESP,018h
		mov	-018h[EBP],EAX
		call	near ptr _D9invariant12_d_invariantFC6ObjectZv
		lea	EAX,-018h[EBP]
		call	near ptr _D4test6Klass13fooMFZv8__ensureMFZv
		mov	ESP,EBP
		pop	EBP
		ret

_D4test6Klass13fooMFZv8__ensureMFZv	comdat
L0:		push	EAX
		mov	ECX,offset FLAT:_DATA
		push	dword ptr [EAX]
		push	ECX
		call	near ptr _printf
		mov	EAX,offset FLAT:_DATA[014h]
		push	dword ptr _D4test6storedC4test6Klass1
		push	EAX
		call	near ptr _printf
		add	ESP,010h
		pop	EAX
		ret

_D4test6Klass23fooMFZv	comdat
L0:		push	EBP
		mov	EBP,ESP
		sub	ESP,014h
		push	EBX
		mov	EBX,EAX
		call	near ptr _D9invariant12_d_invariantFC6ObjectZv
		mov	EAX,offset FLAT:_D4test6Klass16__vtblZ[01Ch]
		push	EBX
		push	EAX
		call	near ptr _printf
		mov	EAX,EBX
		mov	_D4test6storedC4test6Klass1,EBX
		call	near ptr _D4test6Klass13fooMFZv8__ensureMFZv
		add	ESP,8
		pop	EBX
		mov	ESP,EBP
		pop	EBP
		ret

__Dmain	comdat
L0:		push	EBX
		mov	EAX,offset FLAT:_D4test6Klass27__ClassZ
		push	EAX
		call	near ptr __d_newclass
		add	ESP,4
		mov	ECX,offset FLAT:_D4test6Klass26__vtblZ[01Ch]
		push	EAX
		mov	EBX,EAX
		push	ECX
		call	near ptr _printf
		mov	EDX,[EBX]
		mov	EAX,EBX
		call	dword ptr 018h[EDX]
		add	ESP,8
		xor	EAX,EAX
		pop	EBX
		ret

Bye,
bearophile


More information about the Digitalmars-d-learn mailing list