refactor: create util folder, move nap_sym to napi/sym, move http_cache to cache folder (#16857)

This commit is contained in:
David Sherret 2022-11-28 17:28:54 -05:00 committed by GitHub
parent f526513d74
commit 2d4c46c975
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
57 changed files with 940 additions and 920 deletions

22
cli/napi/sym/Cargo.toml Normal file
View file

@ -0,0 +1,22 @@
# Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
[package]
name = "napi_sym"
version = "0.9.0"
authors.workspace = true
edition.workspace = true
license.workspace = true
readme = "README.md"
repository.workspace = true
description = "proc macro for writing N-API symbols"
[lib]
path = "./lib.rs"
proc-macro = true
[dependencies]
proc-macro2.workspace = true
quote.workspace = true
serde.workspace = true
serde_json.workspace = true
syn.workspace = true

34
cli/napi/sym/README.md Normal file
View file

@ -0,0 +1,34 @@
# napi_sym
A proc_macro for Deno's Node-API implementation. It does the following things:
- Marks the symbol as `#[no_mangle]` and rewrites it as `pub extern "C" $name`.
- Asserts that the function symbol is present in
[`symbol_exports.json`](./symbol_exports.json).
- Maps `deno_napi::Result` to raw `napi_result`.
```rust
use deno_napi::{napi_value, Env, Error, Result};
#[napi_sym::napi_sym]
fn napi_get_boolean(
env: *mut Env,
value: bool,
result: *mut napi_value,
) -> Result {
let _env: &mut Env = env.as_mut().ok_or(Error::InvalidArg)?;
// *result = ...
Ok(())
}
```
### `symbol_exports.json`
A file containing the symbols that need to be put into the executable's dynamic
symbol table at link-time.
This is done using `/DEF:` on Windows, `-exported_symbol,_` on macOS and
`--export-dynamic-symbol=` on Linux. See [`cli/build.rs`](../build.rs).
On Windows, you need to generate the `.def` file by running
[`tools/napi/generate_symbols_lists.js`](../../tools/napi/generate_symbols_lists.js).

46
cli/napi/sym/lib.rs Normal file
View file

@ -0,0 +1,46 @@
// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
use proc_macro::TokenStream;
use quote::quote;
use serde::Deserialize;
static NAPI_EXPORTS: &str = include_str!("./symbol_exports.json");
#[derive(Deserialize)]
struct SymbolExports {
pub symbols: Vec<String>,
}
#[proc_macro_attribute]
pub fn napi_sym(_attr: TokenStream, item: TokenStream) -> TokenStream {
let func = syn::parse::<syn::ItemFn>(item).expect("expected a function");
let exports: SymbolExports =
serde_json::from_str(NAPI_EXPORTS).expect("failed to parse exports");
let name = &func.sig.ident;
assert!(
exports.symbols.contains(&name.to_string()),
"tools/napi/sym/symbol_exports.json is out of sync!"
);
let block = &func.block;
let inputs = &func.sig.inputs;
let output = &func.sig.output;
let generics = &func.sig.generics;
let ret_ty = match output {
syn::ReturnType::Default => panic!("expected a return type"),
syn::ReturnType::Type(_, ty) => quote! { #ty },
};
TokenStream::from(quote! {
// SAFETY: it's an NAPI function.
#[no_mangle]
pub unsafe extern "C" fn #name #generics (#inputs) -> napi_status {
let mut inner = || -> #ret_ty {
#block
};
inner()
.map(|_| napi_ok)
.unwrap_or_else(|e| e.into())
}
})
}

View file

@ -0,0 +1,148 @@
{
"symbols": [
"node_api_create_syntax_error",
"napi_make_callback",
"napi_has_named_property",
"napi_async_destroy",
"napi_coerce_to_object",
"napi_get_arraybuffer_info",
"napi_detach_arraybuffer",
"napi_get_undefined",
"napi_reference_unref",
"napi_fatal_error",
"napi_open_callback_scope",
"napi_close_callback_scope",
"napi_get_value_uint32",
"napi_create_function",
"napi_create_arraybuffer",
"napi_get_value_int64",
"napi_get_all_property_names",
"napi_resolve_deferred",
"napi_is_detached_arraybuffer",
"napi_create_string_utf8",
"napi_create_threadsafe_function",
"node_api_throw_syntax_error",
"napi_create_bigint_int64",
"napi_wrap",
"napi_set_property",
"napi_get_value_bigint_int64",
"napi_open_handle_scope",
"napi_create_error",
"napi_create_buffer",
"napi_cancel_async_work",
"napi_is_exception_pending",
"napi_acquire_threadsafe_function",
"napi_create_external",
"napi_get_threadsafe_function_context",
"napi_get_null",
"napi_create_string_utf16",
"napi_get_value_bigint_uint64",
"napi_module_register",
"napi_is_typedarray",
"napi_create_external_buffer",
"napi_get_new_target",
"napi_get_instance_data",
"napi_close_handle_scope",
"napi_get_value_string_utf16",
"napi_get_property_names",
"napi_is_arraybuffer",
"napi_get_cb_info",
"napi_define_properties",
"napi_add_env_cleanup_hook",
"node_api_get_module_file_name",
"napi_get_node_version",
"napi_create_int64",
"napi_create_double",
"napi_get_and_clear_last_exception",
"napi_create_reference",
"napi_get_typedarray_info",
"napi_call_threadsafe_function",
"napi_get_last_error_info",
"napi_create_array_with_length",
"napi_coerce_to_number",
"napi_get_global",
"napi_is_error",
"napi_set_instance_data",
"napi_create_typedarray",
"napi_throw_type_error",
"napi_has_property",
"napi_get_value_external",
"napi_create_range_error",
"napi_typeof",
"napi_ref_threadsafe_function",
"napi_create_bigint_uint64",
"napi_get_prototype",
"napi_adjust_external_memory",
"napi_release_threadsafe_function",
"napi_delete_async_work",
"napi_create_string_latin1",
"napi_is_array",
"napi_unref_threadsafe_function",
"napi_throw_error",
"napi_has_own_property",
"napi_get_reference_value",
"napi_remove_env_cleanup_hook",
"napi_get_value_string_utf8",
"napi_is_promise",
"napi_get_boolean",
"napi_run_script",
"napi_get_element",
"napi_get_named_property",
"napi_get_buffer_info",
"napi_get_value_bool",
"napi_reference_ref",
"napi_create_object",
"napi_create_promise",
"napi_create_int32",
"napi_escape_handle",
"napi_open_escapable_handle_scope",
"napi_throw",
"napi_get_value_double",
"napi_set_named_property",
"napi_call_function",
"napi_create_date",
"napi_object_freeze",
"napi_get_uv_event_loop",
"napi_get_value_string_latin1",
"napi_reject_deferred",
"napi_add_finalizer",
"napi_create_array",
"napi_delete_reference",
"napi_get_date_value",
"napi_create_dataview",
"napi_get_version",
"napi_define_class",
"napi_is_date",
"napi_remove_wrap",
"napi_delete_property",
"napi_instanceof",
"napi_create_buffer_copy",
"napi_delete_element",
"napi_object_seal",
"napi_queue_async_work",
"napi_get_value_bigint_words",
"napi_is_buffer",
"napi_get_array_length",
"napi_get_property",
"napi_new_instance",
"napi_set_element",
"napi_create_bigint_words",
"napi_strict_equals",
"napi_is_dataview",
"napi_close_escapable_handle_scope",
"napi_get_dataview_info",
"napi_get_value_int32",
"napi_unwrap",
"napi_throw_range_error",
"napi_coerce_to_bool",
"napi_create_uint32",
"napi_has_element",
"napi_create_external_arraybuffer",
"napi_create_symbol",
"napi_coerce_to_string",
"napi_create_type_error",
"napi_fatal_exception",
"napi_create_async_work",
"napi_async_init"
]
}