diff --git a/libs/UIX.DecompXml/ControlFlowAnalyzer.cs b/libs/UIX.DecompXml/ControlFlowAnalyzer.cs index b902bc0..16ba0e5 100644 --- a/libs/UIX.DecompXml/ControlFlowAnalyzer.cs +++ b/libs/UIX.DecompXml/ControlFlowAnalyzer.cs @@ -130,10 +130,10 @@ public static class ControlFlowAnalyzer sb.AppendLine($" >];"); if (block.NextOffset is not uint.MaxValue) - sb.AppendLine($" {nodeId} -> {block.NextOffset};"); + sb.AppendLine($" {nodeId}:s -> {block.NextOffset}:n;"); if (block.BranchTargetOffset is not uint.MaxValue) - sb.AppendLine($" {nodeId} -> {block.BranchTargetOffset} [color=red];"); + sb.AppendLine($" {nodeId}:s -> {block.BranchTargetOffset}:n [color=red];"); } sb.AppendLine("}"); diff --git a/libs/UIX.DecompXml/Decompiler.Script.cs b/libs/UIX.DecompXml/Decompiler.Script.cs index 145cb26..22b62fc 100644 --- a/libs/UIX.DecompXml/Decompiler.Script.cs +++ b/libs/UIX.DecompXml/Decompiler.Script.cs @@ -32,7 +32,7 @@ partial class Decompiler var controlBlocks = ControlFlowAnalyzer.CreateGraph(methodBody); var dotGraph = ControlFlowAnalyzer.SerializeToGraphviz(controlBlocks); - //Console.WriteLine(dotGraph); + Console.WriteLine(dotGraph); Stack blockStack = []; blockStack.Push(new(0, methodBody[^1].Offset, SyntaxKind.Block, null)); @@ -101,7 +101,7 @@ partial class Decompiler var symbolRef = export.SymbolReferenceTable[writeSymbolIndex]; var symbolIdentifierExpr = IrisExpression.ToSyntax(symbolRef); - var newSymbolValueExpr = IrisExpression.ToSyntax(newSymbolValue, _context); + var newSymbolValueExpr = SimplifyExpression(IrisExpression.ToSyntax(newSymbolValue, _context), true); StatementSyntax symbolWriteExpr; @@ -175,14 +175,15 @@ partial class Decompiler var isPeek = opCode is OpCode.JumpIfFalsePeek or OpCode.JumpIfTruePeek or OpCode.JumpIfNullPeek; var rawJumpCondition = IrisExpression.ToSyntax(isPeek ? stack.Peek() : stack.Pop(), _context); + // TODO: Invert jump condition when decompiling to blocks instead of gotos var jumpCondition = opCode switch { OpCode.JumpIfFalse or - OpCode.JumpIfFalsePeek => rawJumpCondition, + OpCode.JumpIfFalsePeek => LogicalNotOf(rawJumpCondition), - OpCode.JumpIfTruePeek => LogicalNotOf(rawJumpCondition), + OpCode.JumpIfTruePeek => rawJumpCondition, - OpCode.JumpIfNullPeek => BinaryExpression(SyntaxKind.ExclamationEqualsToken, + OpCode.JumpIfNullPeek => BinaryExpression(SyntaxKind.EqualsEqualsToken, rawJumpCondition, LiteralExpression(SyntaxKind.NullLiteralExpression)), diff --git a/libs/UIX.DecompXml/Mock/IrisObject.cs b/libs/UIX.DecompXml/Mock/IrisObject.cs index 8d4e21a..207e2d8 100644 --- a/libs/UIX.DecompXml/Mock/IrisObject.cs +++ b/libs/UIX.DecompXml/Mock/IrisObject.cs @@ -57,6 +57,11 @@ internal record IrisObject(object Object, TypeSchema Type) if (property is not null) return property.PropertyType; } + else if (expr is CastExpressionSyntax castExpr) + { + var castTargetName = QualifiedTypeName.Parse(castExpr.Type.ToString()); + return ctx.GetImportedType(castTargetName); + } return null; }