@@ -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