@@ -393,53 +393,45 @@ RT_API_ATTRS static void Assign(
393
393
// Copy the data components (incl. the parent) first.
394
394
const Descriptor &componentDesc{updatedToDerived->component ()};
395
395
std::size_t numComponents{componentDesc.Elements ()};
396
- for (std::size_t k{0 }; k < numComponents; ++k) {
397
- const auto &comp{
398
- *componentDesc.ZeroBasedIndexedElement <typeInfo::Component>(
399
- k)}; // TODO: exploit contiguity here
400
- // Use PolymorphicLHS for components so that the right things happen
401
- // when the components are polymorphic; when they're not, they're both
402
- // not, and their declared types will match.
403
- int nestedFlags{MaybeReallocate | PolymorphicLHS};
404
- if (flags & ComponentCanBeDefinedAssignment) {
405
- nestedFlags |= CanBeDefinedAssignment | ComponentCanBeDefinedAssignment;
406
- }
407
- switch (comp.genre ()) {
408
- case typeInfo::Component::Genre::Data:
409
- if (comp.category () == TypeCategory::Derived) {
410
- StaticDescriptor<maxRank, true , 10 /* ?*/ > statDesc[2 ];
411
- Descriptor &toCompDesc{statDesc[0 ].descriptor ()};
412
- Descriptor &fromCompDesc{statDesc[1 ].descriptor ()};
413
- for (std::size_t j{0 }; j < toElements; ++j,
414
- to.IncrementSubscripts (toAt), from.IncrementSubscripts (fromAt)) {
396
+ for (std::size_t j{0 }; j < toElements;
397
+ ++j, to.IncrementSubscripts (toAt), from.IncrementSubscripts (fromAt)) {
398
+ for (std::size_t k{0 }; k < numComponents; ++k) {
399
+ const auto &comp{
400
+ *componentDesc.ZeroBasedIndexedElement <typeInfo::Component>(
401
+ k)}; // TODO: exploit contiguity here
402
+ // Use PolymorphicLHS for components so that the right things happen
403
+ // when the components are polymorphic; when they're not, they're both
404
+ // not, and their declared types will match.
405
+ int nestedFlags{MaybeReallocate | PolymorphicLHS};
406
+ if (flags & ComponentCanBeDefinedAssignment) {
407
+ nestedFlags |=
408
+ CanBeDefinedAssignment | ComponentCanBeDefinedAssignment;
409
+ }
410
+ switch (comp.genre ()) {
411
+ case typeInfo::Component::Genre::Data:
412
+ if (comp.category () == TypeCategory::Derived) {
413
+ StaticDescriptor<maxRank, true , 10 /* ?*/ > statDesc[2 ];
414
+ Descriptor &toCompDesc{statDesc[0 ].descriptor ()};
415
+ Descriptor &fromCompDesc{statDesc[1 ].descriptor ()};
415
416
comp.CreatePointerDescriptor (toCompDesc, to, terminator, toAt);
416
417
comp.CreatePointerDescriptor (
417
418
fromCompDesc, from, terminator, fromAt);
418
419
Assign (toCompDesc, fromCompDesc, terminator, nestedFlags);
419
- }
420
- } else { // Component has intrinsic type; simply copy raw bytes
421
- std::size_t componentByteSize{comp.SizeInBytes (to)};
422
- for (std::size_t j{0 }; j < toElements; ++j,
423
- to.IncrementSubscripts (toAt), from.IncrementSubscripts (fromAt)) {
420
+ } else { // Component has intrinsic type; simply copy raw bytes
421
+ std::size_t componentByteSize{comp.SizeInBytes (to)};
424
422
Fortran::runtime::memmove (to.Element <char >(toAt) + comp.offset (),
425
423
from.Element <const char >(fromAt) + comp.offset (),
426
424
componentByteSize);
427
425
}
428
- }
429
- break ;
430
- case typeInfo::Component::Genre::Pointer: {
431
- std::size_t componentByteSize{comp.SizeInBytes (to)};
432
- for (std::size_t j{0 }; j < toElements; ++j,
433
- to.IncrementSubscripts (toAt), from.IncrementSubscripts (fromAt)) {
426
+ break ;
427
+ case typeInfo::Component::Genre::Pointer: {
428
+ std::size_t componentByteSize{comp.SizeInBytes (to)};
434
429
Fortran::runtime::memmove (to.Element <char >(toAt) + comp.offset (),
435
430
from.Element <const char >(fromAt) + comp.offset (),
436
431
componentByteSize);
437
- }
438
- } break ;
439
- case typeInfo::Component::Genre::Allocatable:
440
- case typeInfo::Component::Genre::Automatic:
441
- for (std::size_t j{0 }; j < toElements; ++j,
442
- to.IncrementSubscripts (toAt), from.IncrementSubscripts (fromAt)) {
432
+ } break ;
433
+ case typeInfo::Component::Genre::Allocatable:
434
+ case typeInfo::Component::Genre::Automatic: {
443
435
auto *toDesc{reinterpret_cast <Descriptor *>(
444
436
to.Element <char >(toAt) + comp.offset ())};
445
437
const auto *fromDesc{reinterpret_cast <const Descriptor *>(
@@ -470,18 +462,16 @@ RT_API_ATTRS static void Assign(
470
462
// The actual deallocation may be avoided, if the existing
471
463
// location can be reoccupied.
472
464
Assign (*toDesc, *fromDesc, terminator, nestedFlags | DeallocateLHS);
465
+ } break ;
473
466
}
474
- break ;
475
467
}
476
- }
477
- // Copy procedure pointer components
478
- const Descriptor &procPtrDesc{updatedToDerived->procPtr ()};
479
- std::size_t numProcPtrs{procPtrDesc.Elements ()};
480
- for (std::size_t k{0 }; k < numProcPtrs; ++k) {
481
- const auto &procPtr{
482
- *procPtrDesc.ZeroBasedIndexedElement <typeInfo::ProcPtrComponent>(k)};
483
- for (std::size_t j{0 }; j < toElements; ++j, to.IncrementSubscripts (toAt),
484
- from.IncrementSubscripts (fromAt)) {
468
+ // Copy procedure pointer components
469
+ const Descriptor &procPtrDesc{updatedToDerived->procPtr ()};
470
+ std::size_t numProcPtrs{procPtrDesc.Elements ()};
471
+ for (std::size_t k{0 }; k < numProcPtrs; ++k) {
472
+ const auto &procPtr{
473
+ *procPtrDesc.ZeroBasedIndexedElement <typeInfo::ProcPtrComponent>(
474
+ k)};
485
475
Fortran::runtime::memmove (to.Element <char >(toAt) + procPtr.offset ,
486
476
from.Element <const char >(fromAt) + procPtr.offset ,
487
477
sizeof (typeInfo::ProcedurePointer));
0 commit comments