On Thursday, 29 October 2015 at 20:31:49 UTC, Zach the Mystic wrote:
On Tuesday, 27 October 2015 at 18:10:18 UTC, deadalnix wrote:
I've made the claim that we should implement reference counting as a library many time, so I think I should explicit my position. Indeed, RC require some level a compiler support to be safe. That being said, the support does not need to be specific to RC. On fact, my position is that the language should provide some basic mechanism on top of which safe RC can be implemented, as a library.

The problem at hand here is escape analysis. The compiler must be able to ensure that a reference doesn't escape the RC mechanism in an uncontrolled manner. I'd like to add such mechanism to the language rather than bake in reference counting, as it can be used to solve other problem we are facing today (@nogc exception for instance).

Here's a link to the reference safety system I proposed some months ago:

http://forum.dlang.org/post/[email protected]

I'm very far from having the expertise needed to know whether it would be worth its weight in practice, but it was better to write it out than to keep it bottled up in my head. I hope it will be of some use.


1) Assignment to RCObject
-------------------------


{
        RCObject obj = new RCObject()
        Item item1 = obj.items[x];
        
        _temp1 = obj;
        obj = new RCObject();


        _temp2 = obj;
        obj = new RCObject();
}



2) Entering a subscope
----------------------

With this I mean entering a subscope that assigns to the RCObject.


{
        RCObject obj2 = new RCObject()
        RCObject obj = new RCObject()
        

        _temp1 = obj;                           //(2) Entering a subscope
        {
                _temp2 = obj;                   //(1) Assignment to RCObject
                obj = new RCObject();
        }
}


3) Leaving a scope.
-------------------

The Item is not reference counted.

{
        Item item1;
        {
                RCObject obj = new RCObject();
                //item1 = obj.items[x];         //(3) Leaving subscope
        }
}



{
        RCObject obj = new RCObject();
        Item item1;
        
        _temp1 = obj;                           //(2) Entering subscope
        {
                _temp2 = obj;                   //(1) Assignement to RCObject
                obj = new RCObject();
                //item1 = obj.items[x];         //(3) Leaving subscope

                _temp3 = obj;                   //(1) Assignement to RCObject
                obj = new RCObject();
        }
}




4) RCObject joins a scope
-------------------------


{
        _temp1 = obj.field.rcobject;            //(4) RCObject joins current 
scope.
        Item item1 = obj.field.rcobject.a.items[0];


        //_temp1;                               //(2) Entering subscope
        {
                _temp3 = obj.field.rcobject;    //(1) Assignment to RCObject
                obj.field.rcobject = new RCObject();
        }

        _temp4 = obj.field.rcobject;            //(4) RCObject joins current 
scope.
        item1 = obj.field.rcobject.a.items[2];
}










Reply via email to