Thread overview
[Issue 915] New: dmd generate bad form return(retn 4) for invariant func
Feb 01, 2007
d-bugmail
Feb 01, 2007
d-bugmail
Feb 12, 2007
d-bugmail
February 01, 2007
http://d.puremagic.com/issues/show_bug.cgi?id=915

           Summary: dmd generate bad form return(retn 4) for invariant func
           Product: D
           Version: 1.004
          Platform: PC
        OS/Version: Windows
            Status: NEW
          Severity: critical
          Priority: P1
         Component: DMD
        AssignedTo: bugzilla@digitalmars.com
        ReportedBy: davidl@126.com


import std.stdio;
interface IUnknown{
        extern(Windows):
        void func();
}
class ComObject :IUnknown
{
extern (Windows):
        void func()
        {writefln(`comobject`);
        }
}
interface IDataObject: IUnknown
{
        extern(Windows):
        void method();
}
package class invarianttest:ComObject, IDataObject
{
        invariant
        {
                writefln(`hello invariant`);
        }

extern (Windows):
        override void func()
        {
        int esp;
        asm{
                mov esp,ESP;
        }
        printf("\n%d",esp);
        printf(`func`);
        }
        void method()
        {
                writefln(`method`);
        }
}
void main()
{
        auto inst= new invarianttest;
        int esp;
        asm{
                mov esp,ESP;
        }
        inst.func();
        inst.method();
        writefln("\n%d",esp);
        asm{
                mov esp,ESP;
        }
        writefln("\n%d",esp);
}

we get runtime AV when the we return from our own invariant to _d_invariant the problem is dmd generate the retn 4 for the return of our own invariant func


-- 

February 01, 2007
http://d.puremagic.com/issues/show_bug.cgi?id=915





------- Comment #1 from davidl@126.com  2007-02-01 08:54 -------
a simpler case, but we don't see any exception get caught.
de-comment the ret , we can see the code work correctly.
though i find in some situation , the case actually in a ctor
before calling my invariant , dmd first push some thing on the stack
and the windows directive makes it seems right( that's quite weird)
 and the next time calling my invariant in my case, it's
from _d_invariant, the situation is different , _d_invariant need
the invariant func retn directly instead of "retn 4".

import std.stdio;
package class invarianttest
{
        extern(D):
        this(Object test,int i)
        {
                myobject = test;
                writefln(`class tester`,i);
        }
        extern(Windows):
        invariant
        {
                writefln(`hello invariant`);
                asm
                {
//                      ret;
                }
        }

extern (Windows):
        void func()
        {
                printf(`func`);
        }
        void method()
        {
                writefln(`method`);
        }
        extern(D):
        private:
        Object myobject;
}
void main()
{
        Object t=new Object;
        auto inst= new invarianttest(t,1);
        inst.func();
        inst.method();
}


-- 

February 12, 2007
http://d.puremagic.com/issues/show_bug.cgi?id=915


bugzilla@digitalmars.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|                            |FIXED




------- Comment #2 from bugzilla@digitalmars.com  2007-02-12 03:45 -------
Fixed DMD 1.005


--