Safe reference counting cannot be implemented as a library
    sclytrack via Digitalmars-d 
    digitalmars-d at puremagic.com
       
    Sat Oct 31 11:53:03 PDT 2015
    
    
  
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/offurllmuxjewizxedab@forum.dlang.org
>
> 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];
}
    
    
More information about the Digitalmars-d
mailing list