Created
August 3, 2018 16:41
-
-
Save omochi/e2f11688f6d86a7070f6c86361d7bbdc to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// swift/stdlib/public/runtime/Metadata.cpp をプリプロセッサのみ実行した結果から抜粋 | |
struct ValueWitnessTable; | |
namespace value_witness_types { | |
typedef OpaqueValue * (*initializeBufferWithCopyOfBuffer) (ValueBuffer *, ValueBuffer *, const Metadata *); | |
typedef void (*destroy) (OpaqueValue *, const Metadata *); | |
typedef OpaqueValue * (*initializeWithCopy) (OpaqueValue *, OpaqueValue *, const Metadata *); | |
typedef OpaqueValue * (*assignWithCopy) (OpaqueValue *, OpaqueValue *, const Metadata *); | |
typedef OpaqueValue * (*initializeWithTake) (OpaqueValue *, OpaqueValue *, const Metadata *); | |
typedef OpaqueValue * (*assignWithTake) (OpaqueValue *, OpaqueValue *, const Metadata *); | |
typedef unsigned (*getEnumTagSinglePayload) (const OpaqueValue *, unsigned, const Metadata *); | |
typedef void (*storeEnumTagSinglePayload) (OpaqueValue *, unsigned, unsigned, const Metadata *); | |
typedef void (*storeExtraInhabitant) (OpaqueValue *, int, const Metadata *); | |
typedef int (*getExtraInhabitantIndex) (const OpaqueValue *, const Metadata *); | |
typedef int (*getEnumTag) (const OpaqueValue *, const Metadata *); | |
typedef void (*destructiveProjectEnumData) (OpaqueValue *, const Metadata *); | |
typedef void (*destructiveInjectEnumTag) (OpaqueValue *, unsigned, const Metadata *); | |
typedef size_t size; | |
typedef ValueWitnessFlags flags; | |
typedef size_t stride; | |
typedef ExtraInhabitantFlags extraInhabitantFlags; | |
} | |
struct ValueWitnessTable { | |
value_witness_types::initializeBufferWithCopyOfBuffer initializeBufferWithCopyOfBuffer; | |
value_witness_types::destroy destroy; | |
value_witness_types::initializeWithCopy initializeWithCopy; | |
value_witness_types::assignWithCopy assignWithCopy; | |
value_witness_types::initializeWithTake initializeWithTake; | |
value_witness_types::assignWithTake assignWithTake; | |
value_witness_types::getEnumTagSinglePayload getEnumTagSinglePayload; | |
value_witness_types::storeEnumTagSinglePayload storeEnumTagSinglePayload; | |
value_witness_types::size size; | |
value_witness_types::flags flags; | |
value_witness_types::stride stride; | |
bool isIncomplete() const { | |
return flags.isIncomplete(); | |
} | |
static bool isValueInline(bool isBitwiseTakable, size_t size, size_t alignment) { | |
return (isBitwiseTakable && size <= sizeof(ValueBuffer) && | |
alignment <= alignof(ValueBuffer)); | |
} | |
bool isValueInline() const { | |
return flags.isInlineStorage(); | |
} | |
bool isPOD() const { | |
return flags.isPOD(); | |
} | |
bool isBitwiseTakable() const { | |
return flags.isBitwiseTakable(); | |
} | |
size_t getSize() const { | |
return size; | |
} | |
size_t getStride() const { | |
return stride; | |
} | |
size_t getAlignment() const { | |
return flags.getAlignment(); | |
} | |
size_t getAlignmentMask() const { | |
return flags.getAlignmentMask(); | |
} | |
unsigned getNumExtraInhabitants() const; | |
const struct ExtraInhabitantsValueWitnessTable *_asXIVWT() const; | |
const struct EnumValueWitnessTable *_asEVWT() const; | |
const TypeLayout *getTypeLayout() const { | |
return reinterpret_cast<const TypeLayout *>(&size); | |
} | |
bool checkIsComplete() const; | |
void publishLayout(const TypeLayout &layout); | |
}; | |
struct ExtraInhabitantsValueWitnessTable : ValueWitnessTable { | |
value_witness_types::extraInhabitantFlags extraInhabitantFlags; | |
value_witness_types::storeExtraInhabitant storeExtraInhabitant; | |
value_witness_types::getExtraInhabitantIndex getExtraInhabitantIndex; | |
constexpr ExtraInhabitantsValueWitnessTable() | |
: ValueWitnessTable{}, extraInhabitantFlags(), | |
storeExtraInhabitant(nullptr), | |
getExtraInhabitantIndex(nullptr) {} | |
constexpr ExtraInhabitantsValueWitnessTable( | |
const ValueWitnessTable &base, | |
value_witness_types::extraInhabitantFlags eif, | |
value_witness_types::storeExtraInhabitant sei, | |
value_witness_types::getExtraInhabitantIndex geii) | |
: ValueWitnessTable(base), | |
extraInhabitantFlags(eif), | |
storeExtraInhabitant(sei), | |
getExtraInhabitantIndex(geii) {} | |
static bool classof(const ValueWitnessTable *table) { | |
return table->flags.hasExtraInhabitants(); | |
} | |
}; | |
struct EnumValueWitnessTable : ExtraInhabitantsValueWitnessTable { | |
value_witness_types::getEnumTag getEnumTag; | |
value_witness_types::destructiveProjectEnumData destructiveProjectEnumData; | |
value_witness_types::destructiveInjectEnumTag destructiveInjectEnumTag; | |
constexpr EnumValueWitnessTable() | |
: ExtraInhabitantsValueWitnessTable(), | |
getEnumTag(nullptr), | |
destructiveProjectEnumData(nullptr), | |
destructiveInjectEnumTag(nullptr) {} | |
constexpr EnumValueWitnessTable( | |
const ExtraInhabitantsValueWitnessTable &base, | |
value_witness_types::getEnumTag getEnumTag, | |
value_witness_types::destructiveProjectEnumData destructiveProjectEnumData, | |
value_witness_types::destructiveInjectEnumTag destructiveInjectEnumTag) | |
: ExtraInhabitantsValueWitnessTable(base), | |
getEnumTag(getEnumTag), | |
destructiveProjectEnumData(destructiveProjectEnumData), | |
destructiveInjectEnumTag(destructiveInjectEnumTag) {} | |
static bool classof(const ValueWitnessTable *table) { | |
return table->flags.hasEnumWitnesses(); | |
} | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment