@@ -296,9 +296,11 @@ class GenericMetadataBuilder {
296
296
patternPointers->resolvePointer (&patternPointers->ptr [i]);
297
297
if (!patternPointer)
298
298
return *patternPointer.getError ();
299
- data.writePointer (
299
+ auto writeResult = data.writePointer (
300
300
&metadataExtraData[i + extraDataPattern->OffsetInWords ],
301
301
patternPointer->template cast <const StoredPointer>());
302
+ if (!writeResult)
303
+ return *writeResult.getError ();
302
304
}
303
305
}
304
306
@@ -310,7 +312,10 @@ class GenericMetadataBuilder {
310
312
if (!valueWitnesses)
311
313
return *valueWitnesses.getError ();
312
314
METADATA_BUILDER_LOG (" Setting initial value witnesses" );
313
- data.writePointer (&fullMetadata->ValueWitnesses , *valueWitnesses);
315
+ auto writeResult =
316
+ data.writePointer (&fullMetadata->ValueWitnesses , *valueWitnesses);
317
+ if (!writeResult)
318
+ return *writeResult.getError ();
314
319
315
320
// Set the metadata kind.
316
321
METADATA_BUILDER_LOG (" Setting metadata kind %#x" ,
@@ -319,7 +324,9 @@ class GenericMetadataBuilder {
319
324
320
325
// Set the type descriptor.
321
326
METADATA_BUILDER_LOG (" Setting descriptor" );
322
- data.writePointer (&metadata->Description , descriptionBuffer);
327
+ writeResult = data.writePointer (&metadata->Description , descriptionBuffer);
328
+ if (!writeResult)
329
+ return *writeResult.getError ();
323
330
324
331
return {{}};
325
332
}
@@ -353,8 +360,11 @@ class GenericMetadataBuilder {
353
360
header.NumKeyArguments ,
354
361
getGenericArgumentOffset (
355
362
descriptionBuffer.template cast <const TypeContextDescriptor>()));
356
- for (unsigned i = 0 ; i < header.NumKeyArguments ; i++)
357
- data.writePointer (&dst[i], arguments[i]);
363
+ for (unsigned i = 0 ; i < header.NumKeyArguments ; i++) {
364
+ auto writeResult = data.writePointer (&dst[i], arguments[i]);
365
+ if (!writeResult)
366
+ return *writeResult.getError ();
367
+ }
358
368
359
369
// TODO: parameter pack support.
360
370
@@ -495,7 +505,11 @@ class GenericMetadataBuilder {
495
505
auto LOWER_ID##_Buffer = from.resolveFunctionPointer (&from.ptr ->LOWER_ID ); \
496
506
if (!LOWER_ID##_Buffer) \
497
507
return *LOWER_ID##_Buffer.getError (); \
498
- vwtBuffer.writeFunctionPointer (&vwtBuffer.ptr ->LOWER_ID , *LOWER_ID##_Buffer);
508
+ if (auto *error = vwtBuffer \
509
+ .writeFunctionPointer (&vwtBuffer.ptr ->LOWER_ID , \
510
+ *LOWER_ID##_Buffer) \
511
+ .getError ()) \
512
+ return *error;
499
513
#define DATA_VALUE_WITNESS (LOWER_ID, UPPER_ID, TYPE )
500
514
#include " swift/ABI/ValueWitness.def"
501
515
@@ -520,40 +534,56 @@ class GenericMetadataBuilder {
520
534
(size_t )flags.getAlignmentMask ());
521
535
switch (sizeWithAlignmentMask (layout.size , flags.getAlignmentMask (),
522
536
hasExtraInhabitants)) {
523
- default :
537
+ default : {
524
538
// For uncommon layouts, use value witnesses that work with an arbitrary
525
539
// size and alignment.
526
540
METADATA_BUILDER_LOG (" Uncommon layout case, flags.isInlineStorage=%s" ,
527
541
flags.isInlineStorage () ? " true" : " false" );
528
542
if (flags.isInlineStorage ()) {
529
543
if (!pod_direct_initializeBufferWithCopyOfBuffer)
530
544
return *pod_direct_initializeBufferWithCopyOfBuffer.getError ();
531
- vwtBuffer.writeFunctionPointer (
545
+ auto writeResult = vwtBuffer.writeFunctionPointer (
532
546
&vwtBuffer.ptr ->initializeBufferWithCopyOfBuffer ,
533
547
*pod_direct_initializeBufferWithCopyOfBuffer);
548
+ if (!writeResult)
549
+ return *writeResult.getError ();
534
550
} else {
535
551
if (!pod_indirect_initializeBufferWithCopyOfBuffer)
536
552
return *pod_indirect_initializeBufferWithCopyOfBuffer.getError ();
537
- vwtBuffer.writeFunctionPointer (
553
+ auto writeResult = vwtBuffer.writeFunctionPointer (
538
554
&vwtBuffer.ptr ->initializeBufferWithCopyOfBuffer ,
539
555
*pod_indirect_initializeBufferWithCopyOfBuffer);
556
+ if (!writeResult)
557
+ return *writeResult.getError ();
540
558
}
541
559
if (!pod_destroy)
542
560
return *pod_destroy.getError ();
543
561
if (!pod_copy)
544
562
return *pod_copy.getError ();
545
- vwtBuffer.writeFunctionPointer (&vwtBuffer.ptr ->destroy , *pod_destroy);
546
- vwtBuffer.writeFunctionPointer (&vwtBuffer.ptr ->initializeWithCopy ,
547
- *pod_copy);
548
- vwtBuffer.writeFunctionPointer (&vwtBuffer.ptr ->initializeWithTake ,
549
- *pod_copy);
550
- vwtBuffer.writeFunctionPointer (&vwtBuffer.ptr ->assignWithCopy ,
551
- *pod_copy);
552
- vwtBuffer.writeFunctionPointer (&vwtBuffer.ptr ->assignWithTake ,
553
- *pod_copy);
563
+ auto writeResult = vwtBuffer.writeFunctionPointer (
564
+ &vwtBuffer.ptr ->destroy , *pod_destroy);
565
+ if (!writeResult)
566
+ return *writeResult.getError ();
567
+ writeResult = vwtBuffer.writeFunctionPointer (
568
+ &vwtBuffer.ptr ->initializeWithCopy , *pod_copy);
569
+ if (!writeResult)
570
+ return *writeResult.getError ();
571
+ writeResult = vwtBuffer.writeFunctionPointer (
572
+ &vwtBuffer.ptr ->initializeWithTake , *pod_copy);
573
+ if (!writeResult)
574
+ return *writeResult.getError ();
575
+ writeResult = vwtBuffer.writeFunctionPointer (
576
+ &vwtBuffer.ptr ->assignWithCopy , *pod_copy);
577
+ if (!writeResult)
578
+ return *writeResult.getError ();
579
+ writeResult = vwtBuffer.writeFunctionPointer (
580
+ &vwtBuffer.ptr ->assignWithTake , *pod_copy);
581
+ if (!writeResult)
582
+ return *writeResult.getError ();
554
583
// getEnumTagSinglePayload and storeEnumTagSinglePayload are not
555
584
// interestingly optimizable based on POD-ness.
556
585
return {{}};
586
+ }
557
587
558
588
case sizeWithAlignmentMask (1 , 0 , 0 ): {
559
589
METADATA_BUILDER_LOG (" case sizeWithAlignmentMask(1, 0, 0)" );
@@ -629,8 +659,10 @@ class GenericMetadataBuilder {
629
659
// Use POD value witnesses for operations that do an initializeWithTake.
630
660
if (!pod_copy)
631
661
return *pod_copy.getError ();
632
- vwtBuffer.writeFunctionPointer (&vwtBuffer.ptr ->initializeWithTake ,
633
- *pod_copy);
662
+ auto writeResult = vwtBuffer.writeFunctionPointer (
663
+ &vwtBuffer.ptr ->initializeWithTake , *pod_copy);
664
+ if (!writeResult)
665
+ return *writeResult.getError ();
634
666
}
635
667
return {{}};
636
668
}
@@ -761,7 +793,10 @@ class GenericMetadataBuilder {
761
793
auto fptr = oldVWTBuffer->resolveFunctionPointer (&oldVWT->LOWER_ID ); \
762
794
if (!fptr) \
763
795
return *fptr.getError (); \
764
- newVWTData.writeFunctionPointer (&newVWT->LOWER_ID , *fptr); \
796
+ if (auto *error = \
797
+ newVWTData.writeFunctionPointer (&newVWT->LOWER_ID , *fptr) \
798
+ .getError ()) \
799
+ return *error; \
765
800
}
766
801
#include " swift/ABI/ValueWitness.def"
767
802
@@ -774,9 +809,11 @@ class GenericMetadataBuilder {
774
809
newVWT->extraInhabitantCount = layout.extraInhabitantCount ;
775
810
newVWT->flags = layout.flags ;
776
811
777
- metadataBuffer.writePointer (
812
+ auto writeResult = metadataBuffer.writePointer (
778
813
&metadataBuffer.ptr ->ValueWitnesses ,
779
814
newVWTData.template cast <const ValueWitnessTable>());
815
+ if (!writeResult)
816
+ return *writeResult.getError ();
780
817
return {{}}; // success
781
818
}
782
819
0 commit comments