@@ -2464,92 +2464,85 @@ void PseudoCFunction::GetExprTextInternal(const HighLevelILInstruction& instr, H
2464
2464
if (type && (type->GetClass () == NamedTypeReferenceClass))
2465
2465
type = GetFunction ()->GetView ()->GetTypeByRef (type->GetNamedTypeReference ());
2466
2466
2467
- bool derefOffset = false ;
2467
+ bool memberResolved = false ;
2468
2468
if (type && (type->GetClass () == StructureTypeClass))
2469
2469
{
2470
2470
std::optional<size_t > memberIndexHint;
2471
2471
if (memberIndex != BN_INVALID_EXPR)
2472
2472
memberIndexHint = memberIndex;
2473
2473
2474
2474
bool outer = true ;
2475
- if (type->GetStructure ()->ResolveMemberOrBaseMember (GetFunction ()->GetView (), offset, 0 ,
2476
- [&](NamedTypeReference*, Structure* s, size_t memberIndex, uint64_t structOffset,
2477
- uint64_t adjustedOffset, const StructureMember& member) {
2478
- BNSymbolDisplayResult symbolType;
2479
- if (srcExpr.operation == HLIL_CONST_PTR)
2480
- {
2481
- const auto constant = srcExpr.GetConstant <HLIL_CONST_PTR>();
2482
- symbolType = tokens.AppendPointerTextToken (
2483
- srcExpr, constant, settings, DisplaySymbolOnly, precedence);
2484
- }
2485
- else
2486
- {
2487
- GetExprTextInternal (srcExpr, tokens, settings, MemberAndFunctionOperatorPrecedence);
2488
- symbolType = OtherSymbolResult;
2489
- }
2490
-
2491
- const auto displayDeref = symbolType != DataSymbolResult;
2492
- if (displayDeref && outer)
2493
- tokens.Append (OperationToken, " ->" );
2494
- else
2495
- tokens.Append (OperationToken, " ." );
2496
- outer = false ;
2497
-
2498
- vector<string> nameList {member.name };
2499
- HighLevelILTokenEmitter::AddNamesForOuterStructureMembers (
2500
- GetFunction ()->GetView (), type, srcExpr, nameList);
2501
-
2502
- tokens.Append (FieldNameToken, member.name , structOffset + member.offset , 0 , 0 ,
2503
- BN_FULL_CONFIDENCE, nameList);
2504
- }),
2505
- memberIndexHint)
2475
+ memberResolved = type->GetStructure ()->ResolveMemberOrBaseMember (GetFunction ()->GetView (), offset, 0 ,
2476
+ [&](NamedTypeReference*, Structure* s, size_t memberIndex, uint64_t structOffset,
2477
+ uint64_t adjustedOffset, const StructureMember& member) {
2478
+ BNSymbolDisplayResult symbolType;
2479
+ if (srcExpr.operation == HLIL_CONST_PTR)
2480
+ {
2481
+ const auto constant = srcExpr.GetConstant <HLIL_CONST_PTR>();
2482
+ symbolType = tokens.AppendPointerTextToken (
2483
+ srcExpr, constant, settings, DisplaySymbolOnly, precedence);
2484
+ }
2485
+ else
2486
+ {
2487
+ GetExprTextInternal (srcExpr, tokens, settings, MemberAndFunctionOperatorPrecedence);
2488
+ symbolType = OtherSymbolResult;
2489
+ }
2490
+
2491
+ const auto displayDeref = symbolType != DataSymbolResult;
2492
+ if (displayDeref && outer)
2493
+ tokens.Append (OperationToken, " ->" );
2494
+ else
2495
+ tokens.Append (OperationToken, " ." );
2496
+ outer = false ;
2497
+
2498
+ vector<string> nameList {member.name };
2499
+ HighLevelILTokenEmitter::AddNamesForOuterStructureMembers (
2500
+ GetFunction ()->GetView (), type, srcExpr, nameList);
2501
+
2502
+ tokens.Append (FieldNameToken, member.name , structOffset + member.offset , 0 , 0 ,
2503
+ BN_FULL_CONFIDENCE, nameList);
2504
+ },
2505
+ memberIndexHint);
2506
+
2507
+ if (memberResolved)
2506
2508
return ;
2507
2509
}
2508
- else if (type && (type->GetClass () == StructureTypeClass))
2509
- {
2510
- derefOffset = true ;
2511
- }
2512
2510
2513
- if (derefOffset || offset != 0 )
2514
- {
2515
- bool parens = precedence > UnaryOperatorPrecedence;
2516
- if (parens)
2517
- tokens.AppendOpenParen ();
2511
+ // Fall through to handle as pointer arithmetic
2512
+ bool parens = precedence > UnaryOperatorPrecedence;
2513
+ if (parens)
2514
+ tokens.AppendOpenParen ();
2518
2515
2519
- tokens.Append (OperationToken, " *" );
2520
- if (!settings || settings->IsOptionSet (ShowTypeCasts))
2521
- {
2522
- tokens.AppendOpenParen ();
2523
- AppendSizeToken (!derefOffset ? srcExpr.size : instr.size , true , tokens);
2524
- tokens.Append (TextToken, " *" );
2525
- tokens.AppendCloseParen ();
2526
- }
2516
+ tokens.Append (OperationToken, " *" );
2517
+ if (!settings || settings->IsOptionSet (ShowTypeCasts))
2518
+ {
2527
2519
tokens.AppendOpenParen ();
2528
- if (!settings || settings->IsOptionSet (ShowTypeCasts))
2529
- {
2530
- tokens.AppendOpenParen ();
2531
- tokens.Append (TypeNameToken, " char" );
2532
- tokens.Append (TextToken, " *" );
2533
- tokens.AppendCloseParen ();
2534
- }
2520
+ AppendSizeToken (instr.size , true , tokens);
2521
+ tokens.Append (TextToken, " *" );
2522
+ tokens.AppendCloseParen ();
2523
+ }
2524
+ tokens.AppendOpenParen ();
2535
2525
2536
- if (srcExpr.operation == HLIL_CONST_PTR)
2537
- {
2538
- const auto constant = srcExpr.GetConstant <HLIL_CONST_PTR>();
2539
- tokens.AppendPointerTextToken (srcExpr, constant, settings, DisplaySymbolOnly, precedence);
2540
- }
2541
- else
2542
- {
2543
- GetExprTextInternal (srcExpr, tokens, settings, AddOperatorPrecedence);
2544
- }
2526
+ if (srcExpr.operation == HLIL_CONST_PTR)
2527
+ {
2528
+ const auto constant = srcExpr.GetConstant <HLIL_CONST_PTR>();
2529
+ tokens.AppendPointerTextToken (srcExpr, constant, settings, DisplaySymbolOnly, precedence);
2530
+ }
2531
+ else
2532
+ {
2533
+ GetExprTextInternal (srcExpr, tokens, settings, AddOperatorPrecedence);
2534
+ }
2545
2535
2536
+ if (offset != 0 )
2537
+ {
2546
2538
tokens.Append (OperationToken, " + " );
2547
2539
tokens.AppendIntegerTextToken (instr, offset, instr.size );
2548
- tokens.AppendCloseParen ();
2549
- if (parens)
2550
- tokens.AppendCloseParen ();
2551
2540
}
2552
2541
2542
+ tokens.AppendCloseParen ();
2543
+ if (parens)
2544
+ tokens.AppendCloseParen ();
2545
+
2553
2546
if (statement)
2554
2547
tokens.AppendSemicolon ();
2555
2548
}();
0 commit comments