On Tue, 15 May 2012 23:54:04 -0400, Mehrdad <[email protected]> wrote:

I'm writing some (low-level) code with no exception handling available whatsoever... either the code runs, or it doesn't.

Is there any way for me to use scope(exit) (or perhaps a destructor, like RAII) to mean, "Execute this block of code for me when the block is exited, will ya?", *without* introducing dependencies on exception handling?

struct AddExitBlock
{
   private void delegate() dg;
   this(scope void delegate() dg) {this.dg = dg;}
   ~this() {dg();}
}

void main()
{
   int x = 0;
   {
      x = 1;
immutable _aeb = AddExitBlock({x = 0;}); // annoying to have to assign it to a temporary variable, but whatever.
      assert(x == 1);
   }

   assert(x == 0);
}


Also seems to work with exceptions (if you need them):

void foo(ref int x)
{
    x = 1;
    immutable aeb1 = AddExitBlock({x = 0;});
    throw new Exception("testing!");
}

void main()
{
    int x = 0;
    try
    {
        foo(x);
    }
    catch(Exception e)
    {
    }

    assert(x == 0);
}

I don't see exception handling in the generated code (at least I don't see the _d_local_unwind2), I wonder a) if this is more efficient than scope(exit), and b) if so, why can't the compiler do this automatically?

-Steve

Reply via email to