On Friday, 24 April 2015 at 15:05:15 UTC, anonymous wrote:
GC.malloc is marked pure. But it isn't, is it?

This should hold for a pure function:
    assert(f(x) == f(x));
This fails with GC.malloc, of course.

Or consider this:
    auto v = f(x);
    auto w = f(x);
When f is pure, a compiler should be free to reuse the value of v for w. That's no good with GC.malloc, obviously.

A solution is to fake purity through

extern(C) pure nothrow @system @nogc
{
    void* malloc(size_t size);
    void* realloc(void* ptr, size_t size);
    void free(void* ptr);
}

Pay attention to the use of malloc() though.

Note that this makes malloc() strongly pure (its single parameters is passed by value). Therefore successive calls to malloc() with the same argument will be optimized away and all those calls will return the same values as the first call. When used in allocators this shouldn't be a problem, though.

Used successfully at

https://github.com/nordlow/justd/blob/master/packedarray.d#L6

Reply via email to