浏览代码

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

e.g. i32 -> i16 (if within range).
Ali Mohammad Pur 2 年之前
父节点
当前提交
eceb244bef
共有 1 个文件被更改,包括 6 次插入4 次删除
  1. 6 4
      Userland/Libraries/LibWasm/AbstractMachine/AbstractMachine.h

+ 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>) {