@@ -19,19 +19,20 @@ int Initialize(const Descriptor &instance, const typeInfo::DerivedType &derived,
19
19
Terminator &terminator, bool hasStat, const Descriptor *errMsg) {
20
20
const Descriptor &componentDesc{derived.component ()};
21
21
std::size_t elements{instance.Elements ()};
22
- std::size_t byteStride{instance.ElementBytes ()};
23
22
int stat{StatOk};
24
23
// Initialize data components in each element; the per-element iterations
25
24
// constitute the inner loops, not the outer ones
26
25
std::size_t myComponents{componentDesc.Elements ()};
27
26
for (std::size_t k{0 }; k < myComponents; ++k) {
28
27
const auto &comp{
29
28
*componentDesc.ZeroBasedIndexedElement <typeInfo::Component>(k)};
29
+ SubscriptValue at[maxRank];
30
+ instance.GetLowerBounds (at);
30
31
if (comp.genre () == typeInfo::Component::Genre::Allocatable ||
31
32
comp.genre () == typeInfo::Component::Genre::Automatic) {
32
- for (std::size_t j{0 }; j < elements; ++j ) {
33
- Descriptor &allocDesc{*instance. OffsetElement <Descriptor>(
34
- j * byteStride + comp.offset ())};
33
+ for (std::size_t j{0 }; j++ < elements; instance. IncrementSubscripts (at) ) {
34
+ Descriptor &allocDesc{
35
+ *instance. ElementComponent <Descriptor>(at, comp.offset ())};
35
36
comp.EstablishDescriptor (allocDesc, instance, terminator);
36
37
allocDesc.raw ().attribute = CFI_attribute_allocatable;
37
38
if (comp.genre () == typeInfo::Component::Genre::Automatic) {
@@ -55,17 +56,17 @@ int Initialize(const Descriptor &instance, const typeInfo::DerivedType &derived,
55
56
// Explicit initialization of data pointers and
56
57
// non-allocatable non-automatic components
57
58
std::size_t bytes{comp.SizeInBytes (instance)};
58
- for (std::size_t j{0 }; j < elements; ++j ) {
59
- char *ptr{instance.ZeroBasedIndexedElement <char >(j) + comp.offset ()};
59
+ for (std::size_t j{0 }; j++ < elements; instance. IncrementSubscripts (at) ) {
60
+ char *ptr{instance.ElementComponent <char >(at, comp.offset () )};
60
61
std::memcpy (ptr, init, bytes);
61
62
}
62
63
} else if (comp.genre () == typeInfo::Component::Genre::Pointer) {
63
64
// Data pointers without explicit initialization are established
64
65
// so that they are valid right-hand side targets of pointer
65
66
// assignment statements.
66
- for (std::size_t j{0 }; j < elements; ++j ) {
67
- Descriptor &ptrDesc{*instance. OffsetElement <Descriptor>(
68
- j * byteStride + comp.offset ())};
67
+ for (std::size_t j{0 }; j++ < elements; instance. IncrementSubscripts (at) ) {
68
+ Descriptor &ptrDesc{
69
+ *instance. ElementComponent <Descriptor>(at, comp.offset ())};
69
70
comp.EstablishDescriptor (ptrDesc, instance, terminator);
70
71
ptrDesc.raw ().attribute = CFI_attribute_pointer;
71
72
}
@@ -85,10 +86,10 @@ int Initialize(const Descriptor &instance, const typeInfo::DerivedType &derived,
85
86
StaticDescriptor<maxRank, true , 0 > staticDescriptor;
86
87
Descriptor &compDesc{staticDescriptor.descriptor ()};
87
88
const typeInfo::DerivedType &compType{*comp.derivedType ()};
88
- for (std::size_t j{0 }; j < elements; ++j ) {
89
+ for (std::size_t j{0 }; j++ < elements; instance. IncrementSubscripts (at) ) {
89
90
compDesc.Establish (compType,
90
- instance.OffsetElement <char >(j * byteStride + comp.offset ()),
91
- comp. rank (), extent);
91
+ instance.ElementComponent <char >(at, comp.offset ()), comp. rank ( ),
92
+ extent);
92
93
stat = Initialize (compDesc, compType, terminator, hasStat, errMsg);
93
94
if (stat != StatOk) {
94
95
break ;
@@ -102,9 +103,11 @@ int Initialize(const Descriptor &instance, const typeInfo::DerivedType &derived,
102
103
for (std::size_t k{0 }; k < myProcPtrs; ++k) {
103
104
const auto &comp{
104
105
*procPtrDesc.ZeroBasedIndexedElement <typeInfo::ProcPtrComponent>(k)};
105
- for (std::size_t j{0 }; j < elements; ++j) {
106
- auto &pptr{*instance.OffsetElement <typeInfo::ProcedurePointer>(
107
- j * byteStride + comp.offset )};
106
+ SubscriptValue at[maxRank];
107
+ instance.GetLowerBounds (at);
108
+ for (std::size_t j{0 }; j++ < elements; instance.IncrementSubscripts (at)) {
109
+ auto &pptr{*instance.ElementComponent <typeInfo::ProcedurePointer>(
110
+ at, comp.offset )};
108
111
pptr = comp.procInitialization ;
109
112
}
110
113
}
@@ -129,24 +132,26 @@ static void CallFinalSubroutine(const Descriptor &descriptor,
129
132
const typeInfo::DerivedType &derived, Terminator *terminator) {
130
133
if (const auto *special{FindFinal (derived, descriptor.rank ())}) {
131
134
if (special->which () == typeInfo::SpecialBinding::Which::ElementalFinal) {
132
- std::size_t byteStride{descriptor.ElementBytes ()};
133
135
std::size_t elements{descriptor.Elements ()};
136
+ SubscriptValue at[maxRank];
137
+ descriptor.GetLowerBounds (at);
134
138
if (special->IsArgDescriptor (0 )) {
135
139
StaticDescriptor<maxRank, true , 8 /* ?*/ > statDesc;
136
140
Descriptor &elemDesc{statDesc.descriptor ()};
137
141
elemDesc = descriptor;
138
142
elemDesc.raw ().attribute = CFI_attribute_pointer;
139
143
elemDesc.raw ().rank = 0 ;
140
144
auto *p{special->GetProc <void (*)(const Descriptor &)>()};
141
- for (std::size_t j{0 }; j < elements; ++j) {
142
- elemDesc. set_base_addr (
143
- descriptor.OffsetElement <char >(j * byteStride ));
145
+ for (std::size_t j{0 }; j++ < elements;
146
+ descriptor. IncrementSubscripts (at)) {
147
+ elemDesc. set_base_addr ( descriptor.Element <char >(at ));
144
148
p (elemDesc);
145
149
}
146
150
} else {
147
151
auto *p{special->GetProc <void (*)(char *)>()};
148
- for (std::size_t j{0 }; j < elements; ++j) {
149
- p (descriptor.OffsetElement <char >(j * byteStride));
152
+ for (std::size_t j{0 }; j++ < elements;
153
+ descriptor.IncrementSubscripts (at)) {
154
+ p (descriptor.Element <char >(at));
150
155
}
151
156
}
152
157
} else {
@@ -202,20 +207,22 @@ void Finalize(const Descriptor &descriptor,
202
207
const Descriptor &componentDesc{derived.component ()};
203
208
std::size_t myComponents{componentDesc.Elements ()};
204
209
std::size_t elements{descriptor.Elements ()};
205
- std::size_t byteStride{descriptor.ElementBytes ()};
206
210
for (auto k{recurse ? std::size_t {1 }
207
211
/* skip first component, it's the parent */
208
212
: 0 };
209
213
k < myComponents; ++k) {
210
214
const auto &comp{
211
215
*componentDesc.ZeroBasedIndexedElement <typeInfo::Component>(k)};
216
+ SubscriptValue at[maxRank];
217
+ descriptor.GetLowerBounds (at);
212
218
if (comp.genre () == typeInfo::Component::Genre::Allocatable &&
213
219
comp.category () == TypeCategory::Derived) {
214
220
// Component may be polymorphic or unlimited polymorphic. Need to use the
215
221
// dynamic type to check whether finalization is needed.
216
- for (std::size_t j{0 }; j < elements; ++j) {
217
- const Descriptor &compDesc{*descriptor.OffsetElement <Descriptor>(
218
- j * byteStride + comp.offset ())};
222
+ for (std::size_t j{0 }; j++ < elements;
223
+ descriptor.IncrementSubscripts (at)) {
224
+ const Descriptor &compDesc{
225
+ *descriptor.ElementComponent <Descriptor>(at, comp.offset ())};
219
226
if (compDesc.IsAllocated ()) {
220
227
if (const DescriptorAddendum * addendum{compDesc.Addendum ()}) {
221
228
if (const typeInfo::DerivedType *
@@ -231,9 +238,10 @@ void Finalize(const Descriptor &descriptor,
231
238
comp.genre () == typeInfo::Component::Genre::Automatic) {
232
239
if (const typeInfo::DerivedType * compType{comp.derivedType ()}) {
233
240
if (!compType->noFinalizationNeeded ()) {
234
- for (std::size_t j{0 }; j < elements; ++j) {
235
- const Descriptor &compDesc{*descriptor.OffsetElement <Descriptor>(
236
- j * byteStride + comp.offset ())};
241
+ for (std::size_t j{0 }; j++ < elements;
242
+ descriptor.IncrementSubscripts (at)) {
243
+ const Descriptor &compDesc{
244
+ *descriptor.ElementComponent <Descriptor>(at, comp.offset ())};
237
245
if (compDesc.IsAllocated ()) {
238
246
Finalize (compDesc, *compType, terminator);
239
247
}
@@ -253,16 +261,23 @@ void Finalize(const Descriptor &descriptor,
253
261
StaticDescriptor<maxRank, true , 0 > staticDescriptor;
254
262
Descriptor &compDesc{staticDescriptor.descriptor ()};
255
263
const typeInfo::DerivedType &compType{*comp.derivedType ()};
256
- for (std::size_t j{0 }; j < elements; ++j) {
264
+ for (std::size_t j{0 }; j++ < elements;
265
+ descriptor.IncrementSubscripts (at)) {
257
266
compDesc.Establish (compType,
258
- descriptor.OffsetElement <char >(j * byteStride + comp.offset ()),
259
- comp. rank (), extent);
267
+ descriptor.ElementComponent <char >(at, comp.offset ()), comp. rank ( ),
268
+ extent);
260
269
Finalize (compDesc, compType, terminator);
261
270
}
262
271
}
263
272
}
264
273
if (recurse) {
265
- Finalize (descriptor, *parentType, terminator);
274
+ StaticDescriptor<maxRank, true , 8 /* ?*/ > statDesc;
275
+ Descriptor &tmpDesc{statDesc.descriptor ()};
276
+ tmpDesc = descriptor;
277
+ tmpDesc.raw ().attribute = CFI_attribute_pointer;
278
+ tmpDesc.Addendum ()->set_derivedType (parentType);
279
+ tmpDesc.raw ().elem_len = parentType->sizeInBytes ();
280
+ Finalize (tmpDesc, *parentType, terminator);
266
281
}
267
282
}
268
283
@@ -289,8 +304,8 @@ void Destroy(const Descriptor &descriptor, bool finalize,
289
304
if (comp.genre () == typeInfo::Component::Genre::Allocatable ||
290
305
comp.genre () == typeInfo::Component::Genre::Automatic) {
291
306
for (std::size_t j{0 }; j < elements; ++j) {
292
- Descriptor *d{reinterpret_cast <Descriptor *>(
293
- descriptor.Element < char >(at) + comp.offset ())};
307
+ Descriptor *d{
308
+ descriptor.ElementComponent <Descriptor >(at, comp.offset ())};
294
309
d->Deallocate ();
295
310
descriptor.IncrementSubscripts (at);
296
311
}
0 commit comments