Scope storage class
Sergey Gromov
snake.scaly at gmail.com
Thu Dec 4 07:26:42 PST 2008
Mon, 1 Dec 2008 14:10:27 -0500, Steven Schveighoffer wrote:
> "Walter Bright" wrote
>> Steven Schveighoffer wrote:
>>> "Walter Bright" wrote
>>>> Jarrett Billingsley wrote:
>>>>> So my suspicion is correct, then? That is:
>>>>>
>>>>> scope int delegate() b;
>>>>> b = { ... };
>>>>>
>>>>> Will allocate on the heap?
>>>> Yes. The scope for delegates takes effect as a parameter storage class,
>>>> not a local variable storage class. The reason is because it is the
>>>> called function that decides what it's going to do with the delegate.
>>>
>>> Why? It would be useful to allow local scope delegates.
>>>
>>> The compiler can just forbid passing the delegate to a function which
>>> does not declare its parameter as scope. I assume the compiler knows a
>>> variable is scope since it must prevent escape of the delegate, no? So
>>> just use that information. I thought that was the point of all this...
>>
>> In order to make that work, the compiler would have to do full escape
>> analysis, which is a lot of work to implement.
>
> Maybe I've misunderstood the point of declaring a delegate parameter scope.
>
> Take the following example:
>
> void delegate(int) global_dg;
>
> void foo(void delegate(int) dg)
> {
> global_dg = dg;
> }
>
> void foo2(scope void delegate(int) dg)
> {
> dg(5);
> }
>
> void bar(scope void delegate(int) dg)
> {
> foo(dg); // should this compile?
> foo2(dg); // should this compile?
> }
>
> void baz()
> {
> int y;
> void dg(int x) { y += x; }
> bar(&dg);
> }
>
> Should bar's call to foo compile?
It compiles.
> If it does, then the benefit of having
> scope delegates is just a hint to the compiler that "I know what I'm doing".
Yes, seems like for now it's just a hint. No checking is done.
The problem is, the declaration:
scope var = ...;
means something completely different from
void foo(scope void delegate() dg);
foo(...);
The former defines a scoped instance of a class. Ideally it should fail
if used with any non-class type because it makes no sense with
non-classes.
The latter defines a delegate in a non-escaping context. Currently such
definition is possible only as a parameter to a function call.
If delegate is defined in a non-escaping context, it gets a stack
closure. If it is defined as a scoped instance of a class... well, it
makes no sense, so the scope is ignored and the delegate is created as
usual, with a heap-allocated closure.
More information about the Digitalmars-d-announce
mailing list