diff --git a/src/Branch/PackageObjectLegacyVersion.cs b/src/Branch/PackageObjectLegacyVersion.cs index 883d348..7678d05 100644 --- a/src/Branch/PackageObjectLegacyVersion.cs +++ b/src/Branch/PackageObjectLegacyVersion.cs @@ -4,6 +4,11 @@ namespace UELib.Branch { public enum PackageObjectLegacyVersion { + /// + /// This is one particular update with A LOT of general package changes. + /// + ReturnExpressionAddedToReturnToken = 62, + /// /// FIXME: Unknown version. /// diff --git a/src/Core/Tokens/JumpTokens.cs b/src/Core/Tokens/JumpTokens.cs index 3430f63..f811e14 100644 --- a/src/Core/Tokens/JumpTokens.cs +++ b/src/Core/Tokens/JumpTokens.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using UELib.Annotations; +using UELib.Branch; namespace UELib.Core { @@ -12,25 +13,34 @@ public class ReturnToken : Token { public override void Deserialize(IUnrealStream stream) { + if (Decompiler._Buffer.Version < (uint)PackageObjectLegacyVersion.ReturnExpressionAddedToReturnToken) + { + return; + } + // Expression DeserializeNext(); } public override string Decompile() { - #region CaseToken Support - // HACK: for case's that end with a return instead of a break. if (Decompiler.IsInNest(NestManager.Nest.NestType.Default) != null) { Decompiler._Nester.TryAddNestEnd(NestManager.Nest.NestType.Switch, Position + Size); } - #endregion + Decompiler.MarkSemicolon(); + if (Decompiler._Buffer.Version < (uint)PackageObjectLegacyVersion.ReturnExpressionAddedToReturnToken) + { + // FIXME: Transport the emitted "ReturnValue = Expression" over here. + return "return"; + } string returnValue = DecompileNext(); - Decompiler._CanAddSemicolon = true; - return "return" + (returnValue.Length != 0 ? " " + returnValue : string.Empty); + return "return" + (returnValue.Length != 0 + ? " " + returnValue + : string.Empty); } } @@ -38,17 +48,15 @@ public class ReturnNothingToken : EatReturnValueToken { public override string Decompile() { - #region CaseToken Support - // HACK: for case's that end with a return instead of a break. if (Decompiler.IsInNest(NestManager.Nest.NestType.Default) != null) { Decompiler._Nester.TryAddNestEnd(NestManager.Nest.NestType.Switch, Position + Size); } - #endregion - - return ReturnValueProperty != null ? ReturnValueProperty.Name : string.Empty; + return ReturnValueProperty != null + ? ReturnValueProperty.Name + : string.Empty; } } @@ -62,7 +70,7 @@ public override void Deserialize(IUnrealStream stream) public override string Decompile() { - Decompiler._CanAddSemicolon = true; + Decompiler.MarkSemicolon(); return $"goto {DecompileNext()}"; } } diff --git a/src/Core/Tokens/OtherTokens.cs b/src/Core/Tokens/OtherTokens.cs index 8e63c0d..676d743 100644 --- a/src/Core/Tokens/OtherTokens.cs +++ b/src/Core/Tokens/OtherTokens.cs @@ -165,7 +165,7 @@ public override void Deserialize(IUnrealStream stream) // -- definitely not in the older UE3 builds v186 if (stream.Version < 200) return; - ReturnValueProperty = stream.ReadObject() as UProperty; + ReturnValueProperty = stream.ReadObject(); Decompiler.AlignObjectSize(); } } @@ -187,27 +187,18 @@ public class BeginFunctionToken : Token { public override void Deserialize(IUnrealStream stream) { - var structContainer = Decompiler._Container; - for (var field = structContainer.Children; field != null; field = field.NextField) + for (;;) { - var property = field as UProperty; - if (property == null) + byte elementSize = stream.ReadByte(); + Decompiler.AlignSize(sizeof(byte)); + if (elementSize == 0x00) { - continue; + break; } - if (!property.HasPropertyFlag(Flags.PropertyFlagsLO.Parm | Flags.PropertyFlagsLO.ReturnParm)) - continue; - - stream.ReadByte(); // Size - Decompiler.AlignSize(sizeof(byte)); - stream.ReadByte(); // bOutParam Decompiler.AlignSize(sizeof(byte)); } - - stream.ReadByte(); // End - Decompiler.AlignSize(sizeof(byte)); } }