On Wed, 29 Apr 2009 06:09:49 +0400, Daniel Keep <[email protected]> 
wrote:



Denis Koroskin wrote:
...

Scope stack-allocating is an optimisation.  It doesn't guarantee it
because that it's the point of scope.

Given that you're hung-up about stack allocation, I can't imagine how
you'd implement scope as a template.  Hell, I can't imagine how you'd
implement Scope as a template for *any* of its behaviours.

class Foo
{
    Scope!(Bar) _bar;
}

How do you guarantee deterministic destruction when it's inside a
non-deterministic construct?

  -- Daniel

Is that a challenge?

import std.stdio;

class Foo
{       
   this(int i, int j, int k) {
       writeln("Foo.this(): ", i, j, k);
   }
        
   ~this() {
       writeln("Foo.~this()");
   }
}

struct Scope(T)
{
   this(Args...)(Args args)
   {
       _data[] = T.classinfo.init[]; // shouldn't be needed
       __get.__ctor(args);
   }
        
   ~this()
   {
       __get.__dtor();
   }

   alias __get this;
        
   T __get()
   {
       return cast(T)_data.ptr;
   }

   static assert(is(T == class));
private byte[__traits(classInstanceSize, T)] _data;
   //private byte[__traits(classInstanceSize, T)] _data = T.classinfo.init; // 
bug: doesn't work
}

void main()
{
   auto foo = Scope!(Foo)(1, 2, 3);
}

One more bug-o-feature is that Scope.ctor is not called when args set is empty:

auto foo = Scope!(Foo)(); // no Scope.__ctor is called and thus underlying Foo instance 
is left uninitialized. I never understood a rationale behind this "feature". I 
believe it's a hole.

Reply via email to