From ceed9eb01a1344efb20b007db1323d4bc8adf700 Mon Sep 17 00:00:00 2001 From: ds5678 <49847914+ds5678@users.noreply.github.com> Date: Sun, 6 Apr 2025 12:53:35 -0700 Subject: [PATCH] Dont call GetPointerArithmeticOffset twice unnecessarily --- ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs index 292430eec..320d75034 100644 --- a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs +++ b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs @@ -1249,6 +1249,7 @@ namespace ICSharpCode.Decompiler.CSharp { return null; } + TranslatedExpression? offsetExpressionFromTypeHint = null; if (context.TypeHint.Kind == TypeKind.Pointer) { // We use the type hint if one of the following is true: @@ -1258,13 +1259,17 @@ namespace ICSharpCode.Decompiler.CSharp var typeHint = (PointerType)context.TypeHint; int elementTypeSize = pointerType.ElementType.GetSize(); - if ((elementTypeSize == 0 || typeHint.ElementType.GetSize() != elementTypeSize) - && GetPointerArithmeticOffset(byteOffsetInst, byteOffsetExpr, typeHint.ElementType, inst.CheckForOverflow) != null) + if (elementTypeSize == 0 || typeHint.ElementType.GetSize() != elementTypeSize) { - pointerType = typeHint; + offsetExpressionFromTypeHint = GetPointerArithmeticOffset(byteOffsetInst, byteOffsetExpr, typeHint.ElementType, inst.CheckForOverflow); + if (offsetExpressionFromTypeHint != null) + { + pointerType = typeHint; + } } } - TranslatedExpression offsetExpr = GetPointerArithmeticOffset(byteOffsetInst, byteOffsetExpr, pointerType.ElementType, inst.CheckForOverflow) + TranslatedExpression offsetExpr = offsetExpressionFromTypeHint + ?? GetPointerArithmeticOffset(byteOffsetInst, byteOffsetExpr, pointerType.ElementType, inst.CheckForOverflow) ?? FallBackToBytePointer(); if (left.Type.Kind == TypeKind.Pointer)