@@ -538,8 +538,18 @@ class MetadataReader {
538
538
if (!Instance) return BuiltType ();
539
539
return Builder.createExistentialMetatypeType (Instance);
540
540
}
541
- case MetadataKind::ForeignClass:
542
- return Builder.getUnnamedForeignClassType ();
541
+ case MetadataKind::ForeignClass: {
542
+ auto namePtrAddress =
543
+ Meta.getAddress () + TargetForeignClassMetadata<Runtime>::OffsetToName;
544
+ StoredPointer namePtr;
545
+ if (!Reader->readInteger (RemoteAddress (namePtrAddress), &namePtr) ||
546
+ namePtr == 0 )
547
+ return BuiltType ();
548
+ std::string name;
549
+ if (!Reader->readString (RemoteAddress (namePtr), name))
550
+ return BuiltType ();
551
+ return Builder.createForeignClassType (std::move (name));
552
+ }
543
553
case MetadataKind::HeapLocalVariable:
544
554
return Builder.getUnnamedForeignClassType (); // FIXME?
545
555
case MetadataKind::HeapGenericLocalVariable:
@@ -574,9 +584,14 @@ class MetadataReader {
574
584
}
575
585
576
586
private:
577
- template <typename M>
578
- MetadataRef _readMetadata (StoredPointer address, size_t size = sizeof (M)) {
579
- uint8_t *buffer = (uint8_t *)malloc (size);
587
+ template <template <class R > class M >
588
+ MetadataRef _readMetadata (StoredPointer address) {
589
+ return _readMetadata (address, sizeof (M<Runtime>));
590
+ }
591
+
592
+ MetadataRef _readMetadata (StoredPointer address, size_t sizeAfter) {
593
+ auto size = sizeAfter;
594
+ uint8_t *buffer = (uint8_t *) malloc (size);
580
595
if (!Reader->readBytes (RemoteAddress (address), buffer, size)) {
581
596
free (buffer);
582
597
return nullptr ;
@@ -598,58 +613,55 @@ class MetadataReader {
598
613
599
614
switch (getEnumeratedMetadataKind (KindValue)) {
600
615
case MetadataKind::Class:
601
- return _readMetadata<TargetClassMetadata<Runtime> >(address);
616
+ return _readMetadata<TargetClassMetadata>(address);
602
617
case MetadataKind::Enum:
603
- return _readMetadata<TargetEnumMetadata<Runtime> >(address);
618
+ return _readMetadata<TargetEnumMetadata>(address);
604
619
case MetadataKind::ErrorObject:
605
- return _readMetadata<TargetEnumMetadata<Runtime> >(address);
620
+ return _readMetadata<TargetEnumMetadata>(address);
606
621
case MetadataKind::Existential: {
607
- StoredPointer NumProtocolsAddress = address +
622
+ StoredPointer numProtocolsAddress = address +
608
623
TargetExistentialTypeMetadata<Runtime>::OffsetToNumProtocols;
609
- StoredPointer NumProtocols ;
610
- if (!Reader->readInteger (RemoteAddress (NumProtocolsAddress ),
611
- &NumProtocols ))
624
+ StoredPointer numProtocols ;
625
+ if (!Reader->readInteger (RemoteAddress (numProtocolsAddress ),
626
+ &numProtocols ))
612
627
return nullptr ;
613
628
614
- auto TotalSize = sizeof (TargetExistentialTypeMetadata<Runtime>) +
615
- NumProtocols *
629
+ auto totalSize = sizeof (TargetExistentialTypeMetadata<Runtime>)
630
+ + numProtocols *
616
631
sizeof (ConstTargetMetadataPointer<Runtime, TargetProtocolDescriptor>);
617
632
618
- return _readMetadata<TargetExistentialTypeMetadata<Runtime>>(address,
619
- TotalSize);
633
+ return _readMetadata (address, totalSize);
620
634
}
621
635
case MetadataKind::ExistentialMetatype:
622
- return _readMetadata<
623
- TargetExistentialMetatypeMetadata<Runtime>>(address);
636
+ return _readMetadata<TargetExistentialMetatypeMetadata>(address);
624
637
case MetadataKind::ForeignClass:
625
- return _readMetadata<TargetForeignClassMetadata<Runtime> >(address);
638
+ return _readMetadata<TargetForeignClassMetadata>(address);
626
639
case MetadataKind::Function:
627
- return _readMetadata<TargetFunctionTypeMetadata<Runtime> >(address);
640
+ return _readMetadata<TargetFunctionTypeMetadata>(address);
628
641
case MetadataKind::HeapGenericLocalVariable:
629
- return _readMetadata<TargetHeapLocalVariableMetadata<Runtime> >(address);
642
+ return _readMetadata<TargetHeapLocalVariableMetadata>(address);
630
643
case MetadataKind::HeapLocalVariable:
631
- return _readMetadata<TargetHeapLocalVariableMetadata<Runtime> >(address);
644
+ return _readMetadata<TargetHeapLocalVariableMetadata>(address);
632
645
case MetadataKind::Metatype:
633
- return _readMetadata<TargetMetatypeMetadata<Runtime> >(address);
646
+ return _readMetadata<TargetMetatypeMetadata>(address);
634
647
case MetadataKind::ObjCClassWrapper:
635
- return _readMetadata<TargetObjCClassWrapperMetadata<Runtime> >(address);
648
+ return _readMetadata<TargetObjCClassWrapperMetadata>(address);
636
649
case MetadataKind::Opaque:
637
- return _readMetadata<TargetOpaqueMetadata<Runtime> >(address);
650
+ return _readMetadata<TargetOpaqueMetadata>(address);
638
651
case MetadataKind::Optional:
639
- return _readMetadata<TargetEnumMetadata<Runtime> >(address);
652
+ return _readMetadata<TargetEnumMetadata>(address);
640
653
case MetadataKind::Struct:
641
- return _readMetadata<TargetStructMetadata<Runtime> >(address);
654
+ return _readMetadata<TargetStructMetadata>(address);
642
655
case MetadataKind::Tuple: {
643
- auto NumElementsAddress = address +
656
+ auto numElementsAddress = address +
644
657
TargetTupleTypeMetadata<Runtime>::OffsetToNumElements;
645
- StoredSize NumElements ;
646
- if (!Reader->readInteger (RemoteAddress (NumElementsAddress ),
647
- &NumElements ))
658
+ StoredSize numElements ;
659
+ if (!Reader->readInteger (RemoteAddress (numElementsAddress ),
660
+ &numElements ))
648
661
return nullptr ;
649
- auto TotalSize = sizeof (TargetTupleTypeMetadata<Runtime>) +
650
- NumElements * sizeof (StoredPointer);
651
- return _readMetadata<TargetTupleTypeMetadata<Runtime>>(address,
652
- TotalSize);
662
+ auto totalSize = sizeof (TargetTupleTypeMetadata<Runtime>)
663
+ + numElements * sizeof (StoredPointer);
664
+ return _readMetadata (address, totalSize);
653
665
}
654
666
}
655
667
0 commit comments