diff --git a/src/dparse/rollback_allocator.d b/src/dparse/rollback_allocator.d index d2404d38..74fdd4f5 100644 --- a/src/dparse/rollback_allocator.d +++ b/src/dparse/rollback_allocator.d @@ -1,5 +1,7 @@ module dparse.rollback_allocator; +import core.memory : GC; + //version = debug_rollback_allocator; /** @@ -147,6 +149,7 @@ private: ubyte[] m = cast(ubyte[]) AlignedMallocator.instance.alignedAllocate(max(size + Node.sizeof, ALLOC_SIZE), memoryAlignment); if (m is null) onOutOfMemoryError(); + GC.addRange(m.ptr, m.length); version (debug_rollback_allocator) m[] = 0; @@ -164,6 +167,7 @@ private: ubyte[] mem = (cast(ubyte*) first)[0 .. Node.sizeof + first.mem.length]; version (debug_rollback_allocator) mem[] = 0; + GC.removeRange(mem.ptr); AlignedMallocator.instance.deallocate(mem); first = next; } diff --git a/src/dparse/stack_buffer.d b/src/dparse/stack_buffer.d index ae8475d7..c1e357ce 100644 --- a/src/dparse/stack_buffer.d +++ b/src/dparse/stack_buffer.d @@ -1,5 +1,7 @@ module dparse.stack_buffer; +import core.memory : GC; + import std.traits; //version = debug_stack_allocator; @@ -20,6 +22,10 @@ struct StackBuffer static if (is(T == class)) static assert(T.sizeof == size_t.sizeof); + static if (hasIndirections!T) + while (_length % size_t.sizeof != 0) + put(ubyte(1)); + if (arr.ptr != stackSpace.ptr) { if (_length + T.sizeof > arr.length) @@ -27,7 +33,10 @@ struct StackBuffer size_t newLength = arr.length << 1; while (_length + T.sizeof > newLength) newLength <<= 1; + auto oldPtr = arr.ptr; Mallocator.instance.reallocate(arr, newLength); + GC.removeRange(oldPtr); + GC.addRange(arr.ptr, arr.length); version (debug_stack_allocator) (cast(ubyte[]) arr)[_length .. $] = 0; } @@ -38,6 +47,7 @@ struct StackBuffer while (_length + T.sizeof > newLength) newLength <<= 1; arr = Mallocator.instance.allocate(newLength); + GC.addRange(arr.ptr, arr.length); version (debug_stack_allocator) (cast(ubyte[]) arr)[] = 0; arr[0 .. stackSpace.length] = stackSpace[]; @@ -54,7 +64,10 @@ struct StackBuffer version (debug_stack_allocator) (cast(ubyte[]) arr)[] = 0; if (arr.ptr !is stackSpace.ptr) + { + GC.removeRange(arr.ptr); Mallocator.instance.deallocate(arr); + } } void[] opSlice()