[Issue 15594] Make all of std.json @safe-friendly
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Sun Mar 20 10:49:00 PDT 2016
https://issues.dlang.org/show_bug.cgi?id=15594
--- Comment #1 from Chris Wright <dhasenan at gmail.com> ---
The .object() and .array() methods are not and cannot be @safe or @trusted
because they return by reference. Observe:
---
void main()
{
JSONValue v;
v.type = JSON_TYPE.OBJECT;
auto o = &v.object();
v.str = "overwrite";
(*o)["world"] = "i hope this works";
}
---
This will, naturally, end in a segmentation fault.
A different strategy is to create a @safe / @trusted DiscriminatedUnion
template in std.typecons and use that. We'd have to expose @system methods to
retrieve items by reference to make .object and .array continue to work, which
is kind of ugly.
Anyway, making str() @trusted and adding a couple @trusted methods, objectNoRef
and arrayNoRef, mostly works.
The main problem is iteration. The options are:
* opApply is @system. That sucks.
* opApply is @safe. That means you can only use it in @safe code.
* Provide @safe and @system overloads. The compiler isn't smart enough to use
the right one with foreach syntax.
* Switch to ranges. I can only transparently do this with arrays *or* objects,
not both, so this is also a breaking change.
* opApply is @system. Use .array and .object in @safe code. Oh wait, they're
@system because they return by reference. Expose .arrayNoRef and .objectNoRef
instead. That's kind of crufty but works.
* Expose .arrayNoRef and .objectNoRef, deprecate .array and .object, and
eventually replace them with the NoRef variants.
--
More information about the Digitalmars-d-bugs
mailing list