Skip to content

Commit 2a92eac

Browse files
authored
Merge pull request #69115 from Azoy/revert-thing
Revert "Merge pull request #68844 from Azoy/gather-no-parameters"
2 parents 10537ec + de8233a commit 2a92eac

File tree

4 files changed

+23
-137
lines changed

4 files changed

+23
-137
lines changed

stdlib/public/runtime/MetadataLookup.cpp

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2876,29 +2876,17 @@ const Metadata *swift::_swift_instantiateCheckedGenericMetadata(
28762876
return nullptr;
28772877
}
28782878

2879-
llvm::SmallVector<const void *, 8> extraArguments;
2880-
2881-
for (size_t i = 0; i != genericArgsSize; i += 1) {
2882-
extraArguments.push_back(genericArgs[i]);
2883-
}
2879+
DemanglerForRuntimeTypeResolution<StackAllocatedDemangler<2048>> demangler;
28842880

2885-
// Check whether the generic requirements are satisfied, collecting
2886-
// any extra arguments we need for the instantiation function.
2887-
//
2888-
// Note: The extra arguemnts provided are not complete and do not include
2889-
// witness tables. This is fine for _checkGenericRequirements because it does
2890-
// not look for any of those.
2891-
SubstGenericParametersFromMetadata substitutions(context, extraArguments.data());
2881+
llvm::ArrayRef<MetadataOrPack> genericArgsRef(
2882+
reinterpret_cast<const MetadataOrPack *>(genericArgs), genericArgsSize);
2883+
llvm::SmallVector<unsigned, 8> genericParamCounts;
2884+
llvm::SmallVector<const void *, 8> allGenericArgs;
28922885

2893-
auto result = _checkGenericRequirements(
2894-
context->getGenericContext()->getGenericRequirements(), extraArguments,
2895-
[&substitutions](unsigned depth, unsigned index) {
2896-
return substitutions.getMetadata(depth, index).Ptr;
2897-
},
2898-
[](const Metadata *type, unsigned index) {
2899-
// In fact, just don't offer any witness tables if asked for one.
2900-
return nullptr;
2901-
}, /* allowsUnresolvedSubject */ true);
2886+
auto result = _gatherGenericParameters(context, genericArgsRef,
2887+
/* parent */ nullptr,
2888+
genericParamCounts, allGenericArgs,
2889+
demangler);
29022890

29032891
// _gatherGenericParameters returns llvm::None on success.
29042892
if (result.hasValue()) {
@@ -2907,7 +2895,7 @@ const Metadata *swift::_swift_instantiateCheckedGenericMetadata(
29072895

29082896
auto accessFunction = context->getAccessFunction();
29092897

2910-
return accessFunction(MetadataState::Complete, extraArguments).Value;
2898+
return accessFunction(MetadataState::Complete, allGenericArgs).Value;
29112899
}
29122900

29132901
#if SWIFT_OBJC_INTEROP

stdlib/public/runtime/Private.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -523,8 +523,7 @@ class TypeInfo {
523523
llvm::ArrayRef<GenericRequirementDescriptor> requirements,
524524
llvm::SmallVectorImpl<const void *> &extraArguments,
525525
SubstGenericParameterFn substGenericParam,
526-
SubstDependentWitnessTableFn substWitnessTable,
527-
bool allowsUnresolvedSubject = false);
526+
SubstDependentWitnessTableFn substWitnessTable);
528527

529528
/// A helper function which avoids performing a store if the destination
530529
/// address already contains the source value. This is useful when

stdlib/public/runtime/ProtocolConformance.cpp

Lines changed: 8 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1344,37 +1344,24 @@ static llvm::Optional<TypeLookupError>
13441344
checkGenericRequirement(const GenericRequirementDescriptor &req,
13451345
llvm::SmallVectorImpl<const void *> &extraArguments,
13461346
SubstGenericParameterFn substGenericParam,
1347-
SubstDependentWitnessTableFn substWitnessTable,
1348-
bool allowsUnresolvedSubject) {
1347+
SubstDependentWitnessTableFn substWitnessTable) {
13491348
assert(!req.getFlags().isPackRequirement());
13501349

13511350
// Make sure we understand the requirement we're dealing with.
13521351
if (!req.hasKnownKind())
13531352
return TypeLookupError("unknown kind");
13541353

1355-
const Metadata *subjectType = nullptr;
1356-
13571354
// Resolve the subject generic parameter.
13581355
auto result = swift_getTypeByMangledName(
13591356
MetadataState::Abstract, req.getParam(), extraArguments.data(),
13601357
substGenericParam, substWitnessTable);
1361-
1362-
if (!allowsUnresolvedSubject && result.isError()) {
1358+
if (result.getError())
13631359
return *result.getError();
1364-
}
1365-
1366-
if (!result.isError()) {
1367-
subjectType = result.getType().getMetadata();
1368-
}
1360+
const Metadata *subjectType = result.getType().getMetadata();
13691361

13701362
// Check the requirement.
13711363
switch (req.getKind()) {
13721364
case GenericRequirementKind::Protocol: {
1373-
// Protocol requirements _require_ a subject type.
1374-
if (result.isError()) {
1375-
return *result.getError();
1376-
}
1377-
13781365
const WitnessTable *witnessTable = nullptr;
13791366
if (!_conformsToProtocol(nullptr, subjectType, req.getProtocol(),
13801367
&witnessTable)) {
@@ -1395,37 +1382,16 @@ checkGenericRequirement(const GenericRequirementDescriptor &req,
13951382
}
13961383

13971384
case GenericRequirementKind::SameType: {
1398-
// Same type requirements don't require a valid subject.
1399-
1400-
const Metadata *sameType = nullptr;
1401-
14021385
// Demangle the second type under the given substitutions.
14031386
auto result = swift_getTypeByMangledName(
14041387
MetadataState::Abstract, req.getMangledTypeName(),
14051388
extraArguments.data(), substGenericParam, substWitnessTable);
1406-
1407-
if (!allowsUnresolvedSubject && result.isError()) {
1389+
if (result.getError())
14081390
return *result.getError();
1409-
}
1410-
1411-
if (!result.isError()) {
1412-
sameType = result.getType().getMetadata();
1413-
}
1414-
1415-
// If we don't have one of either the subject type or the same type and we
1416-
// have the other, then return this as a success. This assumes the given
1417-
// extra arguments have provided only the required key arguments in which
1418-
// case some same type constraints may concretize some generic arguments
1419-
// making them non-key.
1420-
//
1421-
// Note: We don't need to check for allowsUnresolvedSubject here because
1422-
// these can only be null in the case where we do allow it.
1423-
if ((!subjectType && sameType) || (subjectType && !sameType)) {
1424-
return llvm::None;
1425-
}
1391+
auto otherType = result.getType().getMetadata();
14261392

14271393
// Check that the types are equivalent.
1428-
if (subjectType != sameType) {
1394+
if (subjectType != otherType) {
14291395
return TYPE_LOOKUP_ERROR_FMT(
14301396
"subject type %.*s does not match %.*s", (int)req.getParam().size(),
14311397
req.getParam().data(), (int)req.getMangledTypeName().size(),
@@ -1436,20 +1402,10 @@ checkGenericRequirement(const GenericRequirementDescriptor &req,
14361402
}
14371403

14381404
case GenericRequirementKind::Layout: {
1439-
// Layout requirements _require_ a subject type.
1440-
if (result.isError()) {
1441-
return *result.getError();
1442-
}
1443-
14441405
return satisfiesLayoutConstraint(req, subjectType);
14451406
}
14461407

14471408
case GenericRequirementKind::BaseClass: {
1448-
// Base class requirements _require_ a subject type.
1449-
if (result.isError()) {
1450-
return *result.getError();
1451-
}
1452-
14531409
// Demangle the base type under the given substitutions.
14541410
auto result = swift_getTypeByMangledName(
14551411
MetadataState::Abstract, req.getMangledTypeName(),
@@ -1638,8 +1594,7 @@ llvm::Optional<TypeLookupError> swift::_checkGenericRequirements(
16381594
llvm::ArrayRef<GenericRequirementDescriptor> requirements,
16391595
llvm::SmallVectorImpl<const void *> &extraArguments,
16401596
SubstGenericParameterFn substGenericParam,
1641-
SubstDependentWitnessTableFn substWitnessTable,
1642-
bool allowsUnresolvedSubject) {
1597+
SubstDependentWitnessTableFn substWitnessTable) {
16431598
for (const auto &req : requirements) {
16441599
if (req.getFlags().isPackRequirement()) {
16451600
auto error = checkGenericPackRequirement(req, extraArguments,
@@ -1650,8 +1605,7 @@ llvm::Optional<TypeLookupError> swift::_checkGenericRequirements(
16501605
} else {
16511606
auto error = checkGenericRequirement(req, extraArguments,
16521607
substGenericParam,
1653-
substWitnessTable,
1654-
allowsUnresolvedSubject);
1608+
substWitnessTable);
16551609
if (error)
16561610
return error;
16571611
}

test/Runtime/check_create_type.swift

Lines changed: 4 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ func metaPointer(_ x: Any.Type) -> UnsafeRawPointer {
3030
unsafeBitCast(x, to: UnsafeRawPointer.self)
3131
}
3232

33-
testSuite.test("_swift_instantiateCheckedGenericMetadata non-variadic") {
33+
testSuite.test("_swift_checkedCreateType non-variadic") {
3434
let dictMeta = unsafeBitCast(
3535
[Int: Int].self as Any.Type,
3636
to: UnsafeRawPointer.self
@@ -53,7 +53,7 @@ testSuite.test("_swift_instantiateCheckedGenericMetadata non-variadic") {
5353
}
5454
}
5555

56-
testSuite.test("_swift_instantiateCheckedGenericMetadata variadic") {
56+
testSuite.test("_swift_checkedCreateType variadic") {
5757
let variMeta = unsafeBitCast(
5858
Variadic< >.self as Any.Type,
5959
to: UnsafeRawPointer.self
@@ -70,9 +70,7 @@ testSuite.test("_swift_instantiateCheckedGenericMetadata variadic") {
7070
UnsafeRawPointer(pack.baseAddress!),
7171
UInt(pack.count)
7272
)
73-
74-
// The 3 is the shape of the pack
75-
let genericArgs = [UnsafeRawPointer(bitPattern: 3)!, packPointer]
73+
let genericArgs = [packPointer]
7674

7775
genericArgs.withUnsafeBufferPointer { genericArgs in
7876
let newVari = _instantiateCheckedGenericMetadata(
@@ -86,7 +84,7 @@ testSuite.test("_swift_instantiateCheckedGenericMetadata variadic") {
8684
}
8785
}
8886

89-
testSuite.test("_swift_instantiateCheckedGenericMetadata variadic nested with requirements") {
87+
testSuite.test("_swift_checkedCreateType variadic nested with requirements") {
9088
let nestedMeta = unsafeBitCast(
9189
Variadic< >.Nested<()>.self as Any.Type,
9290
to: UnsafeRawPointer.self
@@ -103,10 +101,6 @@ testSuite.test("_swift_instantiateCheckedGenericMetadata variadic nested with re
103101
nestedPack.withUnsafeBufferPointer { nestedPack in
104102
variPack.withUnsafeBufferPointer { variPack in
105103
let nestedGenericArgs = [
106-
// First shape class
107-
UnsafeRawPointer(bitPattern: 3)!,
108-
// Second shape class
109-
UnsafeRawPointer(bitPattern: 3)!,
110104
allocateMetadataPack(
111105
UnsafeRawPointer(variPack.baseAddress!),
112106
UInt(variPack.count)
@@ -132,53 +126,4 @@ testSuite.test("_swift_instantiateCheckedGenericMetadata variadic nested with re
132126
}
133127
}
134128

135-
struct Generic<T> {}
136-
struct Generic2<T, U> {}
137-
138-
extension Generic where T == Int {
139-
struct Nested {}
140-
}
141-
142-
extension Generic2 where T == U? {
143-
struct Nested {}
144-
}
145-
146-
testSuite.test("_swift_instantiateCheckedGenericMetadata concrete generic types (same type conretized)") {
147-
let nestedMeta1 = metaPointer(Generic<Int>.Nested.self)
148-
let nestedDesc1 = nestedMeta1.load(
149-
fromByteOffset: MemoryLayout<Int>.size,
150-
as: UnsafeRawPointer.self
151-
)
152-
153-
let genericArgs1: [UnsafeRawPointer?] = []
154-
155-
genericArgs1.withUnsafeBufferPointer {
156-
let nested = _instantiateCheckedGenericMetadata(
157-
nestedDesc1,
158-
UnsafeRawPointer($0.baseAddress!),
159-
UInt($0.count)
160-
)
161-
162-
expectTrue(nested == Generic<Int>.Nested.self)
163-
}
164-
165-
let nestedMeta2 = metaPointer(Generic2<Int?, Int>.Nested.self)
166-
let nestedDesc2 = nestedMeta2.load(
167-
fromByteOffset: MemoryLayout<Int>.size,
168-
as: UnsafeRawPointer.self
169-
)
170-
171-
let genericArgs2 = [metaPointer(String.self)]
172-
173-
genericArgs2.withUnsafeBufferPointer {
174-
let nested = _instantiateCheckedGenericMetadata(
175-
nestedDesc2,
176-
UnsafeRawPointer($0.baseAddress!),
177-
UInt($0.count)
178-
)
179-
180-
expectTrue(nested == Generic2<String?, String>.Nested.self)
181-
}
182-
}
183-
184129
runAllTests()

0 commit comments

Comments
 (0)