Thanks Jakob! Looks like we'll have to implement our own utf8 strings sooner than we planned, as we need a way to access the resulting value of the stringref.
I appreciate the detailed response! Cheers, Alex On Wed, Oct 2, 2024 at 5:33 AM Jakob Kummerow <jkumme...@chromium.org> wrote: > On Wed, Oct 2, 2024 at 5:49 AM Alex Dovzhanyn <dovzhanyn.a...@gmail.com> > wrote: > >> Hello! Following up on this because I am experiencing some unusual >> behavior when trying to actually use stringrefs after enabling them. So >> I've enabled stringref by calling >> v8::V8::SetFlagsFromString("--experimental-wasm-stringref"), which seems to >> do the trick because now I'm able to compile and run modules that have a >> stringref table in them. My issue arises when I try to actually use a >> stringref to do anything. > > > It's not so much doing "anything" that's the issue, but rather > specifically using stringref in the signature of an exported or imported > function. That's not implemented, and as such is right to fail. > > V8 implements > <https://source.chromium.org/chromium/chromium/src/+/main:v8/third_party/wasm-api/README.v8> > the upstream wasm-c-api as of revision > 6db391ee7121a0695602945d11001ea3e00b0afb > <https://github.com/WebAssembly/wasm-c-api/tree/6db391ee7121a0695602945d11001ea3e00b0afb>, > dated 2019. That was before newer proposals such as stringref, WasmGC, > SIMD, exnref, so the API doesn't know anything about the types introduced > by these proposals. As long as those types only show up *inside* the Wasm > module, that shouldn't matter, but you won't be able to use them at the > boundary (exported and imported functions, Globals, Tables). I'm aware that > this is a severe limitation. > > If you wanted to make progress on this front, the first step would be to > update the wasm-c-api to support the newer proposals. Some of them are > likely straightforward, some might require some nontrivial design work, I'm > not sure. I'm also not sure whether an attempt to add support for stringref > in particular might encounter resistance, given the state of that proposal. > The second step would then be to update V8's (and, ideally, other > engines') implementation to reflect this updated API. > FWIW, I'm not aware of anyone currently working or planning to work on > either of these steps. > > In the meantime, the following should work: > > (func $main0 (export "main0") (result i32) > (string.measure_utf8 (string.const "Hello, world!")) > ) > > >> Even a simple hello world function seems to be throwing with an >> unreachable error. >> >> For example, the following WASM module: >> >> (module >> (type $0 (func (result stringref))) >> (memory $0 1 10) >> (table $ThetaStringRefs 1000 100000000 stringref) >> (export "memory" (memory $0)) >> (export "main0" (func $main0)) >> (func $main0 (result stringref) >> (string.const "Hello, world!") >> ) >> ) >> >> errors out with the following stacktrace: >> >> ==== C stack trace =============================== >> >> 0 CodegenTest 0x000000010491e643 >> v8::base::debug::StackTrace::StackTrace() + 19 >> 1 CodegenTest 0x00000001049250cb >> v8::platform::(anonymous namespace)::PrintStackTrace() + 27 >> 2 CodegenTest 0x0000000104910e1d >> V8_Fatal(char const*, ...) + 365 >> 3 CodegenTest 0x00000001048fd726 >> wasm::(anonymous >> namespace)::FunctionSigToFuncType(v8::internal::Signature<v8::internal::wasm::ValueType> >> const*) + 838 >> 4 CodegenTest 0x00000001048fae9e >> wasm::(anonymous >> namespace)::GetImportExportType(v8::internal::wasm::WasmModule const*, >> v8::internal::wasm::ImportExportKindCode, unsigned int) + 62 >> 5 CodegenTest 0x00000001048fb39f >> wasm::ExportsImpl(v8::internal::Handle<v8::internal::WasmModuleObject>) + >> 527 >> 6 CodegenTest 0x00000001048fb4ed >> wasm::Module::exports() const + 61 >> 7 CodegenTest 0x00000001047077e1 >> Theta::Runtime::execute(std::__1::vector<char, std::__1::allocator<char> >, >> std::__1::basic_string<char, std::__1::char_traits<char>, >> std::__1::allocator<char> >) + 593 >> 8 CodegenTest 0x000000010470656b >> CodeGenTest::setup(std::__1::basic_string<char, >> std::__1::char_traits<char>, std::__1::allocator<char> >, >> std::__1::basic_string<char, std::__1::char_traits<char>, >> std::__1::allocator<char> >) + 1531 >> 9 CodegenTest 0x00000001046ff5d6 (anonymous >> namespace)::CATCH2_INTERNAL_TEST_0::test() + 7574 >> 10 CodegenTest 0x000000010474b4de >> Catch::TestInvokerAsMethod<(anonymous >> namespace)::CATCH2_INTERNAL_TEST_0>::invoke() const + 158 >> 11 CodegenTest 0x0000000104827009 >> Catch::TestCaseHandle::invoke() const + 25 >> 12 CodegenTest 0x0000000104826e41 >> Catch::RunContext::invokeActiveTestCase() + 49 >> 13 CodegenTest 0x0000000104824c79 >> Catch::RunContext::runCurrentTest(std::__1::basic_string<char, >> std::__1::char_traits<char>, std::__1::allocator<char> >&, >> std::__1::basic_string<char, std::__1::char_traits<char>, >> std::__1::allocator<char> >&) + 1129 >> 14 CodegenTest 0x0000000104823f88 >> Catch::RunContext::runTest(Catch::TestCaseHandle const&) + 632 >> 15 CodegenTest 0x000000010480f025 >> Catch::(anonymous namespace)::TestGroup::execute() + 181 >> 16 CodegenTest 0x000000010480e106 >> Catch::Session::runInternal() + 1062 >> 17 CodegenTest 0x000000010480dc77 >> Catch::Session::run() + 87 >> 18 CodegenTest 0x00000001048203ca int >> Catch::Session::run<char>(int, char const* const*) + 90 >> 19 CodegenTest 0x000000010482030f main + 63 >> 20 dyld 0x0000000207ffe52e start + 462 >> 21 dyld 0x0000000207ff9000 dyld + 0 >> Trace/BPT trap: 5 >> >> >> It seems that v8 is having some issue with creating the exports for this >> function that has a stringref as its return type. >> >> Any pointers would be greatly appreciated. >> >> Cheers, >> Alex >> On Friday, September 27, 2024 at 12:12:58 PM UTC-4 Alex Dovzhanyn wrote: >> >>> Hi Jakob, >>> >>> Thanks so much for your highly detailed response! I am building from >>> source so I should be able to change the feature flags, but I'll try >>> setting the v8 flag you mentioned first since that seems to be the less >>> intrusive option. >>> >>> Thanks for the warning about the stringref proposal! I do understand >>> that it has stagnated as of late and does not look like it will be accepted >>> in its current state. The project that I'm working on is a novelty >>> programming language that compiles to WebAssembly, and the current >>> implementation of strings in the language relies on the stringref proposal >>> for simplicity' sake -- though the plan is to move to a bespoke utf8 >>> implementation once garbage collection is implemented. It would definitely >>> be nice if WebAssembly, as a compilation target, had native support for a >>> string type that doesn't rely on JS string builtins for cases such as this >>> one, where the wasm is not intended to only be run in the browser. But >>> until we reach some sort of consensus on that it looks like we'll just have >>> to roll our own. >>> >>> Thanks again for your help! >>> >>> Cheers, >>> Alex >>> >>> On Friday, September 27, 2024 at 5:56:39 AM UTC-4 Jakob Kummerow wrote: >>> >>>> Generally speaking, libwee8 supports whatever V8 supports. >>>> That said, the state of the stringref implementation in V8 is that >>>> (like all early-stage proposals) it's behind an off-by-default flag: >>>> --experimental-wasm-stringref, and libwee8 doesn't have a way to >>>> enable such flags at runtime. >>>> If you build your own libwee8, you can hack it by moving the >>>> "stringref" entry in src/wasm/wasm-feature-flags.h from the STAGING >>>> list to the SHIPPED list below it. >>>> If you don't want to or can't modify libwee8's sources but you do know >>>> that you're always linking against libwee8 (and not some other engine's >>>> implementation of the Wasm C API), then I think you can use the regular V8 >>>> API to call v8::V8::SetFlagsFromString("--experimental-wasm-stringref") >>>> early >>>> in your startup sequence (before calling the Wasm C API's >>>> Engine::make()). >>>> >>>> All of that is admittedly far from perfect. >>>> >>>> Please also keep in mind that the stringref proposal is currently not >>>> on track towards finding community consensus. While we (V8) have no plans >>>> to delete our implementation of it, we also cannot make any promises that >>>> we will continue to keep it indefinitely if the proposal doesn't advance. >>>> At the very least, if/when the proposal does pick up steam again, there >>>> will likely be some changes to the behavior of certain features, and when >>>> picking those up we will quite likely not worry about backwards >>>> compatibility with earlier versions of the proposal. In summary: while I >>>> understand that strings are very useful and the stringref proposal would be >>>> great to have (especially in non-browser scenarios where the alternative >>>> "JS String Builtins" proposal, which the community currently favors, is >>>> unavailable), I feel compelled to caution you that basing any larger >>>> project on an assumption that stringref will be available is a highly risky >>>> decision at this time. On the other hand, if you manage to present a >>>> sufficiently compelling use case, you might just be able to influence the >>>> community's stance... >>>> >>>> >>>> On Fri, Sep 27, 2024 at 2:05 AM Alex Dovzhanyn <dovzhan...@gmail.com> >>>> wrote: >>>> >>>>> Hello all, I am wondering if there is support for WASM stringrefs in >>>>> libwee8? And if so, it that behind a flag during the build? I am noticing >>>>> that I'm able to call: >>>>> >>>>> auto wasmModule = wasm::Module::make(store.get(), binary); >>>>> >>>>> with no issues when I'm not using stringrefs, but as soon as I add a >>>>> (table $stringrefs 100 stringref) >>>>> >>>>> into the module, the wasm::Module::make seems to fail. >>>>> >>>>> Any pointers would be greatly appreciated! Thanks in advance. >>>>> >>>>> Best, >>>>> Alex >>>>> >>>>> -- >>>> >>>> -- > -- > v8-users mailing list > v8-users@googlegroups.com > http://groups.google.com/group/v8-users > --- > You received this message because you are subscribed to a topic in the > Google Groups "v8-users" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/v8-users/WPFivlQ7Oao/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > v8-users+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/v8-users/CAKSzg3TP9_6dWLD-NzORLh7P%2B43vLzOd97X_iRavMRNDpkA%2BNQ%40mail.gmail.com > <https://groups.google.com/d/msgid/v8-users/CAKSzg3TP9_6dWLD-NzORLh7P%2B43vLzOd97X_iRavMRNDpkA%2BNQ%40mail.gmail.com?utm_medium=email&utm_source=footer> > . > -- -- v8-users mailing list v8-users@googlegroups.com http://groups.google.com/group/v8-users --- You received this message because you are subscribed to the Google Groups "v8-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to v8-users+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/v8-users/CAPAcDL-w-p9v-39fCU0bsLK6NHkJ%2BpSRqrRtqyvR-T_%2Bn7QcGw%40mail.gmail.com.