From f3714d192d75df0248e8a3cbf98f95ca8f618b40 Mon Sep 17 00:00:00 2001 From: rihi <19492038+rihi@users.noreply.github.com> Date: Thu, 21 Sep 2023 13:21:11 +0200 Subject: [PATCH] Move normalize_int to new file --- .../constant_folding.py | 22 +------------------ .../rules/positive_constants.py | 2 +- decompiler/util/integer_util.py | 19 ++++++++++++++++ 3 files changed, 21 insertions(+), 22 deletions(-) create mode 100644 decompiler/util/integer_util.py diff --git a/decompiler/pipeline/controlflowanalysis/expression_simplification/constant_folding.py b/decompiler/pipeline/controlflowanalysis/expression_simplification/constant_folding.py index 81c87498c..f770ff6b1 100644 --- a/decompiler/pipeline/controlflowanalysis/expression_simplification/constant_folding.py +++ b/decompiler/pipeline/controlflowanalysis/expression_simplification/constant_folding.py @@ -3,6 +3,7 @@ from typing import Callable, Optional from decompiler.structures.pseudo import Constant, Integer, OperationType +from decompiler.util.integer_util import normalize_int def constant_fold(operation: OperationType, constants: list[Constant]) -> Constant: @@ -103,27 +104,6 @@ def _constant_fold_shift(constants: list[Constant], fun: Callable[[int, int], in ) -def normalize_int(v: int, size: int, signed: bool) -> int: - """ - Normalizes an integer value to a specific size and signedness. - - This function takes an integer value 'v' and normalizes it to fit within - the specified 'size' in bits by discarding overflowing bits. If 'signed' is - true, the value is treated as a signed integer, i.e. interpreted as a two's complement. - Therefore the return value will be negative iff 'signed' is true and the most-significant bit is set. - - :param v: The value to be normalized. - :param size: The desired bit size for the normalized integer. - :param signed: True if the integer should be treated as signed. - :return: The normalized integer value. - """ - value = v & ((1 << size) - 1) - if signed and value & (1 << (size - 1)): - return value - (1 << size) - else: - return value - - _OPERATION_TO_FOLD_FUNCTION: dict[OperationType, Callable[[list[Constant]], Constant]] = { OperationType.minus: partial(_constant_fold_arithmetic_binary, fun=operator.sub), OperationType.plus: partial(_constant_fold_arithmetic_binary, fun=operator.add), diff --git a/decompiler/pipeline/controlflowanalysis/expression_simplification/rules/positive_constants.py b/decompiler/pipeline/controlflowanalysis/expression_simplification/rules/positive_constants.py index 6b358dd81..42da06986 100644 --- a/decompiler/pipeline/controlflowanalysis/expression_simplification/rules/positive_constants.py +++ b/decompiler/pipeline/controlflowanalysis/expression_simplification/rules/positive_constants.py @@ -1,6 +1,6 @@ -from decompiler.pipeline.controlflowanalysis.expression_simplification.constant_folding import normalize_int from decompiler.pipeline.controlflowanalysis.expression_simplification.rules.rule import SimplificationRule from decompiler.structures.pseudo import BinaryOperation, Constant, Expression, Integer, Operation, OperationType +from decompiler.util.integer_util import normalize_int class PositiveConstants(SimplificationRule): diff --git a/decompiler/util/integer_util.py b/decompiler/util/integer_util.py new file mode 100644 index 000000000..1e96f62bf --- /dev/null +++ b/decompiler/util/integer_util.py @@ -0,0 +1,19 @@ +def normalize_int(v: int, size: int, signed: bool) -> int: + """ + Normalizes an integer value to a specific size and signedness. + + This function takes an integer value 'v' and normalizes it to fit within + the specified 'size' in bits by discarding overflowing bits. If 'signed' is + true, the value is treated as a signed integer, i.e. interpreted as a two's complement. + Therefore the return value will be negative iff 'signed' is true and the most-significant bit is set. + + :param v: The value to be normalized. + :param size: The desired bit size for the normalized integer. + :param signed: True if the integer should be treated as signed. + :return: The normalized integer value. + """ + value = v & ((1 << size) - 1) + if signed and value & (1 << (size - 1)): + return value - (1 << size) + else: + return value \ No newline at end of file