www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 21442] New: Calling AA.remove from a destructor might lead to


          Issue ID: 21442
           Summary: Calling AA.remove from a destructor might lead to
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: critical
          Priority: P1
         Component: druntime
          Assignee: nobody puremagic.com
          Reporter: pro.mathias.lang gmail.com

Calling `AA.remove` might shrink the AA, and shrinking an AA allocates.
Hence, calling `AA.remove` from a GC-run destructor is not possible as it could
lead to an `InvalidMemoryError` being thrown. Example:

import core.memory;

size_t[size_t] glob;

class Foo
    size_t count;

    this (size_t entries)  safe
        this.count = entries;
        foreach (idx; 0 .. entries)
            glob[idx] = idx;

    ~this ()  safe
        foreach (idx; 0 .. this.count)

void main ()
    GC.collect(); // Needs to happen from a GC collection

void bar ()  safe
    Foo f = new Foo(16);

This triggers:
core.exception.InvalidMemoryOperationError src/core/exception.d(647): Invalid
memory operation

It's absolutely ridiculous that one can't call `AA.remove` in a destructor
(provided the AA is known to be reachable by other means). For reference,
vibe.d (eventcore actually) does this.

Dec 01 2020