Skip to content

Commit bc4d3f5

Browse files
committed
[c] Array of dynamic references to collections.
1 parent 8dfc42f commit bc4d3f5

File tree

5 files changed

+189
-175
lines changed

5 files changed

+189
-175
lines changed

GenC.fu

Lines changed: 47 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -695,6 +695,50 @@ public class GenC : GenCCpp
695695
WriteListFreeName(id);
696696
}
697697

698+
void WriteListFree!(FuClassType elementType)
699+
{
700+
switch (elementType.Class.Id) {
701+
case FuId.None:
702+
case FuId.ArrayPtrClass:
703+
if (elementType is FuDynamicPtrType) {
704+
this.SharedRelease = true;
705+
AddListFree(FuId.None);
706+
}
707+
else {
708+
Write("(GDestroyNotify) ");
709+
WriteName(elementType.Class);
710+
Write("_Destruct");
711+
}
712+
break;
713+
case FuId.StringClass:
714+
AddListFree(FuId.StringClass);
715+
break;
716+
case FuId.ListClass:
717+
case FuId.StackClass:
718+
AddListFree(FuId.ListClass);
719+
break;
720+
case FuId.QueueClass:
721+
AddListFree(FuId.QueueClass);
722+
break;
723+
case FuId.HashSetClass:
724+
case FuId.DictionaryClass:
725+
AddListFree(FuId.DictionaryClass);
726+
break;
727+
case FuId.SortedSetClass:
728+
case FuId.SortedDictionaryClass:
729+
AddListFree(FuId.SortedDictionaryClass);
730+
break;
731+
case FuId.RegexClass:
732+
AddListFree(FuId.RegexClass);
733+
break;
734+
case FuId.MatchClass:
735+
AddListFree(FuId.MatchClass);
736+
break;
737+
default:
738+
assert false;
739+
}
740+
}
741+
698742
protected override void WriteNewArray!(FuType elementType, FuExpr lengthExpr, FuPriority parent)
699743
{
700744
this.SharedMake = true;
@@ -715,11 +759,10 @@ public class GenC : GenCCpp
715759
case FuStorageType storage:
716760
WriteXstructorPtrs(storage.Class);
717761
break;
718-
case FuDynamicPtrType:
762+
case FuDynamicPtrType dynamic:
719763
this.PtrConstruct = true;
720-
this.SharedRelease = true;
721764
Write("(FuMethodPtr) FuPtr_Construct, ");
722-
AddListFree(FuId.None);
765+
WriteListFree(dynamic);
723766
break;
724767
default:
725768
Write("NULL, NULL");
@@ -1454,47 +1497,7 @@ public class GenC : GenCCpp
14541497
Write("g_array_set_clear_func(");
14551498
WriteArrayElement(def, nesting);
14561499
Write(", ");
1457-
assert type.AsClassType().GetElementType() is FuClassType elementType;
1458-
switch (elementType.Class.Id) {
1459-
case FuId.None:
1460-
case FuId.ArrayPtrClass:
1461-
if (elementType is FuDynamicPtrType) {
1462-
this.SharedRelease = true;
1463-
AddListFree(FuId.None);
1464-
}
1465-
else {
1466-
Write("(GDestroyNotify) ");
1467-
WriteName(elementType.Class);
1468-
Write("_Destruct");
1469-
}
1470-
break;
1471-
case FuId.StringClass:
1472-
AddListFree(FuId.StringClass);
1473-
break;
1474-
case FuId.ListClass:
1475-
case FuId.StackClass:
1476-
AddListFree(FuId.ListClass);
1477-
break;
1478-
case FuId.QueueClass:
1479-
AddListFree(FuId.QueueClass);
1480-
break;
1481-
case FuId.HashSetClass:
1482-
case FuId.DictionaryClass:
1483-
AddListFree(FuId.DictionaryClass);
1484-
break;
1485-
case FuId.SortedSetClass:
1486-
case FuId.SortedDictionaryClass:
1487-
AddListFree(FuId.SortedDictionaryClass);
1488-
break;
1489-
case FuId.RegexClass:
1490-
AddListFree(FuId.RegexClass);
1491-
break;
1492-
case FuId.MatchClass:
1493-
AddListFree(FuId.MatchClass);
1494-
break;
1495-
default:
1496-
assert false;
1497-
}
1500+
WriteListFree(type.AsClassType().GetElementType().AsClassType());
14981501
WriteLine(");");
14991502
}
15001503
while (--nesting >= 0)

libfut.cpp

Lines changed: 47 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -9584,6 +9584,50 @@ void GenC::addListFree(FuId id)
95849584
writeListFreeName(id);
95859585
}
95869586

9587+
void GenC::writeListFree(const FuClassType * elementType)
9588+
{
9589+
switch (elementType->class_->id) {
9590+
case FuId::none:
9591+
case FuId::arrayPtrClass:
9592+
if (dynamic_cast<const FuDynamicPtrType *>(elementType)) {
9593+
this->sharedRelease = true;
9594+
addListFree(FuId::none);
9595+
}
9596+
else {
9597+
write("(GDestroyNotify) ");
9598+
writeName(elementType->class_);
9599+
write("_Destruct");
9600+
}
9601+
break;
9602+
case FuId::stringClass:
9603+
addListFree(FuId::stringClass);
9604+
break;
9605+
case FuId::listClass:
9606+
case FuId::stackClass:
9607+
addListFree(FuId::listClass);
9608+
break;
9609+
case FuId::queueClass:
9610+
addListFree(FuId::queueClass);
9611+
break;
9612+
case FuId::hashSetClass:
9613+
case FuId::dictionaryClass:
9614+
addListFree(FuId::dictionaryClass);
9615+
break;
9616+
case FuId::sortedSetClass:
9617+
case FuId::sortedDictionaryClass:
9618+
addListFree(FuId::sortedDictionaryClass);
9619+
break;
9620+
case FuId::regexClass:
9621+
addListFree(FuId::regexClass);
9622+
break;
9623+
case FuId::matchClass:
9624+
addListFree(FuId::matchClass);
9625+
break;
9626+
default:
9627+
std::abort();
9628+
}
9629+
}
9630+
95879631
void GenC::writeNewArray(const FuType * elementType, const FuExpr * lengthExpr, FuPriority parent)
95889632
{
95899633
this->sharedMake = true;
@@ -9602,11 +9646,10 @@ void GenC::writeNewArray(const FuType * elementType, const FuExpr * lengthExpr,
96029646
}
96039647
else if (const FuStorageType *storage = dynamic_cast<const FuStorageType *>(elementType))
96049648
writeXstructorPtrs(storage->class_);
9605-
else if (dynamic_cast<const FuDynamicPtrType *>(elementType)) {
9649+
else if (const FuDynamicPtrType *dynamic = dynamic_cast<const FuDynamicPtrType *>(elementType)) {
96069650
this->ptrConstruct = true;
9607-
this->sharedRelease = true;
96089651
write("(FuMethodPtr) FuPtr_Construct, ");
9609-
addListFree(FuId::none);
9652+
writeListFree(dynamic);
96109653
}
96119654
else
96129655
write("NULL, NULL");
@@ -10320,47 +10363,7 @@ void GenC::writeInitCode(const FuNamedValue * def)
1032010363
write("g_array_set_clear_func(");
1032110364
writeArrayElement(def, nesting);
1032210365
write(", ");
10323-
const FuClassType * elementType = static_cast<const FuClassType *>(type->asClassType()->getElementType().get());
10324-
switch (elementType->class_->id) {
10325-
case FuId::none:
10326-
case FuId::arrayPtrClass:
10327-
if (dynamic_cast<const FuDynamicPtrType *>(elementType)) {
10328-
this->sharedRelease = true;
10329-
addListFree(FuId::none);
10330-
}
10331-
else {
10332-
write("(GDestroyNotify) ");
10333-
writeName(elementType->class_);
10334-
write("_Destruct");
10335-
}
10336-
break;
10337-
case FuId::stringClass:
10338-
addListFree(FuId::stringClass);
10339-
break;
10340-
case FuId::listClass:
10341-
case FuId::stackClass:
10342-
addListFree(FuId::listClass);
10343-
break;
10344-
case FuId::queueClass:
10345-
addListFree(FuId::queueClass);
10346-
break;
10347-
case FuId::hashSetClass:
10348-
case FuId::dictionaryClass:
10349-
addListFree(FuId::dictionaryClass);
10350-
break;
10351-
case FuId::sortedSetClass:
10352-
case FuId::sortedDictionaryClass:
10353-
addListFree(FuId::sortedDictionaryClass);
10354-
break;
10355-
case FuId::regexClass:
10356-
addListFree(FuId::regexClass);
10357-
break;
10358-
case FuId::matchClass:
10359-
addListFree(FuId::matchClass);
10360-
break;
10361-
default:
10362-
std::abort();
10363-
}
10366+
writeListFree(type->asClassType()->getElementType()->asClassType());
1036410367
writeLine(");");
1036510368
}
1036610369
while (--nesting >= 0)

libfut.cs

Lines changed: 47 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -9875,6 +9875,50 @@ void AddListFree(FuId id)
98759875
WriteListFreeName(id);
98769876
}
98779877

9878+
void WriteListFree(FuClassType elementType)
9879+
{
9880+
switch (elementType.Class.Id) {
9881+
case FuId.None:
9882+
case FuId.ArrayPtrClass:
9883+
if (elementType is FuDynamicPtrType) {
9884+
this.SharedRelease = true;
9885+
AddListFree(FuId.None);
9886+
}
9887+
else {
9888+
Write("(GDestroyNotify) ");
9889+
WriteName(elementType.Class);
9890+
Write("_Destruct");
9891+
}
9892+
break;
9893+
case FuId.StringClass:
9894+
AddListFree(FuId.StringClass);
9895+
break;
9896+
case FuId.ListClass:
9897+
case FuId.StackClass:
9898+
AddListFree(FuId.ListClass);
9899+
break;
9900+
case FuId.QueueClass:
9901+
AddListFree(FuId.QueueClass);
9902+
break;
9903+
case FuId.HashSetClass:
9904+
case FuId.DictionaryClass:
9905+
AddListFree(FuId.DictionaryClass);
9906+
break;
9907+
case FuId.SortedSetClass:
9908+
case FuId.SortedDictionaryClass:
9909+
AddListFree(FuId.SortedDictionaryClass);
9910+
break;
9911+
case FuId.RegexClass:
9912+
AddListFree(FuId.RegexClass);
9913+
break;
9914+
case FuId.MatchClass:
9915+
AddListFree(FuId.MatchClass);
9916+
break;
9917+
default:
9918+
throw new NotImplementedException();
9919+
}
9920+
}
9921+
98789922
protected override void WriteNewArray(FuType elementType, FuExpr lengthExpr, FuPriority parent)
98799923
{
98809924
this.SharedMake = true;
@@ -9895,11 +9939,10 @@ protected override void WriteNewArray(FuType elementType, FuExpr lengthExpr, FuP
98959939
case FuStorageType storage:
98969940
WriteXstructorPtrs(storage.Class);
98979941
break;
9898-
case FuDynamicPtrType:
9942+
case FuDynamicPtrType dynamic:
98999943
this.PtrConstruct = true;
9900-
this.SharedRelease = true;
99019944
Write("(FuMethodPtr) FuPtr_Construct, ");
9902-
AddListFree(FuId.None);
9945+
WriteListFree(dynamic);
99039946
break;
99049947
default:
99059948
Write("NULL, NULL");
@@ -10619,47 +10662,7 @@ protected override void WriteInitCode(FuNamedValue def)
1061910662
Write("g_array_set_clear_func(");
1062010663
WriteArrayElement(def, nesting);
1062110664
Write(", ");
10622-
FuClassType elementType = (FuClassType) type.AsClassType().GetElementType();
10623-
switch (elementType.Class.Id) {
10624-
case FuId.None:
10625-
case FuId.ArrayPtrClass:
10626-
if (elementType is FuDynamicPtrType) {
10627-
this.SharedRelease = true;
10628-
AddListFree(FuId.None);
10629-
}
10630-
else {
10631-
Write("(GDestroyNotify) ");
10632-
WriteName(elementType.Class);
10633-
Write("_Destruct");
10634-
}
10635-
break;
10636-
case FuId.StringClass:
10637-
AddListFree(FuId.StringClass);
10638-
break;
10639-
case FuId.ListClass:
10640-
case FuId.StackClass:
10641-
AddListFree(FuId.ListClass);
10642-
break;
10643-
case FuId.QueueClass:
10644-
AddListFree(FuId.QueueClass);
10645-
break;
10646-
case FuId.HashSetClass:
10647-
case FuId.DictionaryClass:
10648-
AddListFree(FuId.DictionaryClass);
10649-
break;
10650-
case FuId.SortedSetClass:
10651-
case FuId.SortedDictionaryClass:
10652-
AddListFree(FuId.SortedDictionaryClass);
10653-
break;
10654-
case FuId.RegexClass:
10655-
AddListFree(FuId.RegexClass);
10656-
break;
10657-
case FuId.MatchClass:
10658-
AddListFree(FuId.MatchClass);
10659-
break;
10660-
default:
10661-
throw new NotImplementedException();
10662-
}
10665+
WriteListFree(type.AsClassType().GetElementType().AsClassType());
1066310666
WriteLine(");");
1066410667
}
1066510668
while (--nesting >= 0)

libfut.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2142,6 +2142,7 @@ class GenC : public GenCCpp
21422142
void writeXstructorPtrs(const FuClass * klass);
21432143
void writeListFreeName(FuId id);
21442144
void addListFree(FuId id);
2145+
void writeListFree(const FuClassType * elementType);
21452146
void writeStringStorageValue(const FuExpr * expr);
21462147
bool writeDestructMethodName(const FuClassType * klass);
21472148
static bool hasDictionaryDestroy(const FuType * type);

0 commit comments

Comments
 (0)