Add feature to Bind to generate legacy array overloads
authorFraser Waters <frassle@gmail.com>
Thu, 5 Oct 2017 11:33:19 +0000 (12:33 +0100)
committerFraser Waters <frassle@gmail.com>
Thu, 5 Oct 2017 11:37:23 +0000 (12:37 +0100)
src/Generator.Bind/FuncProcessor.cs
src/Generator.Bind/Utilities.cs

index 213f8f6..7755f40 100644 (file)
@@ -648,6 +648,22 @@ namespace Bind
                 {
                     d.Parameters[i].WrapperType |= WrapperTypes.UncheckedParameter;
                 }
+
+                if (function_override != null)
+                {
+                    XPathNavigator param_override = function_override.SelectSingleNode(String.Format(
+                           "param[@name='{0}' or @index='{1}']",
+                           d.Parameters[i].RawName,
+                           i));
+                    if (param_override != null)
+                    {
+                        var legacyArrayParameter = param_override.GetAttribute("legacyArrayParameter", String.Empty);
+                        if (!String.IsNullOrEmpty(legacyArrayParameter))
+                        {
+                            d.Parameters[i].WrapperType |= WrapperTypes.LegacyArrayParameter;
+                        }
+                    }
+                }
             }
         }
 
@@ -1097,6 +1113,17 @@ namespace Bind
                 // Generics are handled in a second pass.
                 if ((parameter.WrapperType & WrapperTypes.GenericParameter) == 0)
                 {
+                    if ((parameter.WrapperType & WrapperTypes.LegacyArrayParameter) != 0)
+                    {
+                        foreach (var wrapper in GetWrapper(wrappers, WrapperTypes.LegacyArrayParameter, func))
+                        {
+                            wrapper.Obsolete = "Use out overload instead";
+                            var p = wrapper.Parameters[i];
+                            p.Array++;
+                            p.Pointer--;
+                        }
+                    }
+
                     if ((parameter.WrapperType & WrapperTypes.ArrayParameter) != 0)
                     {
                         foreach (var wrapper in GetWrapper(wrappers, WrapperTypes.ArrayParameter, func))
index 188e2a7..2d55f4f 100644 (file)
@@ -94,6 +94,10 @@ namespace Bind
         /// Add an int32 overload for convenience.
         /// </summary>
         SizeParameter = 1 << 14,
+        /// <summary>
+        /// Function takes a ref but we emit a legacy array overload to maintain backwards compatability.
+        /// </summary>
+        LegacyArrayParameter = 1 << 15,
     }
 
     internal static class Utilities