[Issue 9704] Destructor not called on function calls if postblit throws

d-bugmail at puremagic.com d-bugmail at puremagic.com
Tue Mar 12 13:13:43 PDT 2013


http://d.puremagic.com/issues/show_bug.cgi?id=9704


Maxim Fomin <maxim at maxim-fomin.ru> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |maxim at maxim-fomin.ru


--- Comment #2 from Maxim Fomin <maxim at maxim-fomin.ru> 2013-03-12 13:13:41 PDT ---
(In reply to comment #0)
> The problem is that the destructors are currently called in the callee but the
> postblits in the caller. If an exception is thrown in between those calls, the
> destructor can't be called.

To be more precise, it happens during evaluation of function argument which
follows some struct argument and throws exception.

extern(C) int printf(const char* fmt, ...);

struct A
{
    this(this) { printf("A:this(this)\n");}
    ~this() { printf("A:~this\n"); }
    uint data;
}

int foo() { throw new Exception(""); }


void func(A a, int i) {}

void main()
{
    A a;
    func(a, foo());
}

Here should be two destructors: for "a" and " __cpcttmpXXX" structs. And
calling dtor is unavoidable since postblit may deep copy some memory.

> A possible solution is to move the destructor to the caller. But in this case
> the parameter (the copy) must be passed by invisible reference so that the
> destructor actually sees the updated value after the callee returns.
> 
> (Note that it might be useful to make an exception for non-PODs without
> destructors here. Those shouldn't be affected by this issue and could be
> treated like PODs when being passed to a function as an optimization.)

Alternatively a copy operation can be moved into callee or D runtime can be
boosted to cope with such problem.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the issue.


More information about the D.gnu mailing list