From 60880324c582eb3868d497074b5f04797c747eb7 Mon Sep 17 00:00:00 2001 From: Joao Matos Date: Sat, 20 Feb 2021 22:37:38 +0000 Subject: [PATCH] Add experimental GenerateExternalDataFields option and supporting code. --- src/Generator/Generators/C/CppHeaders.cs | 41 ++++++++++++++++++++++++ src/Generator/Options.cs | 6 ++++ 2 files changed, 47 insertions(+) diff --git a/src/Generator/Generators/C/CppHeaders.cs b/src/Generator/Generators/C/CppHeaders.cs index 2e4cbca2..63ce8b94 100644 --- a/src/Generator/Generators/C/CppHeaders.cs +++ b/src/Generator/Generators/C/CppHeaders.cs @@ -329,6 +329,9 @@ namespace CppSharp.Generators.Cpp if (CppGenerator.ShouldGenerateClassNativeInstanceField(@class)) GenerateClassNativeField(@class); + if (Options.GenerateExternalDataFields) + GenerateExternalDataFields(@class); + GenerateClassConstructors(@class); GenerateClassProperties(@class); GenerateClassEvents(@class); @@ -366,6 +369,44 @@ namespace CppSharp.Generators.Cpp return true; } + // Generate an external instance storage location for external bindings. + public virtual void GenerateExternalDataFields(Class @class) + { + PushBlock(); + + var voidPtrType = new PointerType(new QualifiedType(new BuiltinType(PrimitiveType.Void))); + var externalInstanceField = new Field() + { + Name = Generator.GeneratedIdentifier("ExternalInstance"), + QualifiedType = new QualifiedType(voidPtrType), + Namespace = @class + }; + + Indent(); + CTypePrinter.PushContext(TypePrinterContextKind.Native); + externalInstanceField.Visit(this); + CTypePrinter.PopContext(); + + var externalDataField = new Field() + { + Name = Generator.GeneratedIdentifier("ExternalData"), + QualifiedType = new QualifiedType(new ArrayType + { + QualifiedType = new QualifiedType(voidPtrType), + SizeType = ArrayType.ArraySize.Constant, + Size = 2 + }), + Namespace = @class + }; + + CTypePrinter.PushContext(TypePrinterContextKind.Native); + var result = externalDataField.Visit(CTypePrinter); + CTypePrinter.PopContext(); + Unindent(); + + PopBlock(NewLineKind.BeforeNextBlock); + } + public void GenerateClassNativeField(Class @class) { PushBlock(); diff --git a/src/Generator/Options.cs b/src/Generator/Options.cs index bd6d183d..b980916f 100644 --- a/src/Generator/Options.cs +++ b/src/Generator/Options.cs @@ -185,6 +185,12 @@ namespace CppSharp public bool UsePropertyDetectionHeuristics { get; set; } = true; + /// + /// Experimental option that makes the C/C++ generator generate some extra data storage + /// on the generated instance, for supporting higher-level binding of the code. + /// + public bool GenerateExternalDataFields { get; set; } = false; + #endregion }