Size: a a a

WebAssembly — русскоговорящее сообщество

2020 December 16

f

folex in WebAssembly — русскоговорящее сообщество
интересно, как оно тогда умудряется работать на хроме, но не работать под mocha... может правда вебпак что-то портит  🤔
источник

f

folex in WebAssembly — русскоговорящее сообщество
Sergey Rubanov
не будет работать в сафари
Блин, это неприятно конечно. Я проверил, wasm-pack --target browser генерирует точно такой же код. Спасибо, буду знать
источник

f

folex in WebAssembly — русскоговорящее сообщество
folex
интересно, как оно тогда умудряется работать на хроме, но не работать под mocha... может правда вебпак что-то портит  🤔
Может версии V8 разные? Хм. Как бы их проверить

Chrome V8 8.7.220.29
NodeJS 14 8.4.371.19-node.17
NodeJS 15 8.6.395.17-node.17
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
folex
Подскажите, а в nodejs нормально работает WebAssembly?

У нас интерпретатор языка скомпилирован в .wasm, и в браузере запускается замечательно, а при попытке запуска на тестах в nodejs вылезают всякие странные ошибки, и не получается записать значения в память васм рантайма.

Например есть совершенно безобидно выглядящая функция в расте

#[cfg(target_arch = "wasm32")]
#[link(wasm_import_module = "host")]
extern "C" {
   // Writes a byte string of size bytes that starts from ptr to a logger
   #[link_name = "log_utf8_string"]
   fn log_utf8_string_impl(level: i32, target: i64, msg_ptr: i32, msg_size: i32);
}


которая в WAT выглядит вот так

(type $t26 (func (param i32 i64 i32 i32)))
(import "host" "log_utf8_string" (func $host.log_utf8_string (type $t26)))


И когда она вызывается из wasm модуля, вылетает ошибка

TypeError: wasm function signature contains illegal type

Пока что не удалось выяснить, что эта ошибка означает, и как это происходит.
> TypeError: wasm function signature contains illegal type

Обновите ноду, Похоже ваша не поддержывает bigint параметры для wasm
источник

f

folex in WebAssembly — русскоговорящее сообщество
MaxGraey
> TypeError: wasm function signature contains illegal type

Обновите ноду, Похоже ваша не поддержывает bigint параметры для wasm
Спасибо, попробую! Не подскажете, 15я нода с 8.6 V8 может быть недостаточно свежа?
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
Берите самую последнюю
источник

SR

Sergey Rubanov in WebAssembly — русскоговорящее сообщество
v8 8.6 поддерживает бигинт<->и64
источник

f

folex in WebAssembly — русскоговорящее сообщество
Я тут наблюдаю как биндген посредством wasm-pack генерирует js код с глобальной переменной, и никак не могу понять, зачем она там глобальная. Может, вы подскажете мотивацию?

https://gist.github.com/folex/e5813b358d566f06cef16f6530a49d1a#file-browser_aquamarine_client_bg-js-L10
источник

AF

Alexey F. in WebAssembly — русскоговорящее сообщество
ну, там это чисто для удобства
источник

AF

Alexey F. in WebAssembly — русскоговорящее сообщество
накрутили, конечно
источник

f

folex in WebAssembly — русскоговорящее сообщество
Она используется в passStringToWasm0 вот так

function passStringToWasm0(arg, malloc, realloc) {
...
 const buf = cachedTextEncoder.encode(arg);
 WASM_VECTOR_LEN = buf.length;

...
}


то есть она стремится хранить в себе длину последней строки, записанной в wasm.memory

Это затем используется совершенно диким (с моей тз) образом

       var ptr0 = passStringToWasm0(init_peer_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
       var len0 = WASM_VECTOR_LEN;
       var ptr1 = passStringToWasm0(aqua, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
       var len1 = WASM_VECTOR_LEN;
       var ptr2 = passStringToWasm0(prev_data, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
       var len2 = WASM_VECTOR_LEN;
источник

f

folex in WebAssembly — русскоговорящее сообщество
это какая-то оптимизация?
источник

AF

Alexey F. in WebAssembly — русскоговорящее сообщество
хороший вопрос
источник

f

folex in WebAssembly — русскоговорящее сообщество
почему не возвращать длину записанной строки из passStringToWasm0?
источник

f

folex in WebAssembly — русскоговорящее сообщество
источник

f

folex in WebAssembly — русскоговорящее сообщество
Я спрашиваю с тем, что я бы у себя локально это поправил на более читаемый код, и может пуллреквест им сделал. Потому что у меня сейчас боль – WASM_VECTOR_LEN проходит чз экспорты TS, и кажется "раздваивается", возможно где-то передается не по ссылке, а по значению.
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
folex
почему не возвращать длину записанной строки из passStringToWasm0?
Потому что строки в Rust это кортежи вида [ptr, len]. А возвращать кортежи wasm пока не умеет. Вернее с недавних пор уже должен (multi-value proposal)
источник

f

folex in WebAssembly — русскоговорящее сообщество
MaxGraey
Потому что строки в Rust это кортежи вида [ptr, len]. А возвращать кортежи wasm пока не умеет. Вернее с недавних пор уже должен (multi-value proposal)
Но это plain js код, не wasm, не раст
источник

f

folex in WebAssembly — русскоговорящее сообщество
Возможно я не понял ваш ответ, тк не шарю, сори :)
источник

f

folex in WebAssembly — русскоговорящее сообщество
это JS код, который работает с wasm модулем чз WebAssembly.instantiate(...).exports
источник