Explorar o código

LibWasm: Allow Value::to<T>() to perform statically valid conversions

e.g. i32 -> i16 (if within range).
Ali Mohammad Pur %!s(int64=2) %!d(string=hai) anos
pai
achega
eceb244bef

+ 6 - 4
Userland/Libraries/LibWasm/AbstractMachine/AbstractMachine.h

@@ -126,10 +126,12 @@ public:
         Optional<T> result;
         m_value.visit(
             [&](auto value) {
-                if constexpr (IsSame<T, decltype(value)>)
-                    result = value;
-                else if constexpr (!IsFloatingPoint<T> && IsSame<decltype(value), MakeSigned<T>>)
-                    result = value;
+                if constexpr (IsSame<T, decltype(value)> || (!IsFloatingPoint<T> && IsSame<decltype(value), MakeSigned<T>>)) {
+                    result = static_cast<T>(value);
+                } else if constexpr (!IsFloatingPoint<T> && IsConvertible<decltype(value), T>) {
+                    if (AK::is_within_range<T>(value))
+                        result = static_cast<T>(value);
+                }
             },
             [&](Reference const& value) {
                 if constexpr (IsSame<T, Reference>) {