summaryrefslogtreecommitdiff
path: root/lang/rust/pseudorust.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lang/rust/pseudorust.cpp')
-rw-r--r--lang/rust/pseudorust.cpp40
1 files changed, 28 insertions, 12 deletions
diff --git a/lang/rust/pseudorust.cpp b/lang/rust/pseudorust.cpp
index e3f661fa..1aeae158 100644
--- a/lang/rust/pseudorust.cpp
+++ b/lang/rust/pseudorust.cpp
@@ -258,9 +258,15 @@ void PseudoRustFunction::AppendComparison(const string& comparison, const HighLe
const auto leftExpr = instr.GetLeftExpr();
const auto rightExpr = instr.GetRightExpr();
- GetExprText(leftExpr, emitter, settings, precedence, InnerExpression, signedHint);
+ if (leftExpr.operation == HLIL_SPLIT)
+ AppendDefaultSplitExpr(leftExpr, emitter, settings, precedence);
+ else
+ GetExprText(leftExpr, emitter, settings, precedence, InnerExpression, signedHint);
emitter.Append(OperationToken, comparison);
- GetExprText(rightExpr, emitter, settings, precedence, InnerExpression, signedHint);
+ if (rightExpr.operation == HLIL_SPLIT)
+ AppendDefaultSplitExpr(rightExpr, emitter, settings, precedence);
+ else
+ GetExprText(rightExpr, emitter, settings, precedence, InnerExpression, signedHint);
}
@@ -551,6 +557,25 @@ void PseudoRustFunction::AppendFieldTextTokens(const HighLevelILInstruction& var
}
+void PseudoRustFunction::AppendDefaultSplitExpr(const BinaryNinja::HighLevelILInstruction& instr,
+ BinaryNinja::HighLevelILTokenEmitter& tokens, DisassemblySettings* settings, BNOperatorPrecedence precedence)
+{
+ const auto high = instr.GetHighExpr<HLIL_SPLIT>();
+ const auto low = instr.GetLowExpr<HLIL_SPLIT>();
+ if (precedence == EqualityOperatorPrecedence)
+ tokens.AppendOpenParen();
+ tokens.AppendOpenParen();
+ GetExprText(high, tokens, settings, precedence);
+ tokens.Append(OperationToken, " << ");
+ tokens.Append(IntegerToken, std::to_string(low.size * 8));
+ tokens.AppendCloseParen();
+ tokens.Append(OperationToken, " | ");
+ GetExprText(low, tokens, settings, precedence);
+ if (precedence == EqualityOperatorPrecedence)
+ tokens.AppendCloseParen();
+}
+
+
bool PseudoRustFunction::IsMutable(const Variable& var) const
{
for (auto i : GetHighLevelILFunction()->GetVariableDefinitions(var))
@@ -1391,19 +1416,10 @@ void PseudoRustFunction::GetExprText(const HighLevelILInstruction& instr, HighLe
}
else if (srcExpr.operation == HLIL_SPLIT)
{
- const auto high = srcExpr.GetHighExpr<HLIL_SPLIT>();
- const auto low = srcExpr.GetLowExpr<HLIL_SPLIT>();
GetExprText(destExpr, tokens, settings, precedence);
tokens.Append(OperationToken, " = ");
- tokens.AppendOpenParen();
- GetExprText(high, tokens, settings, precedence);
- tokens.Append(OperationToken, " << ");
- tokens.Append(IntegerToken, std::to_string(low.size * 8));
- tokens.AppendCloseParen();
- tokens.Append(OperationToken, " | ");
- GetExprText(low, tokens, settings, precedence);
+ AppendDefaultSplitExpr(srcExpr, tokens, settings, precedence);
tokens.AppendSemicolon();
- tokens.NewLine();
return;
}
else