scope(~this)
Inquie via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Tue Mar 14 07:35:11 PDT 2017
On Tuesday, 14 March 2017 at 05:33:28 UTC, thedeemon wrote:
> On Monday, 13 March 2017 at 14:28:01 UTC, Inquie wrote:
>> On Monday, 13 March 2017 at 05:18:18 UTC, Nicholas Wilson
>> wrote:
>>> On Sunday, 12 March 2017 at 21:38:44 UTC, Inquie wrote:
>>>> Is there any easy way to create a scope for termination of
>>>> the object?
>>>>
>>>> I have a template method that takes a type and allocates and
>>>> deallocates based on that type.
>>>>
>>>> class bar
>>>> {
>>>> void foo(T)()
>>>> {
>>>> T x;
>>>> alloc(x);
>>>> scope(~this) dealloc(x); // hypothetical that wraps
>>>> the statement in a lambda and deallocates in the destructor
>>>>
>>>> ... x must stay allocated until class instance
>>>> termination(has to do with COM, can't release it in foo)
>>>> }
>>>>
>>>> }
>>>>
>
> I think the feature you're asking for is too
> complicated/involved for a language feature. Because it means
> there must be some implicit array in each object of your 'bar'
> class that holds some number of closures that will be executed
> in destructor. This affects object's memory layout and raises
> questions of allocating memory for those closures and since
> those closures will have pointers to some data (like 'x' here)
> it affects garbage collection. So there are a lot of things to
> be careful about and things that might affect other language
> features we haven't thought about yet. This is something quite
> big and something that affects a lot of code, not just a couple
> of classes you'll write in your one app. Probably it would be
> better to implement it as a library feature. Just make a base
> class having a method for registering such closures and calling
> them in destructor, and inherit from it or just embed it in
> your 'bar'.
Complexity is in the eye of the beholder. Children think many
things are complex when they are not.
If a library solution could be created that is as seamless as a
language solution, then I guess it would work. The downside of a
library solution is uniformity of syntax and added verbosity.
There is really no any arrays to keep track of or anything like
that matter you stated. It requires creating a delegate to wrap
the scope block and a copy of the variable to one on the heap.
The GC uses arrays and that happens regardless. No reason for the
compiler to create a new array.
3 steps:
1. Compiler copies local variables to heap(the "closure" part,
which actually means it is not closing anything as a normal
delegate would require).
2. The compiler creates a delegate. No big deal, does this in
many places.
3. The compiler calls all the delegates on destruction. The only
new part. But not difficult.
Create a ScopeThis(...) and adds no extra overhead would be nice
but I see that as being more complex. How can we determine what
are variables that need to be copied to the heap? How can we hook
in to the ~this? (can't have multiple ones, can we?)
If you can come up with a working ScopeThis that doesn't have any
more overhead than a language version, I'd be all for it, I don't
know or see how it could be done.
>>>> ScopeThis!("dealloc(x);")
Must determine that x is a variable(hard?) and copy it to the
heap(easy). Must create access to any local functions used(e.g.,
if dealloc is local). Then must hook in to ~this to execute the
code.
It would be nicer to not have to use a string but it would work
easy since we could use a mixin and modify the string easily once
we could parse it.
More information about the Digitalmars-d-learn
mailing list