1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-26 09:10:40 -05:00

feat(ops): infallible / result-free ops (#14585)

This commit is contained in:
Aaron O'Mullan 2022-05-12 19:13:25 +02:00 committed by GitHub
parent 5e6d3d42c7
commit c6063e390a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 35 additions and 18 deletions

View file

@ -43,26 +43,19 @@ pub(crate) fn init_builtins() -> Extension {
/// Return map of resources with id as key
/// and string representation as value.
#[op]
pub fn op_resources(
state: &mut OpState,
) -> Result<Vec<(ResourceId, String)>, Error> {
let serialized_resources = state
pub fn op_resources(state: &mut OpState) -> Vec<(ResourceId, String)> {
state
.resource_table
.names()
.map(|(rid, name)| (rid, name.to_string()))
.collect();
Ok(serialized_resources)
.collect()
}
#[op]
pub fn op_void_sync() -> Result<(), Error> {
Ok(())
}
pub fn op_void_sync() {}
#[op]
pub async fn op_void_async() -> Result<(), Error> {
Ok(())
}
pub async fn op_void_async() {}
/// Remove a resource from the resource table.
#[op]
@ -92,12 +85,10 @@ pub fn op_try_close(
}
#[op]
pub fn op_metrics(
state: &mut OpState,
) -> Result<(OpMetrics, Vec<OpMetrics>), Error> {
pub fn op_metrics(state: &mut OpState) -> (OpMetrics, Vec<OpMetrics>) {
let aggregate = state.tracker.aggregate();
let per_op = state.tracker.per_op();
Ok((aggregate, per_op))
(aggregate, per_op)
}
/// Builtin utility to print to stdout/stderr
@ -187,6 +178,6 @@ async fn op_shutdown(
}
#[op]
fn op_format_file_name(file_name: String) -> Result<String, Error> {
Ok(format_file_name(&file_name))
fn op_format_file_name(file_name: String) -> String {
format_file_name(&file_name)
}

View file

@ -154,6 +154,11 @@ fn codegen_v8_async(
let (arg_decls, args_tail) = codegen_args(core, f, rust_i0, 1);
let type_params = &f.sig.generics.params;
let result_wrapper = match is_result(&f.sig.output) {
true => quote! {},
false => quote! { let result = Ok(result); },
};
quote! {
use #core::futures::FutureExt;
// SAFETY: #core guarantees args.data() is a v8 External pointing to an OpCtx for the isolates lifetime
@ -189,6 +194,7 @@ fn codegen_v8_async(
#core::_ops::queue_async_op(scope, async move {
let result = Self::call::<#type_params>(#args_head #args_tail).await;
#result_wrapper
(promise_id, op_id, #core::_ops::to_op_result(get_class, result))
});
}
@ -325,7 +331,14 @@ fn codegen_sync_ret(
}
};
let result_wrapper = match is_result(&**ret_type) {
true => quote! {},
false => quote! { let result = Ok(result); },
};
quote! {
#result_wrapper
match result {
Ok(v) => {
#ok_block
@ -338,6 +351,19 @@ fn codegen_sync_ret(
}
}
fn is_result(ty: impl ToTokens) -> bool {
let tokens = tokens(ty);
if tokens.trim_start_matches("-> ").starts_with("Result <") {
return true;
}
// Detect `io::Result<...>`, `anyhow::Result<...>`, etc...
// i.e: Result aliases/shorthands which are unfortunately "opaque" at macro-time
match tokens.find(":: Result <") {
Some(idx) => !tokens.split_at(idx).0.contains('<'),
None => false,
}
}
/// Detects if a type is of the form Result<(), Err>
fn is_unit_result(ty: &syn::Type) -> bool {
let path = match ty {