New attribute to control references

Loara loara at noreply.com
Mon Apr 25 16:06:00 UTC 2022


I wrote a simple article about an extended `scope` attribute that 
manages pointers and types that contains indirections:

https://github.com/Loara/Rethink_scope_in_D/blob/main/README.md

I called this new attribute `rscope` (this is a temporary name, 
I'll change it in future in order to avoid misunderstandings), 
any variable or function parameter marked as `rscope` can be 
referenced only by other variables that are also `rscope`:

````d
rscope int i = 1;
int j = i; //ok, doesn't share references
//ref int k = i; error: k holds a reference to i
rscope ref int h = i; //ok, both rscope

rscope int *ip = new int (3);
//int *iq = ip; error: reference sharing
int *ik = new int(*ip); //ok
//rscope *ih = ik; error: ik is not rscope, see the link

struct A{
   int a;
   int *b;
}
rscope A a = {1, &i}; //ok, i rscope
//A b = a; //error, A has indirections, a rscoped but b no
````

Also you can use labelled `rscope` in order to avoid to share 
references between two or more `rscope` variables:
````d
rscope(A) int *a = ...;
rscope(A) int *b = a;//ok
//rscope(B) int *c = a; error: different rscope groups
````

Why and where use this new attribute? Everywhere you need to 
avoid references escape:
- when dealing with unsafe casts:

     ````d
     class A{...}
     ...
     const A a = ...
     ...
     rscope{//every variable declared inside this block is 
automatically rscope
       A a_unsafe = cast(A) a;
       //now you can use a_unsafe inside this block
       ...
     }
     //Now any reference to a_unsafe should be expired
     ````
- inside a `synchronized` block:

     ````d
     shared int i;
     Mutex mutex;
     ....
     synchronized(mutex){
       rscope{
         rscope ref int i_ref = get_rscoped_ref!int(i);
         ....
       }
     }
     ````

If you think these features would be interesting I'll write a new 
DIP and propose it, so I'm waiting your feedbacks.


More information about the Digitalmars-d mailing list