From 7b88857c5ac680528c9d59f7bd2ed0a1d00e8e6d Mon Sep 17 00:00:00 2001 From: Ali Mohammad Pur Date: Thu, 22 Jul 2021 13:25:57 +0430 Subject: [PATCH] LibWeb: Manually convert the js bigint to a wasm i64 value SignedBigInteger::export() generates sign-magnitude, but the native i64 type uses 2's comp, make this work by exporting it as unsigned and tweaking the sign later. --- .../Libraries/LibWeb/WebAssembly/WebAssemblyObject.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Userland/Libraries/LibWeb/WebAssembly/WebAssemblyObject.cpp b/Userland/Libraries/LibWeb/WebAssembly/WebAssemblyObject.cpp index 8398c8afab..d3be78d352 100644 --- a/Userland/Libraries/LibWeb/WebAssembly/WebAssemblyObject.cpp +++ b/Userland/Libraries/LibWeb/WebAssembly/WebAssemblyObject.cpp @@ -374,10 +374,11 @@ Optional to_webassembly_value(JS::Value value, const Wasm::ValueTyp if (vm.exception()) return {}; auto value = bigint->big_integer().divided_by(two_64).remainder; - VERIFY(value.trimmed_length() <= 2); - BigEndian integer { 0 }; - value.export_data({ &integer, 2 }); - return Wasm::Value { static_cast(integer) }; + VERIFY(value.unsigned_value().trimmed_length() <= 2); + i64 integer = static_cast(value.unsigned_value().to_u64()); + if (value.is_negative()) + integer = -integer; + return Wasm::Value { integer }; } case Wasm::ValueType::I32: { auto _i32 = value.to_i32(global_object);