There is no roadmap at the moment for the fast API to expand the return type values.
When I think about it, there is a fundamental problem with returns of type `Local<Value>`. A `Local<Value>` is allocated in a `HandleScope`. The `HandleScope` would be opened at the beginning of the C++ function, and closed in its epilogue. After the `HandleScope` is closed, all `Local<Value>`s are deallocated again and can therefore not be returned anymore. Within V8 the function would just return the `Value` instead, but for the embedder it is not possible to extract the `Value` from a `Local<Value>`. There exist workarounds for this problem, but these add overhead, and with that overhead, fast API calls may already not be faster anymore than fast API calls. Cheers, Andreas On Tue, Apr 29, 2025 at 3:32 PM 'James Snell' via v8-dev < v8-dev@googlegroups.com> wrote: > In workers we don't have a lot of use for Externals but we do extensively > use c++ API objects that are wrapped by JS objects (defined by Function > templates). Is there a roadmap for fast API to expand the return value > types? Could their potentially be a path for returning pointers to API > objects that are wrapped by their associated function templates rather than > External? > > - James M Snell > he/him > https://bsky.app/profile/jasnell.me > > On Tue, Apr 29, 2025, 06:21 Aapo Alasuutari <aapo.alasuut...@gmail.com> > wrote: > >> It becomes a v8::External which is an entirely immutable object with no >> properties and no prototype; from JS point of view it's a object that >> cannot be interacted with aside from doing equality comparisons. >> >> The engine side of course can use that object to track down the actual >> pointer value (which I believe is stored either in the object directly or >> in the External Pointer Table, depending on build flags). >> >> -Aapo >> >> On Tuesday, 29 April 2025 at 15:40:11 UTC+3 erik...@chromium.org wrote: >> >>> Since JS doesn't have 64 ints, what does the pointer turn into on the JS >>> side? >>> >>> On Tue, Apr 29, 2025 at 1:37 PM Aapo Alasuutari <aapo.al...@gmail.com> >>> wrote: >>> >>>> It's a highly useful feature for doing FFI in JavaScript. Deno's FFI >>>> API <https://docs.deno.com/runtime/fundamentals/ffi/> relies on it >>>> heavily, as it enables passing opaque pointers through JavaScript without >>>> resorting to weird zero-sized ArrayBuffer workarounds, which I believe is >>>> the go-to method for doing this in the Node Addon / N-API world. >>>> >>>> TypedArrays used to be fully supported in Fast API, at which time >>>> zero-sized ArrayBuffers could've been used at mostly equal performance as >>>> the External pointer objects, but there were some unfortunate bugs around >>>> that (like zero-sized AB/TAs always giving a null pointer in Fast API, or >>>> inline-created zero-size TAs giving a bogus pointer in Fast API; the first >>>> has been fixed, the second hasn't IIRC) and nowadays the TA support has >>>> been deprecated entirely. As a result, the only way to pass opaque pointers >>>> through Fast API without needing dedicated wrap and unwrap code on entry >>>> and exit from V8 is using the External pointers. >>>> >>>> Hope this answers your question. >>>> -Aapo >>>> On Monday, 28 April 2025 at 20:41:03 UTC+3 ya...@cloudflare.com wrote: >>>> >>>>> What's the use case of returning a pointer from a v8 fast api? >>>>> >>>>> On Monday, April 28, 2025 at 4:50:32 AM UTC-4 aapo.al...@gmail.com >>>>> wrote: >>>>> >>>>>> Don't forget about pointers! Those can be returned as well :) >>>>>> >>>>>> On Monday, 28 April 2025 at 09:48:28 UTC+3 ah...@google.com wrote: >>>>>> >>>>>>> Hi, >>>>>>> >>>>>>> I would say the V8 Fast API is still considered unstable. Since many >>>>>>> limitations were removed, not only the documentation but also the APIs >>>>>>> are >>>>>>> out-dated and would benefit from cleanup. However, since old APIs have >>>>>>> to >>>>>>> be deprecated before they can be changed, this takes some time. >>>>>>> >>>>>>> When it comes to arguments, there are some subtle limitations left, >>>>>>> see [1], but those are platform-specific. Mostly all limitations should >>>>>>> be >>>>>>> gone. I will go over the documentation and update it. When it comes to >>>>>>> return values, then indeed, as you noted, objects and strings cannot be >>>>>>> returned, only integers, floats, and void. >>>>>>> >>>>>>> The heuristics of CFunction overloads depends now only on the number >>>>>>> of arguments. If an API function is called in JavaScript with n >>>>>>> parameters, >>>>>>> then it will call the C++ function which expects n parameters. If no >>>>>>> such >>>>>>> C++ exists, then no fast call is happening. If the API has overloads or >>>>>>> optional parameters, then this has to be resolved by the C++ functions. >>>>>>> There should not be two CFunctions with the same number of arguments, >>>>>>> although I'm not sure if we are checking for that. >>>>>>> >>>>>>> Unfortunately, `FastOneByteString` is faster than what you can >>>>>>> achieve with a `v8::Local<v8::Value>` parameter, when you use >>>>>>> `FastOneByteString`, you should not trigger a GC. >>>>>>> >>>>>>> Cheers, Andreas >>>>>>> >>>>>>> [1] >>>>>>> https://source.chromium.org/chromium/chromium/src/+/main:v8/src/compiler/fast-api-calls.cc;l=65;drc=2bf826180ca85d007fb39024ff18322fa4635efb >>>>>>> >>>>>>> On Thu, Apr 24, 2025 at 10:17 PM 'Yagiz Nizipli' via v8-dev < >>>>>>> v8-...@googlegroups.com> wrote: >>>>>>> >>>>>>>> We are actively investigating/working on adding V8 Fast API support >>>>>>>> for Cloudflare Workers. While looking at the v8-fast-api-calls.h file >>>>>>>> (ref: >>>>>>>> https://github.com/v8/v8/blob/main/include/v8-fast-api-calls.h) , >>>>>>>> I realized that some of the documentation referencing the limitations >>>>>>>> are >>>>>>>> not correct and up to date. >>>>>>>> >>>>>>>> I'm more than happy to update the header file to reflect the >>>>>>>> current state of the implementation, but first, I'd like to ask >>>>>>>> couple of >>>>>>>> questions to understand the implementation better. >>>>>>>> >>>>>>>> - Is V8 Fast API considered unstable? >>>>>>>> - Since V8 fast api can now allocate, trigger JS and GC, which >>>>>>>> limitations still apply? Looking at line 24, I believe these comments >>>>>>>> are >>>>>>>> not valid. >>>>>>>> - What is the heuristics of CFunction overloads? In an example >>>>>>>> where a function has a required and an optional parameter, is it >>>>>>>> sufficient >>>>>>>> to add 2 functions, method(a) and method(a, b)? What is the behavior >>>>>>>> if >>>>>>>> the user calls this method with 3 arguments? Would it trigger >>>>>>>> method(a,b)? >>>>>>>> Is the order MemorySpan CFunctions make a difference? Since >>>>>>>> v8::Local<Value> is supported, it seems we can get away with a >>>>>>>> CFunction >>>>>>>> that has a second parameter of v8::Local<Value> for the optional >>>>>>>> parameter. >>>>>>>> - Since v8 fast api supports v8::Local<v8::Value> now, is there any >>>>>>>> particular reason for using FastOneByteString over v8 local value for >>>>>>>> one >>>>>>>> byte strings? >>>>>>>> - By looking at the documentation, the only limitations I could >>>>>>>> think of are the ones related to the return type of CFunction, which >>>>>>>> doesn't allow returning objects/values/strings. What are the actual >>>>>>>> limitations of V8 fast api? >>>>>>>> >>>>>>>> Thank you for your help. >>>>>>>> >>>>>>>> -- >>>>>>>> -- >>>>>>>> v8-dev mailing list >>>>>>>> v8-...@googlegroups.com >>>>>>>> http://groups.google.com/group/v8-dev >>>>>>>> --- >>>>>>>> You received this message because you are subscribed to the Google >>>>>>>> Groups "v8-dev" group. >>>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>>> send an email to v8-dev+un...@googlegroups.com. >>>>>>>> To view this discussion visit >>>>>>>> https://groups.google.com/d/msgid/v8-dev/08d9e03f-9db2-47c9-98ce-72c464c72475n%40googlegroups.com >>>>>>>> <https://groups.google.com/d/msgid/v8-dev/08d9e03f-9db2-47c9-98ce-72c464c72475n%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>>>>> . >>>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> >>>>>>> Andreas Haas >>>>>>> >>>>>>> Software Engineer >>>>>>> >>>>>>> ah...@google.com >>>>>>> >>>>>>> >>>>>>> Google Germany GmbH >>>>>>> >>>>>>> Erika-Mann-Straße 33 >>>>>>> <https://www.google.com/maps/search/Erika-Mann-Stra%C3%9Fe+33+80636+M%C3%BCnchen?entry=gmail&source=g> >>>>>>> >>>>>>> 80636 München >>>>>>> <https://www.google.com/maps/search/Erika-Mann-Stra%C3%9Fe+33+80636+M%C3%BCnchen?entry=gmail&source=g> >>>>>>> >>>>>>> >>>>>>> Geschäftsführer: Paul Manicle, Liana Sebastian >>>>>>> >>>>>>> Registergericht und -nummer: Hamburg, HRB 86891 >>>>>>> >>>>>>> Sitz der Gesellschaft: Hamburg >>>>>>> >>>>>>> >>>>>>> Diese E-Mail ist vertraulich. Falls Sie diese fälschlicherweise >>>>>>> erhalten haben sollten, leiten Sie diese bitte nicht an jemand anderes >>>>>>> weiter, löschen Sie alle Kopien und Anhänge davon und lassen Sie mich >>>>>>> bitte >>>>>>> wissen, dass die E-Mail an die falsche Person gesendet wurde. >>>>>>> >>>>>>> >>>>>>> >>>>>>> This e-mail is confidential. If you received this communication by >>>>>>> mistake, please don't forward it to anyone else, please erase all copies >>>>>>> and attachments, and please let me know that it has gone to the wrong >>>>>>> person. >>>>>>> >>>>>>> -- >>>> -- >>>> v8-dev mailing list >>>> v8-...@googlegroups.com >>>> http://groups.google.com/group/v8-dev >>>> --- >>>> You received this message because you are subscribed to the Google >>>> Groups "v8-dev" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to v8-dev+un...@googlegroups.com. >>>> >>> To view this discussion visit >>>> https://groups.google.com/d/msgid/v8-dev/b3efbcb3-8e74-4c39-b9cc-0f14f5ef667an%40googlegroups.com >>>> <https://groups.google.com/d/msgid/v8-dev/b3efbcb3-8e74-4c39-b9cc-0f14f5ef667an%40googlegroups.com?utm_medium=email&utm_source=footer> >>>> . >>>> >>> -- >> -- >> v8-dev mailing list >> v8-dev@googlegroups.com >> http://groups.google.com/group/v8-dev >> --- >> You received this message because you are subscribed to the Google Groups >> "v8-dev" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to v8-dev+unsubscr...@googlegroups.com. >> To view this discussion visit >> https://groups.google.com/d/msgid/v8-dev/ef86a176-b450-422b-9ecf-85daf1e635a1n%40googlegroups.com >> <https://groups.google.com/d/msgid/v8-dev/ef86a176-b450-422b-9ecf-85daf1e635a1n%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > -- > -- > v8-dev mailing list > v8-dev@googlegroups.com > http://groups.google.com/group/v8-dev > --- > You received this message because you are subscribed to the Google Groups > "v8-dev" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to v8-dev+unsubscr...@googlegroups.com. > To view this discussion visit > https://groups.google.com/d/msgid/v8-dev/CACFvHWmbaOi_MRbhsQKzKvc6nqO-Z0%3Daf49Jw02ov_W2A4ocvA%40mail.gmail.com > <https://groups.google.com/d/msgid/v8-dev/CACFvHWmbaOi_MRbhsQKzKvc6nqO-Z0%3Daf49Jw02ov_W2A4ocvA%40mail.gmail.com?utm_medium=email&utm_source=footer> > . > -- Andreas Haas Software Engineer ah...@google.com Google Germany GmbH Erika-Mann-Straße 33 80636 München Geschäftsführer: Paul Manicle, Liana Sebastian Registergericht und -nummer: Hamburg, HRB 86891 Sitz der Gesellschaft: Hamburg Diese E-Mail ist vertraulich. Falls Sie diese fälschlicherweise erhalten haben sollten, leiten Sie diese bitte nicht an jemand anderes weiter, löschen Sie alle Kopien und Anhänge davon und lassen Sie mich bitte wissen, dass die E-Mail an die falsche Person gesendet wurde. This e-mail is confidential. If you received this communication by mistake, please don't forward it to anyone else, please erase all copies and attachments, and please let me know that it has gone to the wrong person. -- -- v8-dev mailing list v8-dev@googlegroups.com http://groups.google.com/group/v8-dev --- You received this message because you are subscribed to the Google Groups "v8-dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to v8-dev+unsubscr...@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/v8-dev/CAELSTvdiQiyXwjbFAFiP5HYC0qdYvysPxUVePuWcMX8%2B0rC92Q%40mail.gmail.com.