Skip to content

Commit e154e12

Browse files
committed
Swift SIL: add APIs for box types
1 parent f0f1c3c commit e154e12

File tree

3 files changed

+36
-0
lines changed

3 files changed

+36
-0
lines changed

SwiftCompilerSources/Sources/SIL/Type.swift

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ public struct Type : TypeProperties, CustomStringConvertible, NoReflectionChildr
5959
return bridged.isReferenceCounted(function.bridged)
6060
}
6161

62+
public var isBox: Bool { bridged.isBox() }
63+
6264
public var isMoveOnly: Bool { bridged.isMoveOnly() }
6365

6466
/// Return true if this type conforms to Escapable.
@@ -125,6 +127,11 @@ public struct Type : TypeProperties, CustomStringConvertible, NoReflectionChildr
125127
return TupleElementArray(type: self)
126128
}
127129

130+
public func getBoxFields(in function: Function) -> BoxFieldsArray {
131+
precondition(isBox)
132+
return BoxFieldsArray(type: self, function: function)
133+
}
134+
128135
/// Returns nil if the nominal is a resilient type because in this case the complete list
129136
/// of fields is not known.
130137
public func getNominalFields(in function: Function) -> NominalFieldsArray? {
@@ -267,6 +274,18 @@ public struct TupleElementArray : RandomAccessCollection, FormattedLikeArray {
267274
}
268275
}
269276

277+
public struct BoxFieldsArray : RandomAccessCollection, FormattedLikeArray {
278+
fileprivate let type: Type
279+
fileprivate let function: Function
280+
281+
public var startIndex: Int { return 0 }
282+
public var endIndex: Int { Int(type.bridged.getNumBoxFields()) }
283+
284+
public subscript(_ index: Int) -> Type {
285+
type.bridged.getBoxFieldType(index, function.bridged).type
286+
}
287+
}
288+
270289
extension Type: DiagnosticArgument {
271290
public func _withBridgedDiagnosticArgument(_ fn: (BridgedDiagnosticArgument) -> Void) {
272291
rawType._withBridgedDiagnosticArgument(fn)

include/swift/SIL/SILBridging.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,7 @@ struct BridgedType {
252252
BRIDGED_INLINE bool isNonTrivialOrContainsRawPointer(BridgedFunction f) const;
253253
BRIDGED_INLINE bool isLoadable(BridgedFunction f) const;
254254
BRIDGED_INLINE bool isReferenceCounted(BridgedFunction f) const;
255+
BRIDGED_INLINE bool isBox() const;
255256
BRIDGED_INLINE bool containsNoEscapeFunction() const;
256257
BRIDGED_INLINE bool isEmpty(BridgedFunction f) const;
257258
BRIDGED_INLINE bool isMoveOnly() const;
@@ -260,6 +261,8 @@ struct BridgedType {
260261
BRIDGED_INLINE bool isMarkedAsImmortal() const;
261262
BRIDGED_INLINE bool isAddressableForDeps(BridgedFunction f) const;
262263
BRIDGED_INLINE SwiftInt getCaseIdxOfEnumType(BridgedStringRef name) const;
264+
BRIDGED_INLINE SwiftInt getNumBoxFields() const;
265+
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedType getBoxFieldType(SwiftInt idx, BridgedFunction f) const;
263266
BRIDGED_INLINE SwiftInt getNumNominalFields() const;
264267
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedType getFieldType(SwiftInt idx, BridgedFunction f) const;
265268
BRIDGED_INLINE SwiftInt getFieldIdxOfNominalType(BridgedStringRef name) const;

include/swift/SIL/SILBridgingImpl.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,10 @@ bool BridgedType::isReferenceCounted(BridgedFunction f) const {
347347
return unbridged().isReferenceCounted(f.getFunction());
348348
}
349349

350+
bool BridgedType::isBox() const {
351+
return unbridged().is<swift::SILBoxType>();
352+
}
353+
350354
bool BridgedType::containsNoEscapeFunction() const {
351355
return unbridged().containsNoEscapeFunction();
352356
}
@@ -379,6 +383,16 @@ SwiftInt BridgedType::getCaseIdxOfEnumType(BridgedStringRef name) const {
379383
return unbridged().getCaseIdxOfEnumType(name.unbridged());
380384
}
381385

386+
SwiftInt BridgedType::getNumBoxFields() const {
387+
return unbridged().castTo<swift::SILBoxType>()->getLayout()->getFields().size();
388+
}
389+
390+
BridgedType BridgedType::getBoxFieldType(SwiftInt idx, BridgedFunction f) const {
391+
auto *fn = f.getFunction();
392+
return swift::getSILBoxFieldType(fn->getTypeExpansionContext(), unbridged().castTo<swift::SILBoxType>(),
393+
fn->getModule().Types, idx);
394+
}
395+
382396
SwiftInt BridgedType::getNumNominalFields() const {
383397
return unbridged().getNumNominalFields();
384398
}

0 commit comments

Comments
 (0)