Fix InterfaceProxy to not explicitly destroy contained class instances.

This lead to double-destruction in case an InterfaceProxy was copied.
This commit is contained in:
Sönke Ludwig 2016-12-10 14:21:57 +01:00
parent bf2edc7fb2
commit 09d9ea47bf

View file

@ -98,6 +98,7 @@ struct InterfaceProxy(I) if (is(I == interface)) {
if (m_intf) { if (m_intf) {
m_intf._destroy(m_value); m_intf._destroy(m_value);
m_intf = null; m_intf = null;
() @trusted { (cast(ubyte[])m_value)[] = 0; } ();
} }
} }
@ -210,26 +211,31 @@ struct InterfaceProxy(I) if (is(I == interface)) {
return impl; return impl;
} }
void _destroy(void[] stor) override void _destroy(void[] stor)
@trusted nothrow { @trusted nothrow {
static if (is(O == struct)) {
try destroy(_extract(stor)); try destroy(_extract(stor));
catch (Exception e) assert(false, "Destructor has thrown: "~e.msg); catch (Exception e) assert(false, "Destructor has thrown: "~e.msg);
} }
}
void _postblit(void[] stor) override void _postblit(void[] stor)
@trusted nothrow { @trusted nothrow {
static if (is(O == struct)) {
try typeid(O).postblit(stor.ptr); try typeid(O).postblit(stor.ptr);
catch (Exception e) assert(false, "Postblit contructor has thrown: "~e.msg); catch (Exception e) assert(false, "Postblit contructor has thrown: "~e.msg);
} }
}
TypeInfo _typeInfo() override TypeInfo _typeInfo()
@safe nothrow { @safe nothrow {
return typeid(O); return typeid(O);
} }
static ref inout(O) _extract(inout(void)[] stor) static ref inout(O) _extract(inout(void)[] stor)
@trusted nothrow pure @nogc { @trusted nothrow pure @nogc {
return (cast(inout(O)[])stor[0 .. O.sizeof])[0]; if (stor.length < O.sizeof) assert(false);
return *cast(inout(O)*)stor.ptr;
} }
mixin methodDefs!0; mixin methodDefs!0;