From 4092443a90c920c36444f8bb4b9421704090a93f Mon Sep 17 00:00:00 2001 From: Merlin <36685500+Merlin-san@users.noreply.github.com> Date: Thu, 2 Apr 2020 23:33:08 -0700 Subject: [PATCH] Fix issue with assigning default values to user types breaking the heap - Fix issue with assigning default values on user-defined types using the user defined type to assign to the heap which would put the wrong type into the heap and die in game. --- .../Editor/UdonSharpCompilationModule.cs | 4 ++++ Assets/UdonSharp/Editor/UdonSharpCompiler.cs | 16 ++++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/Assets/UdonSharp/Editor/UdonSharpCompilationModule.cs b/Assets/UdonSharp/Editor/UdonSharpCompilationModule.cs index a932c407..6761b5f4 100644 --- a/Assets/UdonSharp/Editor/UdonSharpCompilationModule.cs +++ b/Assets/UdonSharp/Editor/UdonSharpCompilationModule.cs @@ -27,6 +27,8 @@ public class CompilationModule public HashSet fieldsWithInitializers; + public ClassDefinition compiledClassDefinition = null; + public int ErrorCount { get; private set; } = 0; public CompilationModule(UdonSharpProgramAsset sourceAsset) @@ -133,6 +135,8 @@ public int Compile(List classDefinitions) if (errorCount == 0) { + compiledClassDefinition = classDefinitions.Where(e => e.userClassType == visitor.visitorContext.behaviourUserType).FirstOrDefault(); + Profiler.BeginSample("Build assembly"); string dataBlock = BuildHeapDataBlock(); string codeBlock = visitor.GetCompiledUasm(); diff --git a/Assets/UdonSharp/Editor/UdonSharpCompiler.cs b/Assets/UdonSharp/Editor/UdonSharpCompiler.cs index 9132412e..fe481801 100644 --- a/Assets/UdonSharp/Editor/UdonSharpCompiler.cs +++ b/Assets/UdonSharp/Editor/UdonSharpCompiler.cs @@ -196,16 +196,28 @@ private int RunFieldInitalizers(CompilationModule[] compiledModules) bool isConst = fieldDeclarationSyntax.Modifiers.Any(t => t.ToString() == "const"); foreach (var variable in fieldDeclarationSyntax.Declaration.Variables) { + FieldDefinition fieldDef = module.compiledClassDefinition?.fieldDefinitions?.Find(e => (e.fieldSymbol.declarationType == SymbolDeclTypeFlags.Private || e.fieldSymbol.declarationType == SymbolDeclTypeFlags.Public) && + e.fieldSymbol.symbolOriginalName == variable.Identifier.ToString()); + + string typeQualifiedName = type.ToString(); + if (fieldDef != null) + { + if (fieldDef.fieldSymbol.symbolCsType.Namespace.Length == 0) + typeQualifiedName = fieldDef.fieldSymbol.symbolCsType.Name; + else + typeQualifiedName = fieldDef.fieldSymbol.symbolCsType.Namespace + "." + fieldDef.fieldSymbol.symbolCsType.Name; + } + if (variable.Initializer != null) { string name = variable.Identifier.ToString(); if (isConst) { - _class.Members.Add(new CodeSnippetTypeMember($"const {type} {name} {variable.Initializer};")); + _class.Members.Add(new CodeSnippetTypeMember($"const {typeQualifiedName} {name} {variable.Initializer};")); } else { - method.Statements.Add(new CodeSnippetStatement($"{type} {name} {variable.Initializer};")); + method.Statements.Add(new CodeSnippetStatement($"{typeQualifiedName} {name} {variable.Initializer};")); } method.Statements.Add(new CodeSnippetStatement(