Skip to content

Commit b5d8828

Browse files
committed
[c] Release temporary dynamic references.
fusionlanguage#26
1 parent b6da317 commit b5d8828

File tree

5 files changed

+13
-13
lines changed

5 files changed

+13
-13
lines changed

GenC.fu

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1061,7 +1061,7 @@ public class GenC : GenCCpp
10611061
void WriteStorageTemporary!(FuExpr expr)
10621062
{
10631063
if (expr.IsNewString(false)
1064-
|| (expr is FuCallExpr && expr.Type is FuStorageType))
1064+
|| (expr is FuCallExpr && expr.Type is FuOwningType))
10651065
WriteCTemporary(expr.Type, expr);
10661066
}
10671067

@@ -1116,7 +1116,7 @@ public class GenC : GenCCpp
11161116
FuVar? param = method.FirstParameter();
11171117
foreach (FuExpr arg in call.Arguments) {
11181118
WriteCTemporaries(arg);
1119-
if (call.Method.Symbol.Id != FuId.ConsoleWrite && call.Method.Symbol.Id != FuId.ConsoleWriteLine && !(param.Type is FuStorageType))
1119+
if (call.Method.Symbol.Id != FuId.ConsoleWrite && call.Method.Symbol.Id != FuId.ConsoleWriteLine && param.Type.Id != FuId.TypeParam0NotFinal && !(param.Type is FuOwningType))
11201120
WriteStorageTemporary(arg);
11211121
param = param.NextVar();
11221122
}
@@ -1549,14 +1549,14 @@ public class GenC : GenCCpp
15491549
{
15501550
switch (type) {
15511551
case FuDynamicPtrType dynamic when expr is FuSymbolReference && parent != FuPriority.Equality:
1552-
this.SharedAddRef = true;
15531552
if (dynamic.Class.Id == FuId.ArrayPtrClass)
15541553
WriteDynamicArrayCast(dynamic.GetElementType());
15551554
else {
15561555
WriteChar('(');
15571556
WriteName(dynamic.Class);
15581557
Write(" *) ");
15591558
}
1559+
this.SharedAddRef = true;
15601560
WriteCall("FuShared_AddRef", expr);
15611561
break;
15621562
case FuClassType klass when klass.Class.Id != FuId.StringClass && klass.Class.Id != FuId.ArrayPtrClass && !(klass is FuStorageType):

libfut.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9971,7 +9971,7 @@ int GenC::writeCTemporary(const FuType * type, const FuExpr * expr)
99719971

99729972
void GenC::writeStorageTemporary(const FuExpr * expr)
99739973
{
9974-
if (expr->isNewString(false) || (dynamic_cast<const FuCallExpr *>(expr) && dynamic_cast<const FuStorageType *>(expr->type.get())))
9974+
if (expr->isNewString(false) || (dynamic_cast<const FuCallExpr *>(expr) && dynamic_cast<const FuOwningType *>(expr->type.get())))
99759975
writeCTemporary(expr->type.get(), expr);
99769976
}
99779977

@@ -10021,7 +10021,7 @@ void GenC::writeCTemporaries(const FuExpr * expr)
1002110021
const FuVar * param = method->firstParameter();
1002210022
for (const std::shared_ptr<FuExpr> &arg : call->arguments) {
1002310023
writeCTemporaries(arg.get());
10024-
if (call->method->symbol->id != FuId::consoleWrite && call->method->symbol->id != FuId::consoleWriteLine && !dynamic_cast<const FuStorageType *>(param->type.get()))
10024+
if (call->method->symbol->id != FuId::consoleWrite && call->method->symbol->id != FuId::consoleWriteLine && param->type->id != FuId::typeParam0NotFinal && !dynamic_cast<const FuOwningType *>(param->type.get()))
1002510025
writeStorageTemporary(arg.get());
1002610026
param = param->nextVar();
1002710027
}
@@ -10446,14 +10446,14 @@ void GenC::writeCoercedInternal(const FuType * type, const FuExpr * expr, FuPrio
1044610446
const FuDynamicPtrType * dynamic;
1044710447
const FuClassType * klass;
1044810448
if ((dynamic = dynamic_cast<const FuDynamicPtrType *>(type)) && dynamic_cast<const FuSymbolReference *>(expr) && parent != FuPriority::equality) {
10449-
this->sharedAddRef = true;
1045010449
if (dynamic->class_->id == FuId::arrayPtrClass)
1045110450
writeDynamicArrayCast(dynamic->getElementType().get());
1045210451
else {
1045310452
writeChar('(');
1045410453
writeName(dynamic->class_);
1045510454
write(" *) ");
1045610455
}
10456+
this->sharedAddRef = true;
1045710457
writeCall("FuShared_AddRef", expr);
1045810458
}
1045910459
else if ((klass = dynamic_cast<const FuClassType *>(type)) && klass->class_->id != FuId::stringClass && klass->class_->id != FuId::arrayPtrClass && !dynamic_cast<const FuStorageType *>(klass)) {

libfut.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10275,7 +10275,7 @@ int WriteCTemporary(FuType type, FuExpr expr)
1027510275

1027610276
void WriteStorageTemporary(FuExpr expr)
1027710277
{
10278-
if (expr.IsNewString(false) || (expr is FuCallExpr && expr.Type is FuStorageType))
10278+
if (expr.IsNewString(false) || (expr is FuCallExpr && expr.Type is FuOwningType))
1027910279
WriteCTemporary(expr.Type, expr);
1028010280
}
1028110281

@@ -10330,7 +10330,7 @@ void WriteCTemporaries(FuExpr expr)
1033010330
FuVar param = method.FirstParameter();
1033110331
foreach (FuExpr arg in call.Arguments) {
1033210332
WriteCTemporaries(arg);
10333-
if (call.Method.Symbol.Id != FuId.ConsoleWrite && call.Method.Symbol.Id != FuId.ConsoleWriteLine && !(param.Type is FuStorageType))
10333+
if (call.Method.Symbol.Id != FuId.ConsoleWrite && call.Method.Symbol.Id != FuId.ConsoleWriteLine && param.Type.Id != FuId.TypeParam0NotFinal && !(param.Type is FuOwningType))
1033410334
WriteStorageTemporary(arg);
1033510335
param = param.NextVar();
1033610336
}
@@ -10748,14 +10748,14 @@ protected override void WriteCoercedInternal(FuType type, FuExpr expr, FuPriorit
1074810748
{
1074910749
switch (type) {
1075010750
case FuDynamicPtrType dynamic when expr is FuSymbolReference && parent != FuPriority.Equality:
10751-
this.SharedAddRef = true;
1075210751
if (dynamic.Class.Id == FuId.ArrayPtrClass)
1075310752
WriteDynamicArrayCast(dynamic.GetElementType());
1075410753
else {
1075510754
WriteChar('(');
1075610755
WriteName(dynamic.Class);
1075710756
Write(" *) ");
1075810757
}
10758+
this.SharedAddRef = true;
1075910759
WriteCall("FuShared_AddRef", expr);
1076010760
break;
1076110761
case FuClassType klass when klass.Class.Id != FuId.StringClass && klass.Class.Id != FuId.ArrayPtrClass && !(klass is FuStorageType):

libfut.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10616,7 +10616,7 @@ export class GenC extends GenCCpp
1061610616

1061710617
#writeStorageTemporary(expr)
1061810618
{
10619-
if (expr.isNewString(false) || (expr instanceof FuCallExpr && expr.type instanceof FuStorageType))
10619+
if (expr.isNewString(false) || (expr instanceof FuCallExpr && expr.type instanceof FuOwningType))
1062010620
this.#writeCTemporary(expr.type, expr);
1062110621
}
1062210622

@@ -10677,7 +10677,7 @@ export class GenC extends GenCCpp
1067710677
let param = method.firstParameter();
1067810678
for (const arg of call.arguments_) {
1067910679
this.#writeCTemporaries(arg);
10680-
if (call.method.symbol.id != FuId.CONSOLE_WRITE && call.method.symbol.id != FuId.CONSOLE_WRITE_LINE && !(param.type instanceof FuStorageType))
10680+
if (call.method.symbol.id != FuId.CONSOLE_WRITE && call.method.symbol.id != FuId.CONSOLE_WRITE_LINE && param.type.id != FuId.TYPE_PARAM0_NOT_FINAL && !(param.type instanceof FuOwningType))
1068110681
this.#writeStorageTemporary(arg);
1068210682
param = param.nextVar();
1068310683
}
@@ -11124,14 +11124,14 @@ export class GenC extends GenCCpp
1112411124
let dynamic;
1112511125
let klass;
1112611126
if ((dynamic = type) instanceof FuDynamicPtrType && expr instanceof FuSymbolReference && parent != FuPriority.EQUALITY) {
11127-
this.#sharedAddRef = true;
1112811127
if (dynamic.class.id == FuId.ARRAY_PTR_CLASS)
1112911128
this.#writeDynamicArrayCast(dynamic.getElementType());
1113011129
else {
1113111130
this.writeChar(40);
1113211131
this.writeName(dynamic.class);
1113311132
this.write(" *) ");
1113411133
}
11134+
this.#sharedAddRef = true;
1113511135
this.writeCall("FuShared_AddRef", expr);
1113611136
}
1113711137
else if ((klass = type) instanceof FuClassType && klass.class.id != FuId.STRING_CLASS && klass.class.id != FuId.ARRAY_PTR_CLASS && !(klass instanceof FuStorageType)) {

test/MethodArgTempDynamic.fu

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ public class Test
88

99
public static bool Run()
1010
{
11-
Consume(Create()); //FAIL: c leak TODO
11+
Consume(Create());
1212
return true;
1313
}
1414
}

0 commit comments

Comments
 (0)