IRGen/Runtime: Metadata for @convention(c) function types.

For now, C&P a new metadata cache for C function pointers, like we do for blocks and thin types.

Swift SVN r27595
This commit is contained in:
Joe Groff
2015-04-22 18:06:23 +00:00
parent 349c2f08c0
commit c4ec47ddea
10 changed files with 129 additions and 1 deletions

View File

@@ -264,6 +264,19 @@ static void _buildNameForMetadata(const Metadata *type,
result += ")";
return;
}
case MetadataKind::CFunction: {
if (level >= TypeSyntaxLevel::TypeSimple)
result += "(";
result += "@convention(c) ";
auto func = static_cast<const FunctionTypeMetadata *>(type);
_buildFunctionTypeName(func, result);
if (level >= TypeSyntaxLevel::TypeSimple)
result += ")";
return;
}
case MetadataKind::Function: {
if (level >= TypeSyntaxLevel::TypeSimple)
result += "(";
@@ -498,6 +511,7 @@ static bool _conformsToProtocol(const OpaqueValue *value,
case MetadataKind::ExistentialMetatype:
case MetadataKind::Metatype:
case MetadataKind::Function:
case MetadataKind::CFunction:
case MetadataKind::ThinFunction:
case MetadataKind::Block: // FIXME
case MetadataKind::HeapLocalVariable:
@@ -559,6 +573,7 @@ static bool _conformsToProtocol(const OpaqueValue *value,
case MetadataKind::Existential: // FIXME
case MetadataKind::ExistentialMetatype: // FIXME
case MetadataKind::Function:
case MetadataKind::CFunction:
case MetadataKind::ThinFunction:
case MetadataKind::Block: // FIXME
case MetadataKind::HeapLocalVariable:
@@ -665,6 +680,7 @@ static void findDynamicValueAndType(OpaqueValue *value, const Metadata *type,
// Non-polymorphic types.
case MetadataKind::Function:
case MetadataKind::ThinFunction:
case MetadataKind::CFunction:
case MetadataKind::Block:
case MetadataKind::HeapLocalVariable:
case MetadataKind::ErrorObject:
@@ -728,6 +744,7 @@ static void deallocateDynamicValue(OpaqueValue *value, const Metadata *type) {
case MetadataKind::ExistentialMetatype:
case MetadataKind::Function:
case MetadataKind::ThinFunction:
case MetadataKind::CFunction:
case MetadataKind::Block:
case MetadataKind::HeapLocalVariable:
case MetadataKind::ErrorObject:
@@ -768,6 +785,7 @@ swift_dynamicCastMetatypeToObjectConditional(const Metadata *metatype) {
case MetadataKind::ForeignClass:
case MetadataKind::Block:
case MetadataKind::ThinFunction:
case MetadataKind::CFunction:
case MetadataKind::HeapLocalVariable:
case MetadataKind::ErrorObject:
return nullptr;
@@ -800,6 +818,7 @@ swift_dynamicCastMetatypeToObjectUnconditional(const Metadata *metatype) {
case MetadataKind::ForeignClass:
case MetadataKind::Block:
case MetadataKind::ThinFunction:
case MetadataKind::CFunction:
case MetadataKind::HeapLocalVariable:
case MetadataKind::ErrorObject: {
std::string sourceName = nameForMetadata(metatype);
@@ -906,6 +925,7 @@ static bool _dynamicCastToExistential(OpaqueValue *dest,
case MetadataKind::Function:
case MetadataKind::ThinFunction:
case MetadataKind::CFunction:
case MetadataKind::Block:
case MetadataKind::HeapLocalVariable:
case MetadataKind::ErrorObject:
@@ -1048,6 +1068,7 @@ swift::swift_dynamicCastUnknownClass(const void *object,
case MetadataKind::ExistentialMetatype:
case MetadataKind::Function:
case MetadataKind::ThinFunction:
case MetadataKind::CFunction:
case MetadataKind::Block:
case MetadataKind::HeapLocalVariable:
case MetadataKind::ErrorObject:
@@ -1105,6 +1126,7 @@ swift::swift_dynamicCastUnknownClassUnconditional(const void *object,
case MetadataKind::ExistentialMetatype:
case MetadataKind::Function:
case MetadataKind::ThinFunction:
case MetadataKind::CFunction:
case MetadataKind::Block:
case MetadataKind::HeapLocalVariable:
case MetadataKind::ErrorObject:
@@ -1166,6 +1188,7 @@ swift::swift_dynamicCastMetatype(const Metadata *sourceType,
case MetadataKind::ExistentialMetatype:
case MetadataKind::Function:
case MetadataKind::ThinFunction:
case MetadataKind::CFunction:
case MetadataKind::Block:
case MetadataKind::HeapLocalVariable:
case MetadataKind::ErrorObject:
@@ -1198,6 +1221,7 @@ swift::swift_dynamicCastMetatype(const Metadata *sourceType,
case MetadataKind::ExistentialMetatype:
case MetadataKind::Function:
case MetadataKind::ThinFunction:
case MetadataKind::CFunction:
case MetadataKind::Block:
case MetadataKind::HeapLocalVariable:
case MetadataKind::ErrorObject:
@@ -1215,6 +1239,7 @@ swift::swift_dynamicCastMetatype(const Metadata *sourceType,
case MetadataKind::ExistentialMetatype:
case MetadataKind::Function:
case MetadataKind::ThinFunction:
case MetadataKind::CFunction:
case MetadataKind::Block:
case MetadataKind::HeapLocalVariable:
case MetadataKind::ErrorObject:
@@ -1279,6 +1304,7 @@ swift::swift_dynamicCastMetatypeUnconditional(const Metadata *sourceType,
case MetadataKind::ExistentialMetatype:
case MetadataKind::Function:
case MetadataKind::ThinFunction:
case MetadataKind::CFunction:
case MetadataKind::Block:
case MetadataKind::HeapLocalVariable:
case MetadataKind::ErrorObject:
@@ -1312,6 +1338,7 @@ swift::swift_dynamicCastMetatypeUnconditional(const Metadata *sourceType,
case MetadataKind::ExistentialMetatype:
case MetadataKind::Function:
case MetadataKind::ThinFunction:
case MetadataKind::CFunction:
case MetadataKind::Block:
case MetadataKind::HeapLocalVariable:
case MetadataKind::ErrorObject:
@@ -1328,6 +1355,7 @@ swift::swift_dynamicCastMetatypeUnconditional(const Metadata *sourceType,
case MetadataKind::ExistentialMetatype:
case MetadataKind::Function:
case MetadataKind::ThinFunction:
case MetadataKind::CFunction:
case MetadataKind::Block:
case MetadataKind::HeapLocalVariable:
case MetadataKind::ErrorObject:
@@ -1621,6 +1649,7 @@ static bool _dynamicCastToMetatype(OpaqueValue *dest,
case MetadataKind::Function:
case MetadataKind::ThinFunction:
case MetadataKind::CFunction:
case MetadataKind::Block:
case MetadataKind::HeapLocalVariable:
case MetadataKind::ErrorObject:
@@ -1788,6 +1817,7 @@ static bool _dynamicCastToExistentialMetatype(OpaqueValue *dest,
case MetadataKind::ForeignClass:
case MetadataKind::Function:
case MetadataKind::ThinFunction:
case MetadataKind::CFunction:
case MetadataKind::Block:
case MetadataKind::HeapLocalVariable:
case MetadataKind::ErrorObject:
@@ -1888,6 +1918,7 @@ bool swift::swift_dynamicCast(OpaqueValue *dest,
case MetadataKind::ExistentialMetatype:
case MetadataKind::Function:
case MetadataKind::ThinFunction:
case MetadataKind::CFunction:
case MetadataKind::Block:
case MetadataKind::HeapLocalVariable:
case MetadataKind::ErrorObject:
@@ -1943,6 +1974,7 @@ bool swift::swift_dynamicCast(OpaqueValue *dest,
case MetadataKind::ExistentialMetatype:
case MetadataKind::Function:
case MetadataKind::ThinFunction:
case MetadataKind::CFunction:
case MetadataKind::Block:
case MetadataKind::HeapLocalVariable:
case MetadataKind::ErrorObject:
@@ -1959,6 +1991,7 @@ bool swift::swift_dynamicCast(OpaqueValue *dest,
// The non-polymorphic types.
case MetadataKind::Function:
case MetadataKind::ThinFunction:
case MetadataKind::CFunction:
case MetadataKind::Block:
case MetadataKind::HeapLocalVariable:
case MetadataKind::ErrorObject: