Pure dynamic casts?
bearophile
bearophileHUGS at lycos.com
Mon Sep 21 17:13:55 PDT 2009
I don't know much about this topic, but this post is mostly in question form.
Are dynamic casts pure? I have compiled the following small program with LDC:
version (Tango)
import tango.stdc.stdio: printf;
else version (D1)
import std.c.stdio: printf;
else
import core.stdc.stdio: printf;
class A { int a; }
void main() {
Object o = new A();
A a = cast(A)o;
a.a = 10;
printf("%d %d\n", a.a, cast(A)o);
}
LDC based on DMD v1.045 and llvm 2.6 (Thu Sep 10 23:50:27 2009)
ldc -O5 -release -inline -output-s dyncast_test.d
The asm it produces shows two calls to _d_dynamic_cast:
_Dmain:
pushl %esi
subl $16, %esp
movl $_D5cast51A7__ClassZ, (%esp)
call _d_allocclass
movl %eax, %esi
movl $_D5cast51A6__vtblZ, (%esi)
movl $0, 4(%esi)
movl $0, 8(%esi)
movl %esi, (%esp)
movl $_D5cast51A7__ClassZ, 4(%esp)
call _d_dynamic_cast
movl $10, 8(%eax)
movl %esi, (%esp)
movl $_D5cast51A7__ClassZ, 4(%esp)
call _d_dynamic_cast
movl %eax, 8(%esp)
movl $10, 4(%esp)
movl $.str1, (%esp)
call printf
xorl %eax, %eax
addl $16, %esp
popl %esi
ret $8
If the dynamic cast are pure the compiler can call it only once here (LLVM already has two functions attributes for pure functions).
(Related: can the code that performs the dynamic casts be in some situations inlined by LDC?)
Bye,
bearophile
More information about the Digitalmars-d
mailing list