Skip to content

Commit 26b3549

Browse files
committed
[ABI] Added signedAsData bit to method descriptor flags.
It is necessary to determine whether a given method in a vtable or a witness table ought to be signed as data or as code. For example, async functions pointers must be signed as data.
1 parent c4c91e2 commit 26b3549

File tree

1 file changed

+24
-0
lines changed

1 file changed

+24
-0
lines changed

include/swift/ABI/MetadataValues.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,7 @@ class MethodDescriptorFlags {
317317
KindMask = 0x0F, // 16 kinds should be enough for anybody
318318
IsInstanceMask = 0x10,
319319
IsDynamicMask = 0x20,
320+
IsSignedAsDataMask = 0x40,
320321
ExtraDiscriminatorShift = 16,
321322
ExtraDiscriminatorMask = 0xFFFF0000,
322323
};
@@ -345,6 +346,15 @@ class MethodDescriptorFlags {
345346
return copy;
346347
}
347348

349+
MethodDescriptorFlags withIsSignedAsData(bool isSignedAsData) const {
350+
auto copy = *this;
351+
if (isSignedAsData)
352+
copy.Value |= IsSignedAsDataMask;
353+
else
354+
copy.Value &= ~IsSignedAsDataMask;
355+
return copy;
356+
}
357+
348358
MethodDescriptorFlags withExtraDiscriminator(uint16_t value) const {
349359
auto copy = *this;
350360
copy.Value = (copy.Value & ~ExtraDiscriminatorMask)
@@ -362,6 +372,8 @@ class MethodDescriptorFlags {
362372
/// Note that 'init' is not considered an instance member.
363373
bool isInstance() const { return Value & IsInstanceMask; }
364374

375+
bool isSignedAsData() const { return Value & IsSignedAsDataMask; }
376+
365377
uint16_t getExtraDiscriminator() const {
366378
return (Value >> ExtraDiscriminatorShift);
367379
}
@@ -527,6 +539,7 @@ class ProtocolRequirementFlags {
527539
enum : int_type {
528540
KindMask = 0x0F, // 16 kinds should be enough for anybody
529541
IsInstanceMask = 0x10,
542+
IsSignedAsDataMask = 0x20,
530543
ExtraDiscriminatorShift = 16,
531544
ExtraDiscriminatorMask = 0xFFFF0000,
532545
};
@@ -546,6 +559,15 @@ class ProtocolRequirementFlags {
546559
return copy;
547560
}
548561

562+
ProtocolRequirementFlags withIsSignedAsData(bool isSignedAsData) const {
563+
auto copy = *this;
564+
if (isSignedAsData)
565+
copy.Value |= IsSignedAsDataMask;
566+
else
567+
copy.Value &= ~IsSignedAsDataMask;
568+
return copy;
569+
}
570+
549571
ProtocolRequirementFlags withExtraDiscriminator(uint16_t value) const {
550572
auto copy = *this;
551573
copy.Value = (copy.Value & ~ExtraDiscriminatorMask)
@@ -560,6 +582,8 @@ class ProtocolRequirementFlags {
560582
/// Note that 'init' is not considered an instance member.
561583
bool isInstance() const { return Value & IsInstanceMask; }
562584

585+
bool isSignedAsData() const { return Value & IsSignedAsDataMask; }
586+
563587
bool isSignedWithAddress() const {
564588
return getKind() != Kind::BaseProtocol;
565589
}

0 commit comments

Comments
 (0)