1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
#include "extraDataFields.h"
#include <swift/Runtime/Metadata.h>
using namespace swift;
namespace llvm {
int DisableABIBreakingChecks;
int EnableABIBreakingChecks;
}
void *completeMetadata(void *uncastMetadata) {
auto *metadata = static_cast<Metadata *>(uncastMetadata);
auto request =
MetadataRequest(MetadataState::Complete, /*isNonBlocking*/ false);
auto response = swift_checkMetadataState(request, metadata);
return (void *)response.Value;
}
int64_t *trailingFlagsForStructMetadata(void *uncastMetadata) {
auto *metadata = static_cast<StructMetadata *>(uncastMetadata);
auto *description = metadata->getDescription();
if (!description->isGeneric())
return nullptr;
auto *trailingFlags = metadata->getTrailingFlags();
if (trailingFlags == nullptr)
return nullptr;
auto *retval = (int64_t *)malloc(sizeof(int64_t));
*retval = trailingFlags->getOpaqueValue();
return retval;
}
const uint32_t *fieldOffsetsForStructMetadata(void *uncastMetadata) {
auto *metadata = static_cast<StructMetadata *>(uncastMetadata);
return metadata->getFieldOffsets();
}
int64_t *trailingFlagsForEnumMetadata(void *uncastMetadata) {
auto *metadata = static_cast<EnumMetadata *>(uncastMetadata);
auto *description = metadata->getDescription();
if (!description->isGeneric())
return nullptr;
auto *trailingFlags = metadata->getTrailingFlags();
if (trailingFlags == nullptr)
return nullptr;
auto *retval = (int64_t *)malloc(sizeof(int64_t));
*retval = trailingFlags->getOpaqueValue();
return retval;
}
size_t *payloadSizeForEnumMetadata(void *uncastMetadata) {
auto *metadata = static_cast<EnumMetadata *>(uncastMetadata);
if (!metadata->hasPayloadSize())
return nullptr;
auto *retval = (size_t *)malloc(sizeof(size_t));
*retval = metadata->getPayloadSize();
return retval;
}
|