From f327f18b57b7e274a4d347d90703b525fca90509 Mon Sep 17 00:00:00 2001 From: mm00 Date: Wed, 19 Feb 2025 17:07:37 +0100 Subject: [PATCH] added IsPointer member to DNA field data --- CodeGenerator/Program.cs | 42 ++++++++++++++++++++++++++++++++++++---- CodeGenerator/StrExt.cs | 4 ++++ 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/CodeGenerator/Program.cs b/CodeGenerator/Program.cs index 6b49734..b547e20 100644 --- a/CodeGenerator/Program.cs +++ b/CodeGenerator/Program.cs @@ -234,6 +234,28 @@ namespace CodeGenerator { } }; ctd.Members.Add(cmp); + + cmf = new CodeMemberField(typeof(bool), "_isPointer") { + Attributes = MemberAttributes.Private + }; + + ctd.Members.Add(cmf); + + cmp = new CodeMemberProperty() { + Name = "IsPointer", + Type = new CodeTypeReference(typeof(bool)), + Attributes = MemberAttributes.Public, + HasGet = true, + GetStatements = { + new CodeMethodReturnStatement(new CodeSnippetExpression("_isPointer")) + }, + HasSet = true, + SetStatements = { + new CodeAssignStatement(new CFieldRefExp(new CThisRefExp(), "_isPointer"), new CArgRefExp("value")) + } + }; + + ctd.Members.Add(cmp); var cc = new CodeConstructor() { Attributes = MemberAttributes.Public }; @@ -242,7 +264,8 @@ namespace CodeGenerator { new(typeof(string), "originalType"), new(typeof(string), "originalName"), new(typeof(string), "underlyingType"), - new(typeof(int), "size") + new(typeof(int), "size"), + new(typeof(bool), "isPointer") }); cc.Statements.AddRange(new CodeAssignStatement[] { @@ -250,7 +273,8 @@ namespace CodeGenerator { new(new CFieldRefExp(new CThisRefExp(), "OriginalType"), new CArgRefExp("originalType")), new(new CFieldRefExp(new CThisRefExp(), "OriginalName"), new CArgRefExp("originalName")), new(new CFieldRefExp(new CThisRefExp(), "OriginalType"), new CArgRefExp("underlyingType")), - new(new CFieldRefExp(new CThisRefExp(), "Size"), new CArgRefExp("size")) + new(new CFieldRefExp(new CThisRefExp(), "Size"), new CArgRefExp("size")), + new(new CFieldRefExp(new CThisRefExp(), "IsPointer"), new CArgRefExp("isPointer")) }); ctd.Members.Add(cc); @@ -327,6 +351,15 @@ namespace CodeGenerator { BlendFile.Dna1Body body) { string t; int size = body.Lengths[field.IdxType]; + + bool isPointer = false; + + if (field.Name.StartsWith('*')) + { + size = 4; + isPointer = true; + } + if (field.Name.Contains('[')) { CodeMemberField amf = CreateArrayMemberField(field); var sb = new StringBuilder(); @@ -347,14 +380,15 @@ namespace CodeGenerator { { t = field.Type; } - + CodeAttributeDeclaration cad = new("DNAFieldAttribute"); cad.Arguments.AddRange(new CodeAttributeArgumentCollection() { new(new CodePrimitiveExpression(index)), new(new CodePrimitiveExpression(field.Type)), new(new CodePrimitiveExpression(field.Name)), new(new CodePrimitiveExpression(t)), - new(new CodePrimitiveExpression(size)) + new(new CodePrimitiveExpression(size)), + new(new CodePrimitiveExpression(isPointer)) }); return cad; } diff --git a/CodeGenerator/StrExt.cs b/CodeGenerator/StrExt.cs index e12d090..153e3e5 100644 --- a/CodeGenerator/StrExt.cs +++ b/CodeGenerator/StrExt.cs @@ -1,10 +1,14 @@ +using System.Runtime.CompilerServices; + namespace CodeGenerator { public static class StrExt { + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string ParseFName(this string str) { str = str.Replace("*", "ptr_"); return str; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string ParseFType(this string str) { return str switch { "char" => typeof(char).AssemblyQualifiedName,