mirror of
https://github.com/denoland/deno.git
synced 2024-12-25 08:39:09 -05:00
ca66978a5a
This PR introduces Wasm ops. These calls are optimized for entry from Wasm land. The `#[op(wasm)]` attribute is opt-in. Last parameter `Option<&mut [u8]>` is the memory slice of the Wasm module *when entered from a Fast API call*. Otherwise, the user is expected to implement logic to obtain the memory if `None` ```rust #[op(wasm)] pub fn op_args_get( offset: i32, buffer_offset: i32, memory: Option<&mut [u8]>, ) { // ... } ```
1.6 KiB
1.6 KiB
deno_ops
proc_macro
for generating highly optimized V8 functions from Deno ops.
// Declare an op.
#[op(fast)]
pub fn op_add(_: &mut OpState, a: i32, b: i32) -> i32 {
a + b
}
// Register with an extension.
Extension::builder()
.ops(vec![op_add::decl()])
.build();
Performance
The macro can optimize away code, short circuit fast paths and generate a Fast API impl.
Cases where code is optimized away:
-> ()
skips serde_v8 andrv.set
calls.-> Result<(), E>
skips serde_v8 andrv.set
calls forOk()
branch.-> ResourceId
or-> [int]
types will use specialized method likev8::ReturnValue::set_uint32
. A fast path for SMI.-> Result<ResourceId, E>
or-> Result<[int], E>
types will be optimized like above for theOk()
branch.
Fast calls
The macro will infer and try to auto generate V8 fast API call trait impl for
sync
ops with:
- arguments: integers, bool,
&mut OpState
,&[u8]
,&mut [u8]
,&[u32]
,&mut [u32]
- return_type: integers, bool
The #[op(fast)]
attribute should be used to enforce fast call generation at
compile time.
Trait gen for async
ops & a ZeroCopyBuf equivalent type is planned and will be
added soon.
Wasm calls
The #[op(wasm)]
attribute should be used for calls expected to be called from
Wasm. This enables the fast call generation and allows seamless WasmMemory
integration for generic and fast calls.
#[op(wasm)]
pub fn op_args_get(
offset: i32,
buffer_offset: i32,
memory: Option<&[u8]>, // Must be last parameter. Some(..) when entered from Wasm.
) {
// ...
}