@@ -9424,6 +9424,15 @@ void GenCCppD::writeCoercedInternal(const FuType * type, const FuExpr * expr, Fu
94249424 GenTyped::writeCoercedInternal(type, expr, parent);
94259425}
94269426
9427+ void GenCCppD::writeBitConverterUnion(const FuMethod * method)
9428+ {
9429+ write("{ ");
9430+ writeType(method->firstParameter()->type.get(), false);
9431+ write(" from; ");
9432+ writeType(method->type.get(), false);
9433+ write(" to; }");
9434+ }
9435+
94279436void GenCCppD::visitConst(const FuConst * statement)
94289437{
94299438 if (dynamic_cast<const FuArrayStorageType *>(statement->type.get()))
@@ -11608,16 +11617,6 @@ void GenC::startArrayIndexing(const FuExpr * obj, const FuType * elementType)
1160811617 write(", ");
1160911618}
1161011619
11611- void GenC::writeBitConverterIntFloat(std::string_view members, const FuExpr * arg)
11612- {
11613- write("(union { ");
11614- write(members);
11615- write("; }){ ");
11616- arg->accept(this, FuPriority::argument);
11617- write(" }.");
11618- writeChar(members[std::ssize(members) - 1]);
11619- }
11620-
1162111620void GenC::writeCMathFloating(std::string_view function, const std::vector<std::shared_ptr<FuExpr>> * args)
1162211621{
1162311622 includeMath();
@@ -12078,18 +12077,14 @@ void GenC::writeCallExpr(const FuType * type, const FuExpr * obj, const FuMethod
1207812077 writePostfix(obj, "->str");
1207912078 break;
1208012079 case FuId::bitConverterInt32BitsToSingle:
12081- writeBitConverterIntFloat("int i; float f", (*args)[0].get());
12082- break;
1208312080 case FuId::bitConverterInt64BitsToDouble:
12084- includeStdInt();
12085- writeBitConverterIntFloat("int64_t l; double d", (*args)[0].get());
12086- break;
1208712081 case FuId::bitConverterSingleToInt32Bits:
12088- writeBitConverterIntFloat("float f; int i", (*args)[0].get());
12089- break;
1209012082 case FuId::bitConverterDoubleToInt64Bits:
12091- includeStdInt();
12092- writeBitConverterIntFloat("double d; int64_t l", (*args)[0].get());
12083+ write("(union ");
12084+ writeBitConverterUnion(method);
12085+ write("){ ");
12086+ (*args)[0]->accept(this, FuPriority::argument);
12087+ write(" }.to");
1209312088 break;
1209412089 case FuId::convertToBase64String:
1209512090 writeGlib("g_base64_encode(");
@@ -18206,13 +18201,10 @@ void GenD::writeCallExpr(const FuType * type, const FuExpr * obj, const FuMethod
1820618201 case FuId::bitConverterInt64BitsToDouble:
1820718202 case FuId::bitConverterSingleToInt32Bits:
1820818203 case FuId::bitConverterDoubleToInt64Bits:
18209- write("() { union U { ");
18210- writeType(method->firstParameter()->type.get(), false);
18211- write(" source; ");
18212- writeType(method->type.get(), false);
18213- write(" target; } U u = U(");
18214- (*args)[0]->accept(this, FuPriority::argument);
18215- write("); return u.target; }()");
18204+ writeParameters(method, false);
18205+ write(" { union U ");
18206+ writeBitConverterUnion(method);
18207+ writeCall(" U u = U(value); return u.to; }", (*args)[0].get());
1821618208 break;
1821718209 case FuId::convertToBase64String:
1821818210 include("std.base64");
0 commit comments