std.json: Avoid setting union members, set the whole union instead (#10683)

To work around https://github.com/dlang/dmd/issues/20675.
This commit is contained in:
Martin Kinkelin 2025-03-17 15:24:14 +01:00 committed by GitHub
parent 0faae92d62
commit cafe864533
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -562,8 +562,7 @@ struct JSONValue
else static if (is(T : string)) else static if (is(T : string))
{ {
type_tag = JSONType.string; type_tag = JSONType.string;
string t = arg; store = Store(str: arg);
() @trusted { store.str = t; }();
} }
// https://issues.dlang.org/show_bug.cgi?id=15884 // https://issues.dlang.org/show_bug.cgi?id=15884
else static if (isSomeString!T) else static if (isSomeString!T)
@ -572,7 +571,7 @@ struct JSONValue
// FIXME: std.Array.Array(Range) is not deduced as 'pure' // FIXME: std.Array.Array(Range) is not deduced as 'pure'
() @trusted { () @trusted {
import std.utf : byUTF; import std.utf : byUTF;
store.str = cast(immutable)(arg.byUTF!char.array); store = Store(str: cast(immutable)(arg.byUTF!char.array));
}(); }();
} }
else static if (is(T : bool)) else static if (is(T : bool))
@ -582,17 +581,17 @@ struct JSONValue
else static if (is(T : ulong) && isUnsigned!T) else static if (is(T : ulong) && isUnsigned!T)
{ {
type_tag = JSONType.uinteger; type_tag = JSONType.uinteger;
store.uinteger = arg; store = Store(uinteger: arg);
} }
else static if (is(T : long)) else static if (is(T : long))
{ {
type_tag = JSONType.integer; type_tag = JSONType.integer;
store.integer = arg; store = Store(integer: arg);
} }
else static if (isFloatingPoint!T) else static if (isFloatingPoint!T)
{ {
type_tag = JSONType.float_; type_tag = JSONType.float_;
store.floating = arg; store = Store(floating: arg);
} }
else static if (is(T : Value[Key], Key, Value)) else static if (is(T : Value[Key], Key, Value))
{ {
@ -600,45 +599,34 @@ struct JSONValue
type_tag = JSONType.object; type_tag = JSONType.object;
static if (is(Value : JSONValue)) static if (is(Value : JSONValue))
{ {
JSONValue[string] t = arg; store = Store(object: Store.Object(false, unordered: arg));
() @trusted {
store.object.isOrdered = false;
store.object.unordered = t;
}();
} }
else else
{ {
JSONValue[string] aa; JSONValue[string] aa;
foreach (key, value; arg) foreach (key, value; arg)
aa[key] = JSONValue(value); aa[key] = JSONValue(value);
() @trusted { store = Store(object: Store.Object(false, unordered: aa));
store.object.isOrdered = false;
store.object.unordered = aa;
}();
} }
} }
else static if (is(T : OrderedObjectMember[])) else static if (is(T : OrderedObjectMember[]))
{ {
type_tag = JSONType.object; type_tag = JSONType.object;
() @trusted { store = Store(object: Store.Object(true, ordered: arg));
store.object.isOrdered = true;
store.object.ordered = arg;
}();
} }
else static if (isArray!T) else static if (isArray!T)
{ {
type_tag = JSONType.array; type_tag = JSONType.array;
static if (is(ElementEncodingType!T : JSONValue)) static if (is(ElementEncodingType!T : JSONValue))
{ {
JSONValue[] t = arg; store = Store(array: arg);
() @trusted { store.array = t; }();
} }
else else
{ {
JSONValue[] new_arg = new JSONValue[arg.length]; JSONValue[] new_arg = new JSONValue[arg.length];
foreach (i, e; arg) foreach (i, e; arg)
new_arg[i] = JSONValue(e); new_arg[i] = JSONValue(e);
() @trusted { store.array = new_arg; }(); store = Store(array: new_arg);
} }
} }
else static if (is(T : JSONValue)) else static if (is(T : JSONValue))
@ -658,14 +646,14 @@ struct JSONValue
type_tag = JSONType.array; type_tag = JSONType.array;
static if (is(ElementEncodingType!T : JSONValue)) static if (is(ElementEncodingType!T : JSONValue))
{ {
store.array = arg; store = Store(array: arg);
} }
else else
{ {
JSONValue[] new_arg = new JSONValue[arg.length]; JSONValue[] new_arg = new JSONValue[arg.length];
foreach (i, e; arg) foreach (i, e; arg)
new_arg[i] = JSONValue(e); new_arg[i] = JSONValue(e);
store.array = new_arg; store = Store(array: new_arg);
} }
} }
@ -1616,13 +1604,13 @@ if (isSomeFiniteCharInputRange!T)
if (isFloat) if (isFloat)
{ {
value.type_tag = JSONType.float_; value.type_tag = JSONType.float_;
value.store.floating = parse!double(data); value.store = JSONValue.Store(floating: parse!double(data));
} }
else else
{ {
if (isNegative) if (isNegative)
{ {
value.store.integer = parse!long(data); value.store = JSONValue.Store(integer: parse!long(data));
value.type_tag = JSONType.integer; value.type_tag = JSONType.integer;
} }
else else
@ -1631,12 +1619,12 @@ if (isSomeFiniteCharInputRange!T)
ulong u = parse!ulong(data); ulong u = parse!ulong(data);
if (u & (1UL << 63)) if (u & (1UL << 63))
{ {
value.store.uinteger = u; value.store = JSONValue.Store(uinteger: u);
value.type_tag = JSONType.uinteger; value.type_tag = JSONType.uinteger;
} }
else else
{ {
value.store.integer = u; value.store = JSONValue.Store(integer: u);
value.type_tag = JSONType.integer; value.type_tag = JSONType.integer;
} }
} }