diff --git a/plugins/libimhex/include/hex/helpers/utils.hpp b/plugins/libimhex/include/hex/helpers/utils.hpp index 7f8029f11..8a1f9e0f2 100644 --- a/plugins/libimhex/include/hex/helpers/utils.hpp +++ b/plugins/libimhex/include/hex/helpers/utils.hpp @@ -115,6 +115,11 @@ namespace hex { return result; } + [[nodiscard]] + constexpr uint64_t bitmask(uint8_t bits) { + return (uint64_t(1) << (bits)) - 1; + } + template constexpr T changeEndianess(T value, size_t size, std::endian endian) { if (endian == std::endian::native) diff --git a/plugins/libimhex/source/pattern_language/evaluator.cpp b/plugins/libimhex/source/pattern_language/evaluator.cpp index dc5c9cae2..1a2008f91 100644 --- a/plugins/libimhex/source/pattern_language/evaluator.cpp +++ b/plugins/libimhex/source/pattern_language/evaluator.cpp @@ -81,11 +81,11 @@ namespace hex::pl { Token::Literal castedLiteral = std::visit(overloaded { [&](double &value) -> Token::Literal { if (dynamic_cast(pattern)) - return u128(value); + return u128(value) & bitmask(pattern->getSize() * 8); else if (dynamic_cast(pattern)) - return s128(value); + return s128(value) & bitmask(pattern->getSize() * 8); else if (dynamic_cast(pattern)) - return value; + return pattern->getSize() == sizeof(float) ? double(float(value)) : value; else LogConsole::abortEvaluation(hex::format("cannot cast type 'double' to type '{}'", pattern->getTypeName())); }, @@ -103,15 +103,15 @@ namespace hex::pl { }, [&](auto &&value) -> Token::Literal { if (dynamic_cast(pattern) || dynamic_cast(pattern)) - return u128(value); + return u128(value) & bitmask(pattern->getSize() * 8); else if (dynamic_cast(pattern)) - return s128(value); + return s128(value) & bitmask(pattern->getSize() * 8); else if (dynamic_cast(pattern)) return char(value); else if (dynamic_cast(pattern)) return bool(value); else if (dynamic_cast(pattern)) - return double(value); + return pattern->getSize() == sizeof(float) ? double(float(value)) : value; else LogConsole::abortEvaluation(hex::format("cannot cast integer literal to type '{}'", pattern->getTypeName())); }