Browse Source

Refactor the type map system to have per-generator overloads (to better support the C# backend).

pull/1/head
triton 13 years ago
parent
commit
e8f51728db
  1. 8
      src/Generator/Generators/CLI/CLISourcesTemplate.cs
  2. 4
      src/Generator/Generators/CLI/CLITypePrinter.cs
  3. 2
      src/Generator/Generators/CSharp/CSharpTypePrinter.cs
  4. 38
      src/Generator/Types/Std/Stdlib.cs
  5. 46
      src/Generator/Types/TypeMap.cs

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

@ -230,7 +230,7 @@ namespace Cxxi.Generators.CLI @@ -230,7 +230,7 @@ namespace Cxxi.Generators.CLI
var returns = new List<string>();
foreach (var param in @params)
{
var ctx = new MarshalContext()
var ctx = new MarshalContext(Driver)
{
ReturnVarName = param.Name,
ReturnType = param.Type
@ -294,7 +294,7 @@ namespace Cxxi.Generators.CLI @@ -294,7 +294,7 @@ namespace Cxxi.Generators.CLI
var nativeField = string.Format("{0}->{1}",
nativePointer, field.OriginalName);
var ctx = new MarshalContext()
var ctx = new MarshalContext(Driver)
{
ReturnVarName = nativeField,
ReturnType = field.Type
@ -446,7 +446,7 @@ namespace Cxxi.Generators.CLI @@ -446,7 +446,7 @@ namespace Cxxi.Generators.CLI
{
Write("return ");
var ctx = new MarshalContext()
var ctx = new MarshalContext(Driver)
{
ReturnVarName = "ret",
ReturnType = retType
@ -501,7 +501,7 @@ namespace Cxxi.Generators.CLI @@ -501,7 +501,7 @@ namespace Cxxi.Generators.CLI
var argName = "arg" + paramIndex.ToString(CultureInfo.InvariantCulture);
var ctx = new MarshalContext()
var ctx = new MarshalContext(Driver)
{
Parameter = param,
ParameterIndex = paramIndex,

4
src/Generator/Generators/CLI/CLITypePrinter.cs

@ -145,7 +145,7 @@ namespace Cxxi.Generators.CLI @@ -145,7 +145,7 @@ namespace Cxxi.Generators.CLI
TypeMap typeMap = null;
if (TypeMapDatabase.FindTypeMap(decl, out typeMap))
{
return typeMap.Signature();
return typeMap.CLISignature();
}
FunctionType func;
@ -168,7 +168,7 @@ namespace Cxxi.Generators.CLI @@ -168,7 +168,7 @@ namespace Cxxi.Generators.CLI
{
typeMap.Declaration = decl;
typeMap.Type = template;
return typeMap.Signature();
return typeMap.CLISignature();
}
return decl.Name;

2
src/Generator/Generators/CSharp/CSharpTypePrinter.cs

@ -95,7 +95,7 @@ namespace Cxxi.Generators.CSharp @@ -95,7 +95,7 @@ namespace Cxxi.Generators.CSharp
TypeMap typeMap = null;
if (TypeMapDatabase.FindTypeMap(decl, out typeMap))
{
return typeMap.Signature();
return typeMap.CSharpSignature();
}
FunctionType func;

38
src/Generator/Types/Std/Stdlib.cs

@ -12,38 +12,38 @@ namespace Cxxi.Types.Std @@ -12,38 +12,38 @@ namespace Cxxi.Types.Std
[TypeMap("std::string")]
public class String : TypeMap
{
public override string Signature()
public override string CLISignature()
{
return "System::String^";
}
public override string MarshalToNative(MarshalContext ctx)
public override void CLIMarshalToNative(MarshalContext ctx)
{
return string.Format("marshalString<E_UTF8>({0})", ctx.Parameter.Name);
ctx.Return.Write("marshalString<E_UTF8>({0})", ctx.Parameter.Name);
}
public override string MarshalFromNative(MarshalContext ctx)
public override void CLIMarshalToManaged(MarshalContext ctx)
{
return string.Format("marshalString<E_UTF8>({0})", ctx.ReturnVarName);
ctx.Return.Write("marshalString<E_UTF8>({0})", ctx.ReturnVarName);
}
}
[TypeMap("std::wstring")]
public class WString : TypeMap
{
public override string Signature()
public override string CLISignature()
{
return "System::String^";
}
public override string MarshalToNative(MarshalContext ctx)
public override void CLIMarshalToNative(MarshalContext ctx)
{
return string.Format("marshalString<E_UTF16>({0})", ctx.Parameter.Name);
ctx.Return.Write("marshalString<E_UTF16>({0})", ctx.Parameter.Name);
}
public override string MarshalFromNative(MarshalContext ctx)
public override void CLIMarshalToManaged(MarshalContext ctx)
{
return string.Format("marshalString<E_UTF16>({0})", ctx.ReturnVarName);
ctx.Return.Write("marshalString<E_UTF16>({0})", ctx.ReturnVarName);
}
}
@ -52,19 +52,19 @@ namespace Cxxi.Types.Std @@ -52,19 +52,19 @@ namespace Cxxi.Types.Std
{
public override bool IsIgnored { get { return true; } }
public override string Signature()
public override string CLISignature()
{
var type = Type as TemplateSpecializationType;
var typeName = type.Arguments[0].Type.ToString();
return string.Format("System::Collections::Generic::List<{0}>^", typeName);
}
public override string MarshalToNative(MarshalContext ctx)
public override void CLIMarshalToNative(MarshalContext ctx)
{
throw new System.NotImplementedException();
}
public override string MarshalFromNative(MarshalContext ctx)
public override void CLIMarshalToManaged(MarshalContext ctx)
{
throw new System.NotImplementedException();
}
@ -75,7 +75,7 @@ namespace Cxxi.Types.Std @@ -75,7 +75,7 @@ namespace Cxxi.Types.Std
{
public override bool IsIgnored { get { return true; } }
public override string Signature()
public override string CLISignature()
{
var type = Type as TemplateSpecializationType;
return string.Format("System::Collections::Generic::Dictionary<{0}, {1}>^",
@ -83,12 +83,12 @@ namespace Cxxi.Types.Std @@ -83,12 +83,12 @@ namespace Cxxi.Types.Std
type.Arguments[1].Type);
}
public override string MarshalToNative(MarshalContext ctx)
public override void CLIMarshalToNative(MarshalContext ctx)
{
throw new System.NotImplementedException();
}
public override string MarshalFromNative(MarshalContext ctx)
public override void CLIMarshalToManaged(MarshalContext ctx)
{
throw new System.NotImplementedException();
}
@ -103,17 +103,17 @@ namespace Cxxi.Types.Std @@ -103,17 +103,17 @@ namespace Cxxi.Types.Std
[TypeMap("std::shared_ptr")]
public class SharedPtr : TypeMap
{
public override string Signature()
public override string CLISignature()
{
throw new System.NotImplementedException();
}
public override string MarshalToNative(MarshalContext ctx)
public override void CLIMarshalToNative(MarshalContext ctx)
{
throw new System.NotImplementedException();
}
public override string MarshalFromNative(MarshalContext ctx)
public override void CLIMarshalToManaged(MarshalContext ctx)
{
throw new System.NotImplementedException();
}

46
src/Generator/Types/TypeMap.cs

@ -1,14 +1,27 @@ @@ -1,14 +1,27 @@
using System;
using System.Collections.Generic;
using System.Reflection;
using Cxxi.Generators.CLI;
namespace Cxxi.Types
{
public class MarshalContext
{
public string ArgName { get; set; }
public MarshalContext(Driver driver)
{
}
public Driver Driver { get; set; }
public CLIMarshalNativeToManagedPrinter MarshalToManaged;
public CLIMarshalManagedToNativePrinter MarshalToNative;
public TextGenerator Return;
public string ReturnVarName { get; set; }
public Type ReturnType { get; set; }
public string ArgName { get; set; }
public Parameter Parameter { get; set; }
public int ParameterIndex { get; set; }
public Function Function { get; set; }
@ -45,26 +58,49 @@ namespace Cxxi.Types @@ -45,26 +58,49 @@ namespace Cxxi.Types
get { return false; }
}
public virtual string Signature()
#region C# backend
public virtual string CSharpSignature()
{
throw new NotImplementedException();
}
public virtual void CSharpMarshalToNative(MarshalContext ctx)
{
throw new NotImplementedException();
}
public virtual string MarshalToNative(MarshalContext ctx)
public virtual void CSharpMarshalToManaged(MarshalContext ctx)
{
throw new NotImplementedException();
}
public virtual string MarshalFromNative(MarshalContext ctx)
#endregion
#region C++/CLI backend
public virtual string CLISignature()
{
throw new NotImplementedException();
}
public virtual void CLIMarshalToNative(MarshalContext ctx)
{
throw new NotImplementedException();
}
public virtual void CLIMarshalToManaged(MarshalContext ctx)
{
throw new NotImplementedException();
}
#endregion
}
public interface ITypeMapDatabase
{
bool FindTypeMap(Declaration decl, out TypeMap typeMap);
bool FindTypeMap(Type type, out TypeMap typeMap);
bool FindTypeMap(Declaration decl, out TypeMap typeMap);
bool FindTypeMap(string name, out TypeMap typeMap);
}

Loading…
Cancel
Save