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));
}
}