Skip to content

Commit d243780

Browse files
ddobrevtritao
authored andcommitted
Optimized the generation of C# by not splitting any strings.
Our indention of lines in blocks was inadequate so we used to split strings by new lines, indent each line and put it back together. Creation of new strings is incredibly slow so this bogged our code generation down. I have now fixed indention properly and we no longer need to split already written blocks to indent them. Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent 34ad795 commit d243780

File tree

9 files changed

+89
-90
lines changed

9 files changed

+89
-90
lines changed

src/Generator/Generators/CLI/CLIMarshal.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -775,7 +775,7 @@ private void MarshalValueClassProperty(Property property, string marshalVar)
775775
var fieldRef = string.Format("{0}.{1}", Context.Parameter.Name,
776776
property.Name);
777777

778-
var marshalCtx = new MarshalContext(Context.Context)
778+
var marshalCtx = new MarshalContext(Context.Context, Context.Indent)
779779
{
780780
ArgName = fieldRef,
781781
ParameterIndex = Context.ParameterIndex++,

src/Generator/Generators/CLI/CLISources.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ private void GeneratePropertySetter<T>(T decl, Class @class, string name, Type t
396396
else
397397
variable = $"((::{@class.QualifiedOriginalName}*)NativePtr)->{decl.OriginalName}";
398398

399-
var ctx = new MarshalContext(Context)
399+
var ctx = new MarshalContext(Context, CurrentIndent)
400400
{
401401
Parameter = param,
402402
ArgName = param.Name,
@@ -408,7 +408,7 @@ private void GeneratePropertySetter<T>(T decl, Class @class, string name, Type t
408408

409409
if (isIndexer)
410410
{
411-
var ctx2 = new MarshalContext(Context)
411+
var ctx2 = new MarshalContext(Context, CurrentIndent)
412412
{
413413
Parameter = indexParameter,
414414
ArgName = indexParameter.Name
@@ -483,7 +483,7 @@ private void GeneratePropertyGetter<T>(T decl, Class @class, string name, Type t
483483
variable = string.Format("((::{0}*)NativePtr)->{1}",
484484
@class.QualifiedOriginalName, decl.OriginalName);
485485

486-
var ctx = new MarshalContext(Context)
486+
var ctx = new MarshalContext(Context, CurrentIndent)
487487
{
488488
Declaration = decl,
489489
ArgName = decl.Name,
@@ -592,7 +592,7 @@ private void GenerateEventRaiseWrapper(Event @event, Class @class)
592592
var returns = new List<string>();
593593
foreach (var param in @event.Parameters)
594594
{
595-
var ctx = new MarshalContext(Context)
595+
var ctx = new MarshalContext(Context, CurrentIndent)
596596
{
597597
ReturnVarName = param.Name,
598598
ReturnType = param.QualifiedType
@@ -686,7 +686,7 @@ private void GenerateStructMarshaling(Class @class, string nativeVar)
686686
var nativeField = string.Format("{0}{1}",
687687
nativeVar, property.Field.OriginalName);
688688

689-
var ctx = new MarshalContext(Context)
689+
var ctx = new MarshalContext(Context, CurrentIndent)
690690
{
691691
ArgName = property.Name,
692692
ReturnVarName = nativeField,
@@ -834,7 +834,7 @@ private void GenerateValueTypeConstructorCall(Method method, Class @class)
834834
var paramIndex = 0;
835835
foreach (var param in method.Parameters)
836836
{
837-
var ctx = new MarshalContext(Context)
837+
var ctx = new MarshalContext(Context, CurrentIndent)
838838
{
839839
Function = method,
840840
Parameter = param,
@@ -870,7 +870,7 @@ private void GenerateValueTypeConstructorCallProperties(Class @class)
870870

871871
var varName = string.Format("_native.{0}", property.Field.OriginalName);
872872

873-
var ctx = new MarshalContext(Context)
873+
var ctx = new MarshalContext(Context, CurrentIndent)
874874
{
875875
ReturnVarName = varName,
876876
ReturnType = property.QualifiedType
@@ -946,7 +946,7 @@ public void GenerateFunctionCall(Function function, Class @class = null, Type pu
946946
WriteLine("auto {0} = ::{1}();", valueMarshalName, @class.QualifiedOriginalName);
947947

948948
var param = new Parameter { Name = "(*this)" , Namespace = function.Namespace };
949-
var ctx = new MarshalContext(Context)
949+
var ctx = new MarshalContext(Context, CurrentIndent)
950950
{
951951
MarshalVarPrefix = valueMarshalName,
952952
Parameter = param
@@ -1021,7 +1021,7 @@ public void GenerateFunctionCall(Function function, Class @class = null, Type pu
10211021

10221022
var nativeVarName = paramInfo.Name;
10231023

1024-
var ctx = new MarshalContext(Context)
1024+
var ctx = new MarshalContext(Context, CurrentIndent)
10251025
{
10261026
ArgName = nativeVarName,
10271027
ReturnVarName = nativeVarName,
@@ -1054,7 +1054,7 @@ public void GenerateFunctionCall(Function function, Class @class = null, Type pu
10541054
isIntPtr ? "System::IntPtr()" : "nullptr");
10551055
}
10561056

1057-
var ctx = new MarshalContext(Context)
1057+
var ctx = new MarshalContext(Context, CurrentIndent)
10581058
{
10591059
ArgName = returnIdentifier,
10601060
ReturnVarName = returnIdentifier,
@@ -1167,7 +1167,7 @@ private ParamMarshal GenerateFunctionParamMarshal(Parameter param, int paramInde
11671167
QualifiedType = new QualifiedType(paramType)
11681168
};
11691169

1170-
var ctx = new MarshalContext(Context)
1170+
var ctx = new MarshalContext(Context, CurrentIndent)
11711171
{
11721172
Parameter = effectiveParam,
11731173
ParameterIndex = paramIndex,

src/Generator/Generators/CSharp/CSharpMarshal.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Linq;
34
using System.Text;
45
using CppSharp.AST;
@@ -10,11 +11,13 @@ namespace CppSharp.Generators.CSharp
1011
{
1112
public class CSharpMarshalContext : MarshalContext
1213
{
13-
public CSharpMarshalContext(BindingContext context)
14-
: base(context)
14+
public CSharpMarshalContext(BindingContext context, Stack<uint> indent)
15+
: base(context, indent)
1516
{
1617
ArgumentPrefix = new TextGenerator();
18+
indent.PushTo(ArgumentPrefix.CurrentIndent);
1719
Cleanup = new TextGenerator();
20+
indent.PushTo(Cleanup.CurrentIndent);
1821
}
1922

2023
public TextGenerator ArgumentPrefix { get; private set; }
@@ -335,7 +338,7 @@ public override bool VisitParameterDecl(Parameter parameter)
335338
if (parameter.Usage == ParameterUsage.Unknown || parameter.IsIn)
336339
return base.VisitParameterDecl(parameter);
337340

338-
var ctx = new CSharpMarshalContext(Context.Context)
341+
var ctx = new CSharpMarshalContext(Context.Context, Context.Indent)
339342
{
340343
ReturnType = Context.ReturnType,
341344
ReturnVarName = Context.ReturnVarName

src/Generator/Generators/CSharp/CSharpSources.cs

Lines changed: 38 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -820,7 +820,7 @@ private void GenerateVariableSetter(Variable var)
820820
QualifiedType = var.QualifiedType
821821
};
822822

823-
var ctx = new CSharpMarshalContext(Context)
823+
var ctx = new CSharpMarshalContext(Context, CurrentIndent)
824824
{
825825
Parameter = param,
826826
ArgName = param.Name,
@@ -880,38 +880,40 @@ private void GenerateFunctionSetter(Class @class, Property property)
880880

881881
private void GenerateFieldSetter(Field field, Class @class, QualifiedType fieldType)
882882
{
883+
string returnVar;
884+
Type type = field.Type.Desugar();
885+
var arrayType = type as ArrayType;
886+
if (arrayType != null && @class.IsValueType)
887+
{
888+
returnVar = HandleValueArray(arrayType, field);
889+
}
890+
else
891+
{
892+
var name = @class.Layout.Fields.First(f => f.FieldPtr == field.OriginalPtr).Name;
893+
var identifier = SafeIdentifier(name);
894+
if (@class.IsValueType)
895+
returnVar = $"{Helpers.InstanceField}.{identifier}";
896+
else
897+
returnVar = $"(({TypePrinter.PrintNative(@class)}*){Helpers.InstanceIdentifier})->{identifier}";
898+
}
899+
883900
var param = new Parameter
884901
{
885902
Name = "value",
886903
QualifiedType = field.QualifiedType
887904
};
888905

889-
var ctx = new CSharpMarshalContext(Context)
906+
var ctx = new CSharpMarshalContext(Context, CurrentIndent)
890907
{
891908
Parameter = param,
892909
ArgName = param.Name,
910+
ReturnVarName = returnVar
893911
};
894912
ctx.PushMarshalKind(MarshalKind.NativeField);
895913

896914
var marshal = new CSharpMarshalManagedToNativePrinter(ctx);
897915
ctx.Declaration = field;
898916

899-
Type type = field.Type.Desugar();
900-
var arrayType = type as ArrayType;
901-
902-
if (arrayType != null && @class.IsValueType)
903-
{
904-
ctx.ReturnVarName = HandleValueArray(arrayType, field);
905-
}
906-
else
907-
{
908-
var name = @class.Layout.Fields.First(f => f.FieldPtr == field.OriginalPtr).Name;
909-
var identifier = SafeIdentifier(name);
910-
if (@class.IsValueType)
911-
ctx.ReturnVarName = $"{Helpers.InstanceField}.{identifier}";
912-
else
913-
ctx.ReturnVarName = $"(({TypePrinter.PrintNative(@class)}*){Helpers.InstanceIdentifier})->{identifier}";
914-
}
915917
param.Visit(marshal);
916918

917919
if (!string.IsNullOrWhiteSpace(marshal.Context.Before))
@@ -987,7 +989,7 @@ private void GenerateIndexerSetter(Function function)
987989
function.OriginalReturnType.Type.IsPointerTo(out type);
988990

989991
var @internal = TypePrinter.PrintNative(function.Namespace);
990-
var ctx = new CSharpMarshalContext(Context)
992+
var ctx = new CSharpMarshalContext(Context, CurrentIndent)
991993
{
992994
Parameter = new Parameter
993995
{
@@ -1108,7 +1110,7 @@ private void GenerateVariableGetter(Variable var)
11081110

11091111
TypePrinter.PopContext();
11101112

1111-
var ctx = new CSharpMarshalContext(Context)
1113+
var ctx = new CSharpMarshalContext(Context, CurrentIndent)
11121114
{
11131115
ArgName = var.Name,
11141116
ReturnType = new QualifiedType(var.Type)
@@ -1171,12 +1173,18 @@ private static Property GetActualProperty(Property property, Class c)
11711173
private void GenerateFieldGetter(Field field, Class @class, QualifiedType returnType)
11721174
{
11731175
var name = @class.Layout.Fields.First(f => f.FieldPtr == field.OriginalPtr).Name;
1174-
String returnVar;
1176+
string returnVar;
1177+
var arrayType = field.Type.Desugar() as ArrayType;
11751178
if (@class.IsValueType)
1176-
returnVar = $@"{Helpers.InstanceField}.{SafeIdentifier(name)}";
1179+
{
1180+
if (arrayType != null)
1181+
returnVar = HandleValueArray(arrayType, field);
1182+
else
1183+
returnVar = $"{Helpers.InstanceField}.{SafeIdentifier(name)}";
1184+
}
11771185
else
11781186
{
1179-
returnVar = $@"(({TypePrinter.PrintNative(@class)}*) {Helpers.InstanceIdentifier})->{SafeIdentifier(name)}";
1187+
returnVar = $"(({TypePrinter.PrintNative(@class)}*) {Helpers.InstanceIdentifier})->{SafeIdentifier(name)}";
11801188
// Class field getter should return a reference object instead of a copy. Wrapping `returnVar` in
11811189
// IntPtr ensures that non-copying object constructor is invoked.
11821190
Class typeClass;
@@ -1185,7 +1193,7 @@ private void GenerateFieldGetter(Field field, Class @class, QualifiedType return
11851193
returnVar = $"new {CSharpTypePrinter.IntPtrType}(&{returnVar})";
11861194
}
11871195

1188-
var ctx = new CSharpMarshalContext(Context)
1196+
var ctx = new CSharpMarshalContext(Context, CurrentIndent)
11891197
{
11901198
ArgName = field.Name,
11911199
Declaration = field,
@@ -1194,11 +1202,6 @@ private void GenerateFieldGetter(Field field, Class @class, QualifiedType return
11941202
};
11951203
ctx.PushMarshalKind(MarshalKind.NativeField);
11961204

1197-
var arrayType = field.Type.Desugar() as ArrayType;
1198-
1199-
if (arrayType != null && @class.IsValueType)
1200-
ctx.ReturnVarName = HandleValueArray(arrayType, field);
1201-
12021205
var marshal = new CSharpMarshalNativeToManagedPrinter(ctx);
12031206
field.QualifiedType.Visit(marshal);
12041207

@@ -1666,7 +1669,7 @@ private void GenerateVTableManagedCall(Method method)
16661669
if (param.Kind == ParameterKind.IndirectReturnType)
16671670
continue;
16681671

1669-
var ctx = new CSharpMarshalContext(Context)
1672+
var ctx = new CSharpMarshalContext(Context, CurrentIndent)
16701673
{
16711674
ReturnType = param.QualifiedType,
16721675
ReturnVarName = param.Name,
@@ -1723,7 +1726,7 @@ private void GenerateVTableManagedCall(Method method)
17231726
};
17241727

17251728
// Marshal the managed result to native
1726-
var ctx = new CSharpMarshalContext(Context)
1729+
var ctx = new CSharpMarshalContext(Context, CurrentIndent)
17271730
{
17281731
ArgName = Helpers.ReturnIdentifier,
17291732
Parameter = param,
@@ -1901,7 +1904,7 @@ private void GenerateEventRaiseWrapper(Event @event, string delegateInstance)
19011904
var returns = new List<string>();
19021905
foreach (var param in @event.Parameters)
19031906
{
1904-
var ctx = new CSharpMarshalContext(Context)
1907+
var ctx = new CSharpMarshalContext(Context, CurrentIndent)
19051908
{
19061909
ReturnVarName = param.Name,
19071910
ReturnType = param.QualifiedType
@@ -2853,7 +2856,7 @@ into context
28532856

28542857
if (needsReturn)
28552858
{
2856-
var ctx = new CSharpMarshalContext(Context)
2859+
var ctx = new CSharpMarshalContext(Context, CurrentIndent)
28572860
{
28582861
ArgName = Helpers.ReturnIdentifier,
28592862
ReturnVarName = Helpers.ReturnIdentifier,
@@ -2944,7 +2947,7 @@ private void GenerateFunctionCallOutParams(IEnumerable<ParamMarshal> @params,
29442947

29452948
var nativeVarName = paramInfo.Name;
29462949

2947-
var ctx = new CSharpMarshalContext(Context)
2950+
var ctx = new CSharpMarshalContext(Context, CurrentIndent)
29482951
{
29492952
Parameter = param,
29502953
ArgName = nativeVarName,
@@ -3012,7 +3015,7 @@ private ParamMarshal GenerateFunctionParamMarshal(Parameter param, int paramInde
30123015
}
30133016
}
30143017

3015-
var ctx = new CSharpMarshalContext(Context)
3018+
var ctx = new CSharpMarshalContext(Context, CurrentIndent)
30163019
{
30173020
Parameter = param,
30183021
ParameterIndex = paramIndex,

src/Generator/Generators/Marshal.cs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,27 @@
11
using CppSharp.AST;
2+
using System.Collections.Generic;
23

34
namespace CppSharp.Generators
45
{
56
public class MarshalContext : TypePrinter
67
{
7-
public MarshalContext(BindingContext context)
8+
public MarshalContext(BindingContext context, Stack<uint> indent)
89
{
910
Context = context;
1011
Before = new TextGenerator();
12+
indent.PushTo(Before.CurrentIndent);
1113
Return = new TextGenerator();
14+
indent.PushTo(Return.CurrentIndent);
1215
MarshalVarPrefix = string.Empty;
16+
this.Indent = indent;
1317
}
1418

15-
public BindingContext Context { get; private set; }
19+
public BindingContext Context { get; }
1620

1721
public MarshalPrinter<MarshalContext> MarshalToNative;
1822

19-
public TextGenerator Before { get; private set; }
20-
public TextGenerator Return { get; private set; }
23+
public TextGenerator Before { get; }
24+
public TextGenerator Return { get; }
2125

2226
public string ReturnVarName { get; set; }
2327
public QualifiedType ReturnType { get; set; }
@@ -27,11 +31,12 @@ public MarshalContext(BindingContext context)
2731
public Function Function { get; set; }
2832

2933
public string MarshalVarPrefix { get; set; }
34+
public Stack<uint> Indent { get; }
3035
}
3136

3237
public abstract class MarshalPrinter<T> : AstVisitor where T : MarshalContext
3338
{
34-
public T Context { get; private set; }
39+
public T Context { get; }
3540

3641
protected MarshalPrinter(T ctx)
3742
{

src/Generator/Types/Std/Stdlib.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ public override void CLIMarshalToNative(MarshalContext ctx)
235235
QualifiedType = type
236236
};
237237

238-
var elementCtx = new MarshalContext(ctx.Context)
238+
var elementCtx = new MarshalContext(ctx.Context, ctx.Indent)
239239
{
240240
Parameter = param,
241241
ArgName = param.Name,
@@ -280,7 +280,7 @@ public override void CLIMarshalToManaged(MarshalContext ctx)
280280
ctx.ReturnVarName);
281281
ctx.Before.WriteStartBraceIndent();
282282
{
283-
var elementCtx = new MarshalContext(ctx.Context)
283+
var elementCtx = new MarshalContext(ctx.Context, ctx.Indent)
284284
{
285285
ReturnVarName = "_element",
286286
ReturnType = type

0 commit comments

Comments
 (0)