File tree Expand file tree Collapse file tree 4 files changed +69
-0
lines changed Expand file tree Collapse file tree 4 files changed +69
-0
lines changed Original file line number Diff line number Diff line change @@ -1271,6 +1271,11 @@ class RefCounts {
1271
1271
// Note that this is not equal to the number of outstanding weak pointers.
1272
1272
uint32_t getWeakCount () const ;
1273
1273
1274
+ #ifndef NDEBUG
1275
+ bool isImmutableCOWBuffer ();
1276
+ bool setIsImmutableCOWBuffer (bool immutable);
1277
+ #endif
1278
+
1274
1279
// DO NOT TOUCH.
1275
1280
// This exists for the benefits of the Refcounting.cpp tests. Do not use it
1276
1281
// elsewhere.
@@ -1301,6 +1306,11 @@ class HeapObjectSideTableEntry {
1301
1306
std::atomic<HeapObject*> object;
1302
1307
SideTableRefCounts refCounts;
1303
1308
1309
+ #ifndef NDEBUG
1310
+ // Used for runtime consistency checking of COW buffers.
1311
+ bool immutableCOWBuffer = false ;
1312
+ #endif
1313
+
1304
1314
public:
1305
1315
HeapObjectSideTableEntry (HeapObject *newObject)
1306
1316
: object(newObject), refCounts()
@@ -1455,6 +1465,16 @@ class HeapObjectSideTableEntry {
1455
1465
void *getSideTable () {
1456
1466
return refCounts.getSideTable ();
1457
1467
}
1468
+
1469
+ #ifndef NDEBUG
1470
+ bool isImmutableCOWBuffer () const {
1471
+ return immutableCOWBuffer;
1472
+ }
1473
+
1474
+ void setIsImmutableCOWBuffer (bool immutable) {
1475
+ immutableCOWBuffer = immutable;
1476
+ }
1477
+ #endif
1458
1478
};
1459
1479
1460
1480
Original file line number Diff line number Diff line change @@ -345,6 +345,16 @@ internal func _class_getInstancePositiveExtentSize(_ theClass: AnyClass) -> Int
345
345
#endif
346
346
}
347
347
348
+ #if INTERNAL_CHECKS_ENABLED
349
+ @usableFromInline
350
+ @_silgen_name ( " _swift_isImmutableCOWBuffer " )
351
+ internal func _swift_isImmutableCOWBuffer( _ object: AnyObject ) -> Bool
352
+
353
+ @usableFromInline
354
+ @_silgen_name ( " _swift_setImmutableCOWBuffer " )
355
+ internal func _swift_setImmutableCOWBuffer( _ object: AnyObject , _ immutable: Bool ) -> Bool
356
+ #endif
357
+
348
358
@inlinable
349
359
internal func _isValidAddress( _ address: UInt ) -> Bool {
350
360
// TODO: define (and use) ABI max valid pointer value
Original file line number Diff line number Diff line change @@ -887,6 +887,23 @@ WeakReference *swift::swift_weakTakeAssign(WeakReference *dest,
887
887
888
888
#ifndef NDEBUG
889
889
890
+ // / Returns true if the "immutable" flag is set on \p object.
891
+ // /
892
+ // / Used for runtime consistency checking of COW buffers.
893
+ SWIFT_RUNTIME_EXPORT
894
+ bool _swift_isImmutableCOWBuffer (HeapObject *object) {
895
+ return object->refCounts .isImmutableCOWBuffer ();
896
+ }
897
+
898
+ // / Sets the "immutable" flag on \p object to \p immutable and returns the old
899
+ // / value of the flag.
900
+ // /
901
+ // / Used for runtime consistency checking of COW buffers.
902
+ SWIFT_RUNTIME_EXPORT
903
+ bool _swift_setImmutableCOWBuffer (HeapObject *object, bool immutable) {
904
+ return object->refCounts .setIsImmutableCOWBuffer (immutable);
905
+ }
906
+
890
907
void HeapObject::dump () const {
891
908
auto *Self = const_cast <HeapObject *>(this );
892
909
printf (" HeapObject: %p\n " , Self);
Original file line number Diff line number Diff line change @@ -156,6 +156,28 @@ void _swift_stdlib_immortalize(void *obj) {
156
156
heapObj->refCounts .setIsImmortal (true );
157
157
}
158
158
159
+ #ifndef NDEBUG
160
+ // SideTableRefCountBits specialization intentionally does not exist.
161
+ template <>
162
+ bool RefCounts<InlineRefCountBits>::isImmutableCOWBuffer() {
163
+ if (!hasSideTable ())
164
+ return false ;
165
+ HeapObjectSideTableEntry *sideTable = allocateSideTable (false );
166
+ assert (sideTable);
167
+ return sideTable->isImmutableCOWBuffer ();
168
+ }
169
+
170
+ template <>
171
+ bool RefCounts<InlineRefCountBits>::setIsImmutableCOWBuffer(bool immutable) {
172
+ HeapObjectSideTableEntry *sideTable = allocateSideTable (false );
173
+ assert (sideTable);
174
+ bool oldValue = sideTable->isImmutableCOWBuffer ();
175
+ sideTable->setIsImmutableCOWBuffer (immutable);
176
+ return oldValue;
177
+ }
178
+
179
+ #endif
180
+
159
181
// namespace swift
160
182
} // namespace swift
161
183
You can’t perform that action at this time.
0 commit comments