@@ -798,38 +798,22 @@ class MetadataReader {
798
798
}
799
799
case MetadataKind::Function: {
800
800
auto Function = cast<TargetFunctionTypeMetadata<Runtime>>(Meta);
801
- auto numParameters = Function->getNumParameters ();
801
+ auto * const parameters = Function->getParameters ();
802
802
803
803
std::vector<FunctionParam<BuiltType>> Parameters;
804
- StoredPointer ArgumentAddress = MetadataAddress +
805
- sizeof (TargetFunctionTypeMetadata<Runtime>);
806
- StoredPointer ParameterFlagsAddress =
807
- ArgumentAddress + (numParameters * sizeof (StoredPointer));
808
-
809
- for (unsigned i = 0 ; i < numParameters; ++i,
810
- ArgumentAddress += sizeof (StoredPointer),
811
- ParameterFlagsAddress += sizeof (uint32_t )) {
804
+ for (unsigned i = 0 , n = Function->getNumParameters (); i != n; ++i) {
812
805
StoredPointer ParamMetadata;
813
- if (!Reader->readInteger (RemoteAddress (ArgumentAddress),
814
- &ParamMetadata))
806
+ if (!Reader->readInteger (RemoteAddress (parameters + i), &ParamMetadata))
815
807
return BuiltType ();
816
808
817
- if (auto ParamTypeRef = readTypeFromMetadata (ParamMetadata)) {
818
- FunctionParam<BuiltType> Param;
819
- Param.setType (ParamTypeRef);
820
-
821
- if (Function->hasParameterFlags ()) {
822
- uint32_t ParameterFlags;
823
- if (!Reader->readInteger (RemoteAddress (ParameterFlagsAddress),
824
- &ParameterFlags))
825
- return BuiltType ();
826
- Param.setFlags (ParameterFlags::fromIntValue (ParameterFlags));
827
- }
828
-
829
- Parameters.push_back (std::move (Param));
830
- } else {
809
+ auto ParamTypeRef = readTypeFromMetadata (ParamMetadata);
810
+ if (!ParamTypeRef)
831
811
return BuiltType ();
832
- }
812
+
813
+ FunctionParam<BuiltType> Param;
814
+ Param.setType (ParamTypeRef);
815
+ Param.setFlags (Function->getParameterFlags (i));
816
+ Parameters.push_back (std::move (Param));
833
817
}
834
818
835
819
auto Result = readTypeFromMetadata (Function->ResultType );
@@ -1203,8 +1187,24 @@ class MetadataReader {
1203
1187
return _readMetadata<TargetExistentialMetatypeMetadata>(address);
1204
1188
case MetadataKind::ForeignClass:
1205
1189
return _readMetadata<TargetForeignClassMetadata>(address);
1206
- case MetadataKind::Function:
1207
- return _readMetadata<TargetFunctionTypeMetadata>(address);
1190
+ case MetadataKind::Function: {
1191
+ StoredSize flagsValue;
1192
+ auto flagsAddr =
1193
+ address + TargetFunctionTypeMetadata<Runtime>::OffsetToFlags;
1194
+ if (!Reader->readInteger (RemoteAddress (flagsAddr), &flagsValue))
1195
+ return nullptr ;
1196
+
1197
+ auto flags =
1198
+ TargetFunctionTypeFlags<StoredSize>::fromIntValue (flagsValue);
1199
+
1200
+ auto totalSize = sizeof (TargetFunctionTypeMetadata<Runtime>) +
1201
+ flags.getNumParameters () * sizeof (StoredPointer);
1202
+
1203
+ if (flags.hasParameterFlags ())
1204
+ totalSize += flags.getNumParameters () * sizeof (uint32_t );
1205
+
1206
+ return _readMetadata (address, totalSize);
1207
+ }
1208
1208
case MetadataKind::HeapGenericLocalVariable:
1209
1209
return _readMetadata<TargetGenericBoxHeapMetadata>(address);
1210
1210
case MetadataKind::HeapLocalVariable:
0 commit comments