Skip to content

Commit 32259c1

Browse files
committed
Mangle value parameter markers and fix demangling value params
1 parent d5d0001 commit 32259c1

File tree

6 files changed

+56
-6
lines changed

6 files changed

+56
-6
lines changed

include/swift/AST/ASTDemangler.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,15 @@ class ASTBuilder {
6868
/// For saving and restoring generic parameters.
6969
llvm::SmallVector<decltype(ParameterPacks), 2> ParameterPackStack;
7070

71+
/// The depth and index of each value parameter in the current generic
72+
/// signature. We need this becasue the mangling for a type parameter
73+
/// doesn't record whether it is a value or not; we find the correct
74+
/// depth and index in this array, and use its value-ness.
75+
llvm::SmallVector<std::tuple<std::pair<unsigned, unsigned>, Type>, 1> ValueParameters;
76+
77+
/// For saving and restoring generic parameters.
78+
llvm::SmallVector<decltype(ValueParameters), 1> ValueParametersStack;
79+
7180
/// This builder doesn't perform "on the fly" substitutions, so we preserve
7281
/// all pack expansions. We still need an active expansion stack though,
7382
/// for the dummy implementation of these methods:
@@ -93,6 +102,12 @@ class ASTBuilder {
93102
for (auto *paramTy : genericSig.getGenericParams()) {
94103
if (paramTy->isParameterPack())
95104
ParameterPacks.emplace_back(paramTy->getDepth(), paramTy->getIndex());
105+
106+
if (paramTy->isValue()) {
107+
auto pair = std::make_pair(paramTy->getDepth(), paramTy->getIndex());
108+
auto tuple = std::make_tuple(pair, paramTy->getValueType());
109+
ValueParameters.emplace_back(tuple);
110+
}
96111
}
97112
}
98113

include/swift/Demangling/TypeDecoder.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,8 @@ void decodeRequirement(
455455
BuilderType &Builder) {
456456
for (auto &child : *node) {
457457
if (child->getKind() == Demangle::Node::Kind::DependentGenericParamCount ||
458-
child->getKind() == Demangle::Node::Kind::DependentGenericParamPackMarker)
458+
child->getKind() == Demangle::Node::Kind::DependentGenericParamPackMarker ||
459+
child->getKind() == Demangle::Node::Kind::DependentGenericParamValueMarker)
459460
continue;
460461

461462
if (child->getNumChildren() != 2)

lib/AST/ASTDemangler.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -845,6 +845,11 @@ void ASTBuilder::pushGenericParams(ArrayRef<std::pair<unsigned, unsigned>> param
845845
void ASTBuilder::popGenericParams() {
846846
ParameterPacks = ParameterPackStack.back();
847847
ParameterPackStack.pop_back();
848+
849+
if (!ValueParametersStack.empty()) {
850+
ValueParameters = ValueParametersStack.back();
851+
ValueParametersStack.pop_back();
852+
}
848853
}
849854

850855
Type ASTBuilder::createGenericTypeParameterType(unsigned depth,
@@ -857,6 +862,17 @@ Type ASTBuilder::createGenericTypeParameterType(unsigned depth,
857862
}
858863
}
859864

865+
if (!ValueParameters.empty()) {
866+
for (auto tuple : ValueParameters) {
867+
auto pair = std::get<std::pair<unsigned, unsigned>>(tuple);
868+
auto type = std::get<Type>(tuple);
869+
870+
if (pair.first == depth && pair.second == index) {
871+
return GenericTypeParamType::getValue(depth, index, type, Ctx);
872+
}
873+
}
874+
}
875+
860876
return GenericTypeParamType::getType(depth, index, Ctx);
861877
}
862878

@@ -1197,9 +1213,18 @@ CanGenericSignature ASTBuilder::demangleGenericSignature(
11971213
// we introduce the parameter packs from the nominal's generic signature.
11981214
ParameterPackStack.push_back(ParameterPacks);
11991215
ParameterPacks.clear();
1216+
1217+
ValueParametersStack.push_back(ValueParameters);
1218+
ValueParameters.clear();
12001219
for (auto *paramTy : baseGenericSig.getGenericParams()) {
12011220
if (paramTy->isParameterPack())
12021221
ParameterPacks.emplace_back(paramTy->getDepth(), paramTy->getIndex());
1222+
1223+
if (paramTy->isValue()) {
1224+
auto pair = std::make_pair(paramTy->getDepth(), paramTy->getIndex());
1225+
auto tuple = std::make_tuple(pair, paramTy->getValueType());
1226+
ValueParameters.emplace_back(tuple);
1227+
}
12031228
}
12041229
SWIFT_DEFER { popGenericParams(); };
12051230

lib/AST/ASTMangler.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3629,10 +3629,17 @@ void ASTMangler::appendGenericSignatureParts(
36293629
ArrayRef<Requirement> requirements = parts.requirements;
36303630
ArrayRef<InverseRequirement> inverseRequirements = parts.inverses;
36313631

3632-
// Mangle which generic parameters are pack parameters.
3632+
// Mangle the kind for each generic parameter.
36333633
for (auto param : params) {
3634+
// Regular type parameters have no marker.
3635+
36343636
if (param->isParameterPack())
36353637
appendOpWithGenericParamIndex("Rv", param);
3638+
3639+
if (param->isValue()) {
3640+
appendType(param->getValueType(), sig);
3641+
appendOpWithGenericParamIndex("RV", param);
3642+
}
36363643
}
36373644

36383645
// Mangle the requirements.

lib/Demangling/NodePrinter.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1066,7 +1066,8 @@ class NodePrinter {
10661066
auto child = Node->getChild(firstRequirement);
10671067
if (child->getKind() == Node::Kind::Type)
10681068
child = child->getChild(0);
1069-
if (child->getKind() != Node::Kind::DependentGenericParamPackMarker) {
1069+
if (child->getKind() != Node::Kind::DependentGenericParamPackMarker &&
1070+
child->getKind() != Node::Kind::DependentGenericParamValueMarker) {
10701071
break;
10711072
}
10721073
}

lib/Demangling/Remangler.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4009,9 +4009,10 @@ ManglingError Remangler::mangleNegativeInteger(Node *node, unsigned int depth) {
40094009

40104010
ManglingError Remangler::mangleDependentGenericParamValueMarker(Node *node,
40114011
unsigned depth) {
4012-
DEMANGLER_ASSERT(node->getNumChildren() == 1, node);
4013-
DEMANGLER_ASSERT(node->getChild(0)->getKind() == Node::Kind::Type, node);
4014-
RETURN_IF_ERROR(mangleType(node->getChild(0)->getChild(1), depth + 1));
4012+
DEMANGLER_ASSERT(node->getNumChildren() == 2, node);
4013+
DEMANGLER_ASSERT(node->getChild(0)->getChild(0)->getKind() == Node::Kind::DependentGenericParamType, node);
4014+
DEMANGLER_ASSERT(node->getChild(1)->getKind() == Node::Kind::Type, node);
4015+
RETURN_IF_ERROR(mangleType(node->getChild(1), depth + 1));
40154016
Buffer << "RV";
40164017
mangleDependentGenericParamIndex(node->getChild(0)->getChild(0));
40174018
return ManglingError::Success;

0 commit comments

Comments
 (0)