Runtime: Provide value witness implementations for class existentials.

Same deal as for opaque existentials--pre-instantiate a static witness table for one-witness-table types (the zero-witness-tables case is nicely handled by Builtin.ObjCPointer's value witness), and generate a vwtable using dynamic witness implementations for each different-sized container on demand as necessary.

Swift SVN r9850
This commit is contained in:
Joe Groff
2013-10-31 18:38:54 +00:00
parent eeed35909e
commit fe7ecec60c
3 changed files with 333 additions and 21 deletions

View File

@@ -199,7 +199,12 @@ static void **assignWithoutObjCRetain(void **dest, void **src,
const Metadata *swift::swift_objcTypeof(OpaqueValue *src, const Metadata *self)
{
auto object = *reinterpret_cast<void**>(src);
auto object = *reinterpret_cast<HeapObject**>(src);
return swift_unknownTypeOf(object);
}
const Metadata *swift::swift_unknownTypeOf(HeapObject *object)
{
auto theClass = object_getClass(object);
auto classAsMetadata = reinterpret_cast<const ClassMetadata*>(theClass);
if (classAsMetadata->isTypeMetadata()) return classAsMetadata;