Skip to content

Commit ff7f967

Browse files
committed
c# fixes
1 parent 8365fd0 commit ff7f967

File tree

1 file changed

+63
-36
lines changed

1 file changed

+63
-36
lines changed

lib/conversions/src/RLCToCSharp.cpp

Lines changed: 63 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -250,28 +250,35 @@ namespace mlir::rlc
250250
{
251251
if (not mlir::isa<mlir::rlc::VoidType>(returnType))
252252
{
253-
writer.writeType(returnType);
254-
size_t depth = depthOfReference(returnType);
255-
for (size_t i = 0; i != depth; i++)
256-
writer.write("*");
257-
writer.write(" __result");
258-
if (mlir::isa<mlir::rlc::ReferenceType>(returnType) or
259-
mlir::isa<mlir::rlc::OwningPtrType>(returnType) or
260-
mlir::isa<mlir::rlc::StringLiteralType>(returnType))
261-
writer.writenl(" = null;");
262-
else if (mlir::isa<mlir::rlc::BoolType>(returnType))
253+
if (isCSharpBuiltinType(returnType))
263254
{
264-
writer.writenl(" = false;");
265-
}
266-
else if (isCSharpBuiltinType(returnType))
267-
{
268-
writer.writenl(" = 0;");
255+
writer.writeType(returnType, 1);
256+
writer.write(" __result");
257+
if (mlir::isa<mlir::rlc::ReferenceType>(returnType) or
258+
mlir::isa<mlir::rlc::OwningPtrType>(returnType) or
259+
mlir::isa<mlir::rlc::StringLiteralType>(returnType))
260+
writer.writenl(" = null;");
261+
else if (mlir::isa<mlir::rlc::BoolType>(returnType))
262+
{
263+
writer.writenl(" = false;");
264+
}
265+
else
266+
{
267+
writer.writenl(" = 0;");
268+
}
269269
}
270270
else
271271
{
272+
writer.writeType(returnType);
273+
writer.write(" __result");
272274
writer.write(" = new ");
273275
writer.writeType(returnType);
274-
writer.writenl("();");
276+
writer.write("((");
277+
writer.writeType(returnType, 1);
278+
writer.write("*)");
279+
writer.write("Marshal.AllocHGlobal(sizeof(");
280+
writer.writeType(returnType, 1);
281+
writer.writenl(")));");
275282
}
276283
}
277284
}
@@ -303,13 +310,23 @@ namespace mlir::rlc
303310
writer.write("RLCNative.", mangledName, "(");
304311
if (not mlir::isa<mlir::rlc::VoidType>(returnType))
305312
{
306-
writer.write("ref ");
307-
if (not isCSharpBuiltinType(returnType))
308-
writer.write("*");
309-
writer.write("__result");
313+
if (isCSharpBuiltinType(returnType))
314+
{
315+
writer.write("ref __result");
316+
}
317+
else
318+
{
319+
writer.write("ref ");
320+
if (depthOfReference(returnType) != 1 and
321+
depthOfReference(returnType) != 0)
322+
abort();
323+
if (depthOfReference(returnType) == 0)
324+
{
325+
writer.write("*");
326+
}
327+
writer.write("__result.__content");
328+
}
310329

311-
if (not isCSharpBuiltinType(returnType))
312-
writer.write(".__content");
313330
writer.write(", ");
314331
}
315332
writer.write("ref *this.__content");
@@ -332,11 +349,23 @@ namespace mlir::rlc
332349
if (not mlir::isa<mlir::rlc::VoidType>(returnType))
333350
{
334351
writer.write("return ");
335-
size_t depth = depthOfReference(returnType);
336-
for (size_t i = 0; i != depth; i++)
337-
writer.write("*");
338-
339-
writer.writenl("__result;");
352+
if (depthOfReference(returnType) != 0)
353+
{
354+
if (isCSharpBuiltinType(dereferenceType(returnType)))
355+
{
356+
writer.writenl("* __result;");
357+
}
358+
else
359+
{
360+
writer.write("new ");
361+
writer.writeType(returnType);
362+
writer.writenl("(__result);");
363+
}
364+
}
365+
else
366+
{
367+
writer.writenl("__result;");
368+
}
340369
}
341370
}
342371

@@ -626,11 +655,7 @@ namespace mlir::rlc
626655
writer.write("private ");
627656
else
628657
writer.write("public ");
629-
writer.writeType(memberType);
630-
if (not isCSharpBuiltinType(memberType))
631-
{
632-
writer.write(".Content");
633-
}
658+
writer.writeType(memberType, 1);
634659
writer.writenl(" ", memberName, ";");
635660
}
636661
}
@@ -746,8 +771,8 @@ namespace mlir::rlc
746771
if (not isCSharpBuiltinType(alternative.value()))
747772
{
748773
writer.write("new ");
749-
writer.writeType(type);
750-
writer.write("(&");
774+
writer.writeType(alternative.value());
775+
writer.write("(&(");
751776
}
752777
else
753778
{
@@ -760,7 +785,7 @@ namespace mlir::rlc
760785
writer.write(alternative.index());
761786
if (not isCSharpBuiltinType(alternative.value()))
762787
{
763-
writer.write(")");
788+
writer.write("))");
764789
}
765790
writer.write(" : null");
766791
// writer.write("; set => __content->", name, " = ");
@@ -825,12 +850,14 @@ namespace mlir::rlc
825850
StreamWriter& writer,
826851
MemberFunctionsTable& table)
827852
{
828-
writer.write("public class ");
853+
writer.write("public unsafe class ");
829854
writer.writeType(type);
830855
writer.writenl("{");
831856
auto _ = writer.indent();
832857

833858
{
859+
writer.writenl("public Content* __content;");
860+
writer.writenl("private bool owning;");
834861
writer.writenl("[StructLayout(LayoutKind.Sequential)]");
835862
writer.write("public struct Content {");
836863
auto _ = writer.indent();

0 commit comments

Comments
 (0)