Bug? NVI functions can't call normal interface functions?
Steven Schveighoffer
schveiguy at yahoo.com
Tue Mar 19 14:51:52 PDT 2013
On Sun, 17 Mar 2013 09:59:03 -0400, Maxim Fomin <maxim at maxim-fomin.ru>
wrote:
> Actually it was http://d.puremagic.com/issues/show_bug.cgi?id=4589
I don't think this is the same problem.
I modified the program a bit:
import core.stdc.stdio;
interface Timer
{
final int run() { printf("Timer.run(), this=%x\n", cast(void*)this);
fun(); return 1;}
int fun();
}
interface Application
{
final int run() { printf("Application.run(), this=%x\n", cast(void
*)this); fun(); return 2; };
int fun();
}
class TimedApp : Timer, Application
{
int fun()
{
printf("TimedApp.fun(), this=%x\n", cast(void*)this);
return 0;
}
}
void main()
{
auto app = new TimedApp;
(cast(Application)app).run();
(cast(Timer)app).run();
app.Application.run();
app.Timer.run();
}
New output:
Application.run(), this=10007ff8
TimedApp.fun(), this=10007fe0
Timer.run(), this=10007ff0
TimedApp.fun(), this=10007fe0
Application.run(), this=10007fe0
Timer.run(), this=10007fe0
Note that Application.run() is given the interface pointer 10007ff8,
whereas the *true* object pointer is 10007fe0. This is normal and
expected.
However, in the *last* call to Application.run (and Timer.run), it's given
the pointer 10007fe0, the true object pointer. This gives it the
completely WRONG vtable to use for calling fun. I think this is different
than the bug I posted. It may be related, I don't know.
If this bug is not already reported, it should be.
-Steve
More information about the Digitalmars-d
mailing list