Dicebot via Digitalmars-d
2014-09-30 13:42:12 UTC
There is one issue I have encountered during CDGC porting I may
need advice with.
Consider this simple snippet:
```
import core.memory;
void main()
{
ubyte[] result;
result.length = 4096;
assert(GC.sizeOf(result.ptr) > 0);
}
``
Assertion passes with D1/Tango runtime but fails with current D2
runtime. This happens because `result.ptr` is not actually a
pointer returned by gc_qalloc from array reallocation, but
interior pointer 16 bytes from the start of that block. Druntime
stores some metadata (length/capacity I presume) in the very
beginning.
As a result GC.sizeOf(array.ptr) results in 0 (being an interior
pointer).
Interesting side effect is that this code:
```
void main()
{
ubyte[] result;
result.length = 4096;
GC.free(result.ptr);
}
```
..does not actually free anything for the very same reason
(result.ptr is interior pointer), it just silently succeeds doing
nothing.
Is such behaviour intended?
need advice with.
Consider this simple snippet:
```
import core.memory;
void main()
{
ubyte[] result;
result.length = 4096;
assert(GC.sizeOf(result.ptr) > 0);
}
``
Assertion passes with D1/Tango runtime but fails with current D2
runtime. This happens because `result.ptr` is not actually a
pointer returned by gc_qalloc from array reallocation, but
interior pointer 16 bytes from the start of that block. Druntime
stores some metadata (length/capacity I presume) in the very
beginning.
As a result GC.sizeOf(array.ptr) results in 0 (being an interior
pointer).
Interesting side effect is that this code:
```
void main()
{
ubyte[] result;
result.length = 4096;
GC.free(result.ptr);
}
```
..does not actually free anything for the very same reason
(result.ptr is interior pointer), it just silently succeeds doing
nothing.
Is such behaviour intended?