On 8/31/2014 6:47 AM, Dmitry Olshansky wrote:
import core.stdc.string;
import trusted;

void main() @safe
{

     char[] msg = "Hello!".dup;
     char[] msg2 = msg;
     import trusted; // may also use static import for absolute clarity
     assert(call!memcmp(addrOf(msg[0]), addrOf(msg2[0]), msg.length) == 0);
}

I don't agree with the notion of having primitives that provide escapes from @safe - it means the interleaving of @safe and @system code becomes too easy, and too easy to miss.

I also don't agree with the notion of having @trusted blocks of the form:

    @trusted {
        ... system code ...
    }

We already have a mechanism to do that - @trusted nested functions. The code example becomes:

  void main() @safe {
     char[] msg = "Hello!".dup;
     char[] msg2 = msg;

     void checkEquals(const char[] msg, const char[] msg2) pure @trusted {
       assert(msg.length == msg2.length);
       assert(memcmp(msg.ptr, msg2.ptr, msg.length) == 0);
     }

     checkEquals(msg, msg2);
  }

Granted, this can be abused to subvert the @safe/@trusted/@system system, but that has always been the case. Note that I added an assert to make checkEquals() actually trustworthy. The QA code reviewer can still grep for @trusted and flag them for special review.

These sorts of nested functions should inline and pose no extra overhead.

Reply via email to