Let malloc infer its attributes

Malloc should not force '@safe' or '@nogc' on constructors which are not.
For example, TaskPool's ctor is not '@nogc' but was assumed as such
thanks to the delegate cast happening in malloc.
Likewise, the ctor or the arguments might not be '@safe',
or any other attributes, but they were be mistakenly marked as such.
This commit is contained in:
Geod24 2020-01-13 17:01:04 +09:00
parent 3fd907edd4
commit e7688361ba

View file

@ -18,20 +18,18 @@ void print(ARGS...)(string str, ARGS args)
} }
T mallocT(T, ARGS...)(ARGS args) T mallocT(T, ARGS...)(ARGS args)
@trusted @nogc { {
import core.stdc.stdlib : malloc; import core.stdc.stdlib : malloc;
import std.conv : emplace; import std.conv : emplace;
enum size = __traits(classInstanceSize, T); T ret = () @trusted {
auto ret = cast(T)malloc(size); enum size = __traits(classInstanceSize, T);
static if (hasIndirections!T) T r = cast(T)malloc(size);
GC.addRange(cast(void*)ret, __traits(classInstanceSize, T)); static if (hasIndirections!T)
scope doit = { emplace!T((cast(void*)ret)[0 .. size], args); }; GC.addRange(cast(void*)r, size);
static if (__traits(compiles, () nothrow { typeof(doit).init(); })) // NOTE: doing the typeof thing here, because LDC 1.7.0 otherwise thinks doit gets escaped here return r;
(cast(void delegate() @nogc nothrow)doit)(); }();
else return emplace!T(ret, args);
(cast(void delegate() @nogc)doit)();
return ret;
} }
void freeT(T)(ref T inst) @nogc void freeT(T)(ref T inst) @nogc