ref parameters: there is no escape

dsimcha dsimcha at yahoo.com
Sun Aug 14 09:55:08 PDT 2011


Argh, accidentally hit send before I meant to on my last post.  Please 
ignore.

On 8/14/2011 12:44 PM, Andrei Alexandrescu wrote:
>> Consider the case
>> of designing a D wrapper for C functionality.
>>
>> // C, we know it doesn't escape its parameters but the compiler doesn't.
>> void cFun(int* a, int* b);
>>
>> // D:
>> void dWrapper(ref int a, ref int b) {
>> cFun(&a, &b);
>> }
>
> I understand. Probably it's fine to require an explicit cast for taking
> the address. Offhand, I don't see this as a frequent situation, or one
> that would make pass-by-pointer unpalatable.

Pass-by-pointer is really, really ugly when used in high-level D-style 
code, and exposes the implementation detail that the D wrapper is using 
C code.  By explicit cast, do you mean one in dWrapper() that's 
encapsulated and invisible to the caller?

>
>> If you want the compiler to put extra restrictions on you in the name of
>> safety, that's what SafeD is for. If you're writing an @system function,
>> then the compiler should stay out of your way and let you do what you
>> want, unless it can **prove** that it's wrong.
>
> The problem is, currently all functions that pass locals by ref cannot
> be proven safe modularly.


Right, but they can be proven safe if they pass locals by ref **to @safe 
functions**.  I don't think there's any disagreement that @safe 
functions shouldn't be allowed to take the address of locals or parameters.



More information about the Digitalmars-d mailing list