Skip to content

Commit b0a37cf

Browse files
committed
Mangle value parameter markers and fix demangling value params
1 parent ad94d55 commit b0a37cf

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
@@ -454,7 +454,8 @@ void decodeRequirement(
454454
BuilderType &Builder) {
455455
for (auto &child : *node) {
456456
if (child->getKind() == Demangle::Node::Kind::DependentGenericParamCount ||
457-
child->getKind() == Demangle::Node::Kind::DependentGenericParamPackMarker)
457+
child->getKind() == Demangle::Node::Kind::DependentGenericParamPackMarker ||
458+
child->getKind() == Demangle::Node::Kind::DependentGenericParamValueMarker)
458459
continue;
459460

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

lib/AST/ASTDemangler.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -843,6 +843,11 @@ void ASTBuilder::pushGenericParams(ArrayRef<std::pair<unsigned, unsigned>> param
843843
void ASTBuilder::popGenericParams() {
844844
ParameterPacks = ParameterPackStack.back();
845845
ParameterPackStack.pop_back();
846+
847+
if (!ValueParametersStack.empty()) {
848+
ValueParameters = ValueParametersStack.back();
849+
ValueParametersStack.pop_back();
850+
}
846851
}
847852

848853
Type ASTBuilder::createGenericTypeParameterType(unsigned depth,
@@ -855,6 +860,17 @@ Type ASTBuilder::createGenericTypeParameterType(unsigned depth,
855860
}
856861
}
857862

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

@@ -1195,9 +1211,18 @@ CanGenericSignature ASTBuilder::demangleGenericSignature(
11951211
// we introduce the parameter packs from the nominal's generic signature.
11961212
ParameterPackStack.push_back(ParameterPacks);
11971213
ParameterPacks.clear();
1214+
1215+
ValueParametersStack.push_back(ValueParameters);
1216+
ValueParameters.clear();
11981217
for (auto *paramTy : baseGenericSig.getGenericParams()) {
11991218
if (paramTy->isParameterPack())
12001219
ParameterPacks.emplace_back(paramTy->getDepth(), paramTy->getIndex());
1220+
1221+
if (paramTy->isValue()) {
1222+
auto pair = std::make_pair(paramTy->getDepth(), paramTy->getIndex());
1223+
auto tuple = std::make_tuple(pair, paramTy->getValueType());
1224+
ValueParameters.emplace_back(tuple);
1225+
}
12011226
}
12021227
SWIFT_DEFER { popGenericParams(); };
12031228

lib/AST/ASTMangler.cpp

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

3614-
// Mangle which generic parameters are pack parameters.
3614+
// Mangle the kind for each generic parameter.
36153615
for (auto param : params) {
3616+
// Regular type parameters have no marker.
3617+
36163618
if (param->isParameterPack())
36173619
appendOpWithGenericParamIndex("Rv", param);
3620+
3621+
if (param->isValue()) {
3622+
appendType(param->getValueType(), sig);
3623+
appendOpWithGenericParamIndex("RV", param);
3624+
}
36183625
}
36193626

36203627
// Mangle the requirements.

lib/Demangling/NodePrinter.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1060,7 +1060,8 @@ class NodePrinter {
10601060
auto child = Node->getChild(firstRequirement);
10611061
if (child->getKind() == Node::Kind::Type)
10621062
child = child->getChild(0);
1063-
if (child->getKind() != Node::Kind::DependentGenericParamPackMarker) {
1063+
if (child->getKind() != Node::Kind::DependentGenericParamPackMarker &&
1064+
child->getKind() != Node::Kind::DependentGenericParamValueMarker) {
10641065
break;
10651066
}
10661067
}

lib/Demangling/Remangler.cpp

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

39703970
ManglingError Remangler::mangleDependentGenericParamValueMarker(Node *node,
39713971
unsigned depth) {
3972-
DEMANGLER_ASSERT(node->getNumChildren() == 1, node);
3973-
DEMANGLER_ASSERT(node->getChild(0)->getKind() == Node::Kind::Type, node);
3974-
RETURN_IF_ERROR(mangleType(node->getChild(0)->getChild(1), depth + 1));
3972+
DEMANGLER_ASSERT(node->getNumChildren() == 2, node);
3973+
DEMANGLER_ASSERT(node->getChild(0)->getChild(0)->getKind() == Node::Kind::DependentGenericParamType, node);
3974+
DEMANGLER_ASSERT(node->getChild(1)->getKind() == Node::Kind::Type, node);
3975+
RETURN_IF_ERROR(mangleType(node->getChild(1), depth + 1));
39753976
Buffer << "RV";
39763977
mangleDependentGenericParamIndex(node->getChild(0)->getChild(0));
39773978
return ManglingError::Success;

0 commit comments

Comments
 (0)