Skip to content

Commit 06e7a85

Browse files
committed
allow structs to have pointers to themselves
1 parent d9be120 commit 06e7a85

File tree

1 file changed

+28
-5
lines changed

1 file changed

+28
-5
lines changed

source/compiler.d

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -156,22 +156,41 @@ class CompilerBackend {
156156
offset = GetType(node.inheritsFrom).size;
157157
}
158158

159+
UsedType*[] copiesOfMe;
160+
159161
foreach (ref member ; node.members) {
160-
if (!TypeExists(member.type.name)) {
162+
bool canUseMyself = false;
163+
164+
if ((member.type.name == node.name) && member.type.ptr) {
165+
canUseMyself = true;
166+
}
167+
168+
if (!canUseMyself && !TypeExists(member.type.name)) {
161169
Error(node.error, "Type '%s' doesn't exist", member.type.name);
162170
}
163171
if (members.canFind(member.name)) {
164172
Error(node.error, "Duplicate member '%s'", member.name);
165173
}
166174

167-
UsedType memberType = UsedType(GetType(member.type.name), member.type.ptr);
168-
memberType.ptr = member.type.ptr;
175+
UsedType memberType;
176+
if (canUseMyself) {
177+
memberType = UsedType(
178+
Type.init, member.type.ptr
179+
);
180+
}
181+
else {
182+
memberType = UsedType(
183+
GetType(member.type.name), member.type.ptr
184+
);
185+
}
186+
memberType.ptr = member.type.ptr;
169187

170188
auto newMember = StructEntry(
171189
memberType, member.name, member.array, memberType.Size(), offset
172190
);
173-
entries ~= newMember;
174-
members ~= member.name;
191+
entries ~= newMember;
192+
members ~= member.name;
193+
copiesOfMe ~= &entries[$ - 1].type;
175194

176195
offset += newMember.array?
177196
newMember.type.Size() * newMember.size : newMember.type.Size();
@@ -183,6 +202,10 @@ class CompilerBackend {
183202

184203
NewConst(format("%s.sizeOf", node.name), offset);
185204
types ~= Type(node.name, offset, true, entries);
205+
206+
foreach (ref me ; copiesOfMe) {
207+
*me = UsedType(types[$ - 1], true);
208+
}
186209
}
187210

188211
void CompileEnum(EnumNode node) {

0 commit comments

Comments
 (0)