From 6f3ed8db4aae60a2795ccf1badd509ff97eac397 Mon Sep 17 00:00:00 2001
From: triton <ripzonetriton@gmail.com>
Date: Thu, 7 Mar 2013 19:53:46 +0000
Subject: [PATCH] Improved marshaling of classes.

---
 src/Generator/Generators/CLI/CLIMarshal.cs | 28 ++++++++++++++++------
 1 file changed, 21 insertions(+), 7 deletions(-)

diff --git a/src/Generator/Generators/CLI/CLIMarshal.cs b/src/Generator/Generators/CLI/CLIMarshal.cs
index 6376e74a..d03b80dc 100644
--- a/src/Generator/Generators/CLI/CLIMarshal.cs
+++ b/src/Generator/Generators/CLI/CLIMarshal.cs
@@ -171,19 +171,26 @@ namespace Cxxi.Generators.CLI
         }
 
         public bool VisitClassDecl(Class @class)
+        {
+            var instance = string.Empty;
+
+            if (!Context.ReturnType.IsPointer())
+                instance += "&";
+
+            instance += Context.ReturnVarName;
+
+            WriteClassInstance(@class, instance);
+            return true;
+        }
+
+        public void WriteClassInstance(Class @class, string instance)
         {
             if (@class.IsRefType)
                 Return.Write("gcnew ");
 
             Return.Write("{0}::{1}(", Library.Name, @class.Name);
-
             Return.Write("(::{0}*)", @class.QualifiedOriginalName);
-
-            if (!Context.ReturnType.IsPointer())
-                Return.Write("&");
-
-            Return.Write("{0})", Context.ReturnVarName);
-            return true;
+            Return.Write("{0})", instance);
         }
 
         public bool VisitFieldDecl(Field field)
@@ -471,6 +478,13 @@ namespace Cxxi.Generators.CLI
 
         private void MarshalRefClass(Class @class)
         {
+            TypeMap typeMap = null;
+            if (TypeMapDatabase.FindTypeMap(@class, out typeMap))
+            {
+                typeMap.CLIMarshalToNative(Context);
+                return;
+            }
+
             if (!Context.Parameter.Type.IsPointer())
             {
                 Return.Write("*");