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.

Reply via email to