@@ -2280,7 +2280,7 @@ static void installGetClassHook() {
22802280unsigned SubstGenericParametersFromMetadata::
22812281buildDescriptorPath (const ContextDescriptor *context,
22822282 Demangler &borrowFrom) const {
2283- assert (sourceIsMetadata );
2283+ assert (sourceKind == SourceKind::Metadata );
22842284
22852285 // Terminating condition: we don't have a context.
22862286 if (!context)
@@ -2371,20 +2371,76 @@ buildEnvironmentPath(
23712371 return totalKeyParamCount;
23722372}
23732373
2374+ unsigned SubstGenericParametersFromMetadata::buildShapePath (
2375+ const TargetExtendedExistentialTypeShape<InProcess> *shape) const {
2376+ unsigned totalParamCount = 0 ;
2377+ unsigned totalKeyParamCount = 0 ;
2378+
2379+ auto genSig = shape->getGeneralizationSignature ();
2380+ if (!genSig.getParams ().empty ()) {
2381+ bool hasNonKeyGenericParams = false ;
2382+ unsigned numKeyGenericParamsHere = 0 ;
2383+ for (const auto &gp : genSig.getParams ()) {
2384+ if (gp.hasKeyArgument ())
2385+ numKeyGenericParamsHere++;
2386+ else
2387+ hasNonKeyGenericParams = true ;
2388+ }
2389+ totalParamCount += numKeyGenericParamsHere;
2390+ totalKeyParamCount += numKeyGenericParamsHere;
2391+ descriptorPath.push_back (PathElement{genSig.getParams (), totalParamCount,
2392+ /* numKeyGenericParamsInParent*/ 0 ,
2393+ numKeyGenericParamsHere,
2394+ hasNonKeyGenericParams});
2395+ }
2396+
2397+ const unsigned genSigParamCount = genSig.getParams ().size ();
2398+ auto reqSig = shape->getRequirementSignature ();
2399+ assert (reqSig.getParams ().size () > genSig.getParams ().size ());
2400+ {
2401+ bool hasNonKeyGenericParams = false ;
2402+ unsigned numKeyGenericParamsHere = 0 ;
2403+ auto remainingParams = reqSig.getParams ().drop_front (genSig.getParams ().size ());
2404+ for (const auto &gp : remainingParams) {
2405+ if (gp.hasKeyArgument ())
2406+ numKeyGenericParamsHere++;
2407+ else
2408+ hasNonKeyGenericParams = true ;
2409+ }
2410+ totalParamCount += numKeyGenericParamsHere;
2411+ totalKeyParamCount += numKeyGenericParamsHere;
2412+ descriptorPath.push_back (PathElement{remainingParams,
2413+ totalParamCount,
2414+ genSigParamCount,
2415+ numKeyGenericParamsHere,
2416+ hasNonKeyGenericParams});
2417+ }
2418+
2419+ return totalKeyParamCount;
2420+ }
2421+
23742422void SubstGenericParametersFromMetadata::setup () const {
23752423 if (!descriptorPath.empty ())
23762424 return ;
23772425
2378- if (sourceIsMetadata && baseContext) {
2426+ switch (sourceKind) {
2427+ case SourceKind::Metadata: {
2428+ assert (baseContext);
23792429 DemanglerForRuntimeTypeResolution<StackAllocatedDemangler<2048 >> demangler;
23802430 numKeyGenericParameters = buildDescriptorPath (baseContext, demangler);
23812431 return ;
23822432 }
2383-
2384- if (!sourceIsMetadata && environment) {
2433+ case SourceKind::Environment: {
2434+ assert ( environment);
23852435 numKeyGenericParameters = buildEnvironmentPath (environment);
23862436 return ;
23872437 }
2438+ case SourceKind::Shape: {
2439+ assert (shape);
2440+ numKeyGenericParameters = buildShapePath (shape);
2441+ return ;
2442+ }
2443+ }
23882444}
23892445
23902446const Metadata *
0 commit comments