Browse Source

Extract the function parameter marshal logic into its own method.

pull/1/head
triton 13 years ago
parent
commit
901c0a6832
  1. 63
      src/Generator/Generators/CLI/CLISourcesTemplate.cs

63
src/Generator/Generators/CLI/CLISourcesTemplate.cs

@ -348,45 +348,48 @@ namespace Cxxi.Generators.CLI @@ -348,45 +348,48 @@ namespace Cxxi.Generators.CLI
for (var i = 0; i < function.Parameters.Count; ++i)
{
var param = function.Parameters[i];
if (param.Type is BuiltinType)
{
@params.Add(new ParamMarshal {Name = param.Name, Param = param});
}
else
{
var argName = "arg" + i.ToString(CultureInfo.InvariantCulture);
GenerateFunctionParamMarshal(function, param, @params, i);
}
var ctx = new MarshalContext()
{
Parameter = param,
ParameterIndex = i,
ArgName = argName,
Function = function
};
return @params;
}
var marshal = new CLIMarshalManagedToNativePrinter(Driver.TypeDatabase,
ctx);
private void GenerateFunctionParamMarshal(Function function, Parameter param, List<ParamMarshal> @params, int i)
{
if (param.Type is BuiltinType)
{
@params.Add(new ParamMarshal {Name = param.Name, Param = param});
return;
}
param.Visit(marshal);
var argName = "arg" + i.ToString(CultureInfo.InvariantCulture);
if (string.IsNullOrEmpty(marshal.Return))
throw new Exception("Cannot marshal argument of function");
var ctx = new MarshalContext()
{
Parameter = param,
ParameterIndex = i,
ArgName = argName,
Function = function
};
if (!string.IsNullOrWhiteSpace(marshal.SupportBefore))
WriteLine(marshal.SupportBefore);
var marshal = new CLIMarshalManagedToNativePrinter(Driver.TypeDatabase,
ctx);
WriteLine("auto {0} = {1};", argName, marshal.Return);
param.Visit(marshal);
if (!string.IsNullOrWhiteSpace(marshal.SupportAfter))
WriteLine(marshal.SupportAfter);
if (string.IsNullOrEmpty(marshal.Return))
throw new Exception("Cannot marshal argument of function");
var argText = marshal.ArgumentPrefix + argName;
@params.Add(new ParamMarshal { Name = argText, Param = param });
}
}
if (!string.IsNullOrWhiteSpace(marshal.SupportBefore))
WriteLine(marshal.SupportBefore);
return @params;
WriteLine("auto {0} = {1};", argName, marshal.Return);
if (!string.IsNullOrWhiteSpace(marshal.SupportAfter))
WriteLine(marshal.SupportAfter);
var argText = marshal.ArgumentPrefix + argName;
@params.Add(new ParamMarshal {Name = argText, Param = param});
}
public void GenerateFunctionParams(Function function, List<ParamMarshal> @params)

Loading…
Cancel
Save