mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Add runtime support
This commit is contained in:
@@ -266,6 +266,22 @@ _buildDemanglingForMetadataPack(MetadataPackPointer pack, size_t count,
|
||||
return node;
|
||||
}
|
||||
|
||||
static Demangle::NodePointer
|
||||
_buildDemanglingForValue(size_t value, GenericValueDescriptor valueDescriptor,
|
||||
Demangle::Demangler &Dem) {
|
||||
switch (valueDescriptor.Type) {
|
||||
case GenericValueType::Int: {
|
||||
auto signedValue = (ssize_t)value;
|
||||
|
||||
if (signedValue < 0) {
|
||||
return Dem.createNode(Node::Kind::NegativeInteger, signedValue);
|
||||
}
|
||||
|
||||
return Dem.createNode(Node::Kind::Integer, signedValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Build an array of demangling trees for each generic argument to the given
|
||||
/// generic type context descriptor.
|
||||
///
|
||||
@@ -297,7 +313,7 @@ static bool _buildDemanglingForGenericArgs(
|
||||
auto packHeader = generics->getGenericPackShapeHeader();
|
||||
auto packDescriptors = generics->getGenericPackShapeDescriptors();
|
||||
|
||||
llvm::SmallVector<MetadataOrPack> allGenericArgs;
|
||||
llvm::SmallVector<MetadataPackOrValue> allGenericArgs;
|
||||
|
||||
auto numKeyArgs = 0;
|
||||
for (auto param : generics->getGenericParams()) {
|
||||
@@ -359,6 +375,25 @@ static bool _buildDemanglingForGenericArgs(
|
||||
break;
|
||||
}
|
||||
|
||||
case GenericParamKind::Value: {
|
||||
// FIXME: We really want to get the specific value descriptor when
|
||||
// building a demangling, but when all value parameters become non-key
|
||||
// we lose the value header. May need to do extra work to walk up parents
|
||||
// and find this parameter's specific value descriptor.
|
||||
|
||||
auto valueDescriptor = GenericValueDescriptor{GenericValueType::Int};
|
||||
auto value = genericArg.getValue();
|
||||
auto genericArgDemangling = _buildDemanglingForValue(value,
|
||||
valueDescriptor,
|
||||
Dem);
|
||||
|
||||
if (!genericArgDemangling)
|
||||
return false;
|
||||
|
||||
demangledGenerics.push_back(genericArgDemangling);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
// We don't know about this kind of parameter.
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user