Browse Source

Extracted the native printing in C# to separate methods.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/890/head
Dimitar Dobrev 8 years ago
parent
commit
2af1af6404
  1. 11
      src/Generator/Generators/CSharp/CSharpMarshal.cs
  2. 72
      src/Generator/Generators/CSharp/CSharpSources.cs
  3. 28
      src/Generator/Generators/CSharp/CSharpTypePrinter.cs
  4. 4
      src/Generator/Types/Std/Stdlib.cs

11
src/Generator/Generators/CSharp/CSharpMarshal.cs

@ -609,11 +609,8 @@ namespace CppSharp.Generators.CSharp
if (!marshalAsString && if (!marshalAsString &&
Context.Context.Options.MarshalCharAsManagedChar && Context.Context.Options.MarshalCharAsManagedChar &&
primitive == PrimitiveType.Char) primitive == PrimitiveType.Char)
{ Context.Return.Write($"({typePrinter.PrintNative(pointer)}) ");
typePrinter.PushContext(TypePrinterContextKind.Native);
Context.Return.Write(string.Format("({0}) ", pointer.Visit(typePrinter)));
typePrinter.PopContext();
}
if (marshalAsString && (Context.MarshalKind == MarshalKind.NativeField || if (marshalAsString && (Context.MarshalKind == MarshalKind.NativeField ||
Context.MarshalKind == MarshalKind.VTableReturnValue || Context.MarshalKind == MarshalKind.VTableReturnValue ||
Context.MarshalKind == MarshalKind.Variable)) Context.MarshalKind == MarshalKind.Variable))
@ -784,9 +781,7 @@ namespace CppSharp.Generators.CSharp
} }
var realClass = @class.OriginalClass ?? @class; var realClass = @class.OriginalClass ?? @class;
typePrinter.PushContext(TypePrinterContextKind.Native); var qualifiedIdentifier = typePrinter.PrintNative(realClass);
var qualifiedIdentifier = realClass.Visit(typePrinter);
typePrinter.PopContext();
Context.Return.Write( Context.Return.Write(
"ReferenceEquals({0}, null) ? new {1}() : *({1}*) {2}", "ReferenceEquals({0}, null) ? new {1}() : *({1}*) {2}",
param, qualifiedIdentifier, paramInstance); param, qualifiedIdentifier, paramInstance);

72
src/Generator/Generators/CSharp/CSharpSources.cs

@ -847,15 +847,13 @@ namespace CppSharp.Generators.CSharp
else else
{ {
var name = @class.Layout.Fields.First(f => f.FieldPtr == field.OriginalPtr).Name; var name = @class.Layout.Fields.First(f => f.FieldPtr == field.OriginalPtr).Name;
TypePrinter.PushContext(TypePrinterContextKind.Native); var printed = TypePrinter.PrintNative(@class);
ctx.ReturnVarName = string.Format("{0}{1}{2}", ctx.ReturnVarName = string.Format("{0}{1}{2}",
@class.IsValueType @class.IsValueType
? Helpers.InstanceField ? Helpers.InstanceField
: string.Format("(({0}*) {1})", @class.Visit(TypePrinter), : $"(({printed}*) {Helpers.InstanceIdentifier})",
Helpers.InstanceIdentifier),
@class.IsValueType ? "." : "->", @class.IsValueType ? "." : "->",
SafeIdentifier(name)); SafeIdentifier(name));
TypePrinter.PopContext();
} }
param.Visit(marshal); param.Visit(marshal);
@ -889,15 +887,9 @@ namespace CppSharp.Generators.CSharp
string type; string type;
if (Context.Options.MarshalCharAsManagedChar && isChar) if (Context.Options.MarshalCharAsManagedChar && isChar)
{ type = TypePrinter.PrintNative(originalType).Type;
var typePrinter = new CSharpTypePrinter(Context);
typePrinter.PushContext(TypePrinterContextKind.Native);
type = originalType.Visit(typePrinter).Type;
}
else else
{
type = originalType.ToString(); type = originalType.ToString();
}
var name = ((Class) field.Namespace).Layout.Fields.First( var name = ((Class) field.Namespace).Layout.Fields.First(
f => f.FieldPtr == field.OriginalPtr).Name; f => f.FieldPtr == field.OriginalPtr).Name;
@ -1085,19 +1077,16 @@ namespace CppSharp.Generators.CSharp
private void GenerateFieldGetter(Field field, Class @class) private void GenerateFieldGetter(Field field, Class @class)
{ {
var name = @class.Layout.Fields.First(f => f.FieldPtr == field.OriginalPtr).Name; var name = @class.Layout.Fields.First(f => f.FieldPtr == field.OriginalPtr).Name;
TypePrinter.PushContext(TypePrinterContextKind.Native);
var ctx = new CSharpMarshalContext(Context) var ctx = new CSharpMarshalContext(Context)
{ {
ArgName = field.Name, ArgName = field.Name,
Declaration = field, Declaration = field,
ReturnVarName = $@"{(@class.IsValueType ? Helpers.InstanceField : ReturnVarName = $@"{(@class.IsValueType ? Helpers.InstanceField :
$"(({@class.Visit(TypePrinter)}*) {Helpers.InstanceIdentifier})")}{ $"(({TypePrinter.PrintNative(@class)}*) {Helpers.InstanceIdentifier})")}{
(@class.IsValueType ? "." : "->")}{SafeIdentifier(name)}", (@class.IsValueType ? "." : "->")}{SafeIdentifier(name)}",
ReturnType = field.QualifiedType ReturnType = field.QualifiedType
}; };
ctx.PushMarshalKind(MarshalKind.NativeField); ctx.PushMarshalKind(MarshalKind.NativeField);
TypePrinter.PopContext();
var arrayType = field.Type.Desugar() as ArrayType; var arrayType = field.Type.Desugar() as ArrayType;
@ -1442,7 +1431,6 @@ namespace CppSharp.Generators.CSharp
private void SaveOriginalVTablePointers(Class @class) private void SaveOriginalVTablePointers(Class @class)
{ {
TypePrinter.PushContext(TypePrinterContextKind.Native);
if (Context.ParserOptions.IsMicrosoftAbi) if (Context.ParserOptions.IsMicrosoftAbi)
WriteLine("__OriginalVTables = new void*[] {{ {0} }};", WriteLine("__OriginalVTables = new void*[] {{ {0} }};",
string.Join(", ", string.Join(", ",
@ -1452,7 +1440,6 @@ namespace CppSharp.Generators.CSharp
WriteLine( WriteLine(
$@"__OriginalVTables = new void*[] {{ *(void**) ({ $@"__OriginalVTables = new void*[] {{ *(void**) ({
Helpers.InstanceIdentifier} + {@class.Layout.VTablePointers[0].Offset}) }};"); Helpers.InstanceIdentifier} + {@class.Layout.VTablePointers[0].Offset}) }};");
TypePrinter.PopContext();
} }
private void AllocateNewVTablesMS(Class @class, IList<VTableComponent> wrappedEntries, private void AllocateNewVTablesMS(Class @class, IList<VTableComponent> wrappedEntries,
@ -1630,10 +1617,9 @@ namespace CppSharp.Generators.CSharp
if (method.HasIndirectReturnTypeParameter) if (method.HasIndirectReturnTypeParameter)
{ {
var retParam = method.Parameters.First(p => p.Kind == ParameterKind.IndirectReturnType); var retParam = method.Parameters.First(p => p.Kind == ParameterKind.IndirectReturnType);
TypePrinter.PushContext(TypePrinterContextKind.Native);
WriteLine("*({0}*) {1} = {2};", WriteLine("*({0}*) {1} = {2};",
method.OriginalReturnType.Visit(TypePrinter), retParam.Name, marshal.Context.Return); TypePrinter.PrintNative(method.OriginalReturnType),
TypePrinter.PopContext(); retParam.Name, marshal.Context.Return);
} }
else else
{ {
@ -1924,9 +1910,7 @@ namespace CppSharp.Generators.CSharp
WriteLine($"{printedClass}{printedClass.NameSuffix} {Helpers.DummyIdentifier};"); WriteLine($"{printedClass}{printedClass.NameSuffix} {Helpers.DummyIdentifier};");
WriteLine("NativeToManagedMap.TryRemove({0}, out {1});", WriteLine("NativeToManagedMap.TryRemove({0}, out {1});",
Helpers.InstanceIdentifier, Helpers.DummyIdentifier); Helpers.InstanceIdentifier, Helpers.DummyIdentifier);
TypePrinter.PushContext(TypePrinterContextKind.Native); var classInternal = TypePrinter.PrintNative(@class);
var classInternal = @class.Visit(TypePrinter);
TypePrinter.PopContext();
if (@class.IsDynamic && GetUniqueVTableMethodEntries(@class).Count != 0) if (@class.IsDynamic && GetUniqueVTableMethodEntries(@class).Count != 0)
{ {
if (Context.ParserOptions.IsMicrosoftAbi) if (Context.ParserOptions.IsMicrosoftAbi)
@ -2062,9 +2046,7 @@ namespace CppSharp.Generators.CSharp
} }
else else
{ {
TypePrinter.PushContext(TypePrinterContextKind.Native); WriteLine($"{Helpers.InstanceField} = *({TypePrinter.PrintNative(@class)}*) native;");
WriteLine($"{Helpers.InstanceField} = *({@class.Visit(TypePrinter)}*) native;");
TypePrinter.PopContext();
} }
WriteCloseBraceIndent(); WriteCloseBraceIndent();
@ -2073,9 +2055,7 @@ namespace CppSharp.Generators.CSharp
public void GenerateNativeConstructorByValue(Class @class, string returnType) public void GenerateNativeConstructorByValue(Class @class, string returnType)
{ {
TypePrinter.PushContext(TypePrinterContextKind.Native); var @internal = TypePrinter.PrintNative(@class.IsAbstractImpl ? @class.BaseClass : @class);
var @internal = (@class.IsAbstractImpl ? @class.BaseClass : @class).Visit(TypePrinter);
TypePrinter.PopContext();
if (!@class.IsAbstractImpl) if (!@class.IsAbstractImpl)
{ {
@ -2101,11 +2081,9 @@ namespace CppSharp.Generators.CSharp
{ {
// Allocate memory for a new native object and call the ctor. // Allocate memory for a new native object and call the ctor.
WriteLine($"var ret = Marshal.AllocHGlobal(sizeof({@internal}));"); WriteLine($"var ret = Marshal.AllocHGlobal(sizeof({@internal}));");
TypePrinter.PushContext(TypePrinterContextKind.Native); var printed = TypePrinter.PrintNative(@class);
WriteLine($"{@class.Visit(TypePrinter)}.{GetFunctionNativeIdentifier(copyCtorMethod)}(ret, new global::System.IntPtr(&native));", WriteLine($"{printed}.{GetFunctionNativeIdentifier(copyCtorMethod)}(ret, new global::System.IntPtr(&native));",
@class.Visit(TypePrinter), printed, GetFunctionNativeIdentifier(copyCtorMethod));
GetFunctionNativeIdentifier(copyCtorMethod));
TypePrinter.PopContext();
WriteLine("return ret.ToPointer();"); WriteLine("return ret.ToPointer();");
} }
else else
@ -2420,10 +2398,8 @@ namespace CppSharp.Generators.CSharp
{ {
WriteLine("if ({0} == global::System.IntPtr.Zero)", Helpers.InstanceIdentifier); WriteLine("if ({0} == global::System.IntPtr.Zero)", Helpers.InstanceIdentifier);
WriteLineIndent("return global::System.IntPtr.Zero.GetHashCode();"); WriteLineIndent("return global::System.IntPtr.Zero.GetHashCode();");
TypePrinter.PushContext(TypePrinterContextKind.Native); WriteLine($@"return (*({TypePrinter.PrintNative(@class)}*) {
WriteLine($@"return (*({@class.Visit(TypePrinter)}*) {
Helpers.InstanceIdentifier}).GetHashCode();"); Helpers.InstanceIdentifier}).GetHashCode();");
TypePrinter.PopContext();
} }
else else
{ {
@ -2544,9 +2520,8 @@ namespace CppSharp.Generators.CSharp
private void GenerateClassConstructor(Method method, Class @class) private void GenerateClassConstructor(Method method, Class @class)
{ {
TypePrinter.PushContext(TypePrinterContextKind.Native); var @internal = TypePrinter.PrintNative(
var @internal = (@class.IsAbstractImpl ? @class.BaseClass : @class).Visit(TypePrinter); @class.IsAbstractImpl ? @class.BaseClass : @class);
TypePrinter.PopContext();
WriteLine($"{Helpers.InstanceIdentifier} = Marshal.AllocHGlobal(sizeof({@internal}));"); WriteLine($"{Helpers.InstanceIdentifier} = Marshal.AllocHGlobal(sizeof({@internal}));");
WriteLine($"{Helpers.OwnsNativeInstanceIdentifier} = true;"); WriteLine($"{Helpers.OwnsNativeInstanceIdentifier} = true;");
WriteLine($"NativeToManagedMap[{Helpers.InstanceIdentifier}] = this;"); WriteLine($"NativeToManagedMap[{Helpers.InstanceIdentifier}] = this;");
@ -2557,9 +2532,7 @@ namespace CppSharp.Generators.CSharp
GenerateInternalFunctionCall(method); GenerateInternalFunctionCall(method);
else else
{ {
TypePrinter.PushContext(TypePrinterContextKind.Native); var classInternal = TypePrinter.PrintNative(@class);
var classInternal = @class.Visit(TypePrinter);
TypePrinter.PopContext();
WriteLine($@"*(({classInternal}*) {Helpers.InstanceIdentifier}) = *(({ WriteLine($@"*(({classInternal}*) {Helpers.InstanceIdentifier}) = *(({
classInternal}*) {method.Parameters[0].Name}.{Helpers.InstanceIdentifier});"); classInternal}*) {method.Parameters[0].Name}.{Helpers.InstanceIdentifier});");
} }
@ -2583,12 +2556,8 @@ namespace CppSharp.Generators.CSharp
var @class = function.Namespace as Class; var @class = function.Namespace as Class;
string @internal = Helpers.InternalStruct; string @internal = Helpers.InternalStruct;
if (@class != null && @class is ClassTemplateSpecialization) if (@class is ClassTemplateSpecialization)
{ @internal = TypePrinter.PrintNative(@class).Type;
TypePrinter.PushContext(TypePrinterContextKind.Native);
@internal = @class.Visit(TypePrinter).Type;
TypePrinter.PopContext();
}
var nativeFunction = GetFunctionNativeIdentifier(function); var nativeFunction = GetFunctionNativeIdentifier(function);
var functionName = $"{@internal}.{nativeFunction}"; var functionName = $"{@internal}.{nativeFunction}";
@ -2646,9 +2615,8 @@ namespace CppSharp.Generators.CSharp
if (construct == null) if (construct == null)
{ {
var @class = retClass.OriginalClass ?? retClass; var @class = retClass.OriginalClass ?? retClass;
TypePrinter.PushContext(TypePrinterContextKind.Native); WriteLine($@"var {Helpers.ReturnIdentifier} = new {
WriteLine($"var {Helpers.ReturnIdentifier} = new {@class.Visit(TypePrinter)}();"); TypePrinter.PrintNative(@class)}();");
TypePrinter.PopContext();
} }
else else
{ {

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

@ -731,8 +731,6 @@ namespace CppSharp.Generators.CSharp
} }
} }
private CSharpExpressionPrinter expressionPrinter => new CSharpExpressionPrinter(this);
public override TypePrinterResult VisitFieldDecl(Field field) public override TypePrinterResult VisitFieldDecl(Field field)
{ {
var cSharpSourcesDummy = new CSharpSources(Context, new List<TranslationUnit>()); var cSharpSourcesDummy = new CSharpSources(Context, new List<TranslationUnit>());
@ -755,5 +753,31 @@ namespace CppSharp.Generators.CSharp
return returnTypePrinter; return returnTypePrinter;
} }
public TypePrinterResult PrintNative(Declaration declaration)
{
PushContext(TypePrinterContextKind.Native);
var typePrinterResult = declaration.Visit(this);
PopContext();
return typePrinterResult;
}
public TypePrinterResult PrintNative(Type type)
{
PushContext(TypePrinterContextKind.Native);
var typePrinterResult = type.Visit(this);
PopContext();
return typePrinterResult;
}
public TypePrinterResult PrintNative(QualifiedType type)
{
PushContext(TypePrinterContextKind.Native);
var typePrinterResult = type.Visit(this);
PopContext();
return typePrinterResult;
}
private CSharpExpressionPrinter expressionPrinter => new CSharpExpressionPrinter(this);
} }
} }

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

@ -63,10 +63,8 @@ namespace CppSharp.Types.Std
var type = ctx.Parameter.Type.Desugar(); var type = ctx.Parameter.Type.Desugar();
ClassTemplateSpecialization basicString = GetBasicString(type); ClassTemplateSpecialization basicString = GetBasicString(type);
var typePrinter = new CSharpTypePrinter(ctx.Context); var typePrinter = new CSharpTypePrinter(ctx.Context);
typePrinter.PushContext(TypePrinterContextKind.Native);
if (!ctx.Parameter.Type.Desugar().IsAddress()) if (!ctx.Parameter.Type.Desugar().IsAddress())
ctx.Return.Write($"*({basicString.Visit(typePrinter)}*) "); ctx.Return.Write($"*({typePrinter.PrintNative(basicString)}*) ");
typePrinter.PopContext();
var allocator = ctx.Context.ASTContext.FindClass("allocator", false, true).First( var allocator = ctx.Context.ASTContext.FindClass("allocator", false, true).First(
a => a.IsDependent && a.TranslationUnit.IsSystemHeader); a => a.IsDependent && a.TranslationUnit.IsSystemHeader);
var allocatorChar = allocator.Specializations.First(s => !s.Ignore); var allocatorChar = allocator.Specializations.First(s => !s.Ignore);

Loading…
Cancel
Save