On 2013-09-25 20:27, Johannes Pfau wrote:

Having the compiler rewrite

"new(MallocAllocator) MyClass(a,b,c)"
to
"void[] __buf = MallocAllocator.it.allocate(MyClass.instancesize);"
"__construct!MyClass(__buf, a, b, c);" //Has to handle context ptr

seems like a good solution. It probably has to support both allocator
types(for allocators without state) and allocator instances.

Here's an alternative. The compiler will lower:

new MyClass(a, b, c);

To:

auto __buf = _d_tl_new(MyClass.instancesize);

And:

new shared MyClass(a, b, c);

auto __buf = _d_global_new(MyClass.instancesize);

Then construct the class as above. To change the alloctor one just sets the rt.allocator.allocator variable, most likely via some function.



extern (C) void[] _d_tl_new (size_t size)
{
    return _d_new(size, rt.allocator.allocator);
}

extern (C) void[] _d_global_new (size_t size)
{
    return _d_new(size, rt.allocator.globalAllocator);
}

extern (C) void[] _d_new (size_t size, Allocator allocator)
{
    if (memory = allocator.allocate(size))
        return memory;

    onOutOfMemoryError();
}

--
/Jacob Carlborg

Reply via email to