diff options
author | snek <the@snek.dev> | 2024-06-10 09:20:44 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-10 16:20:44 +0000 |
commit | e3b2ee183bc7497ec0432bc764678f5eda6495a7 (patch) | |
tree | 7a5fa0208ef56cb83fa6bae9bad0bc89334ed533 /cli/napi/env.rs | |
parent | 7c5dbd5d54770dba5e56442b633e9597403ef5da (diff) |
fix: Rewrite Node-API (#24101)
Phase 1 node-api rewrite
Diffstat (limited to 'cli/napi/env.rs')
-rw-r--r-- | cli/napi/env.rs | 174 |
1 files changed, 0 insertions, 174 deletions
diff --git a/cli/napi/env.rs b/cli/napi/env.rs deleted file mode 100644 index 34948cde3..000000000 --- a/cli/napi/env.rs +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. - -use deno_runtime::deno_napi::*; -use std::os::raw::c_char; - -/// # Safety -/// -/// It's an N-API symbol -#[no_mangle] -pub unsafe extern "C" fn napi_fatal_error( - location: *const c_char, - location_len: isize, - message: *const c_char, - message_len: isize, -) -> ! { - let location = if location.is_null() { - None - } else { - Some(if location_len < 0 { - std::ffi::CStr::from_ptr(location).to_str().unwrap() - } else { - let slice = std::slice::from_raw_parts( - location as *const u8, - location_len as usize, - ); - std::str::from_utf8(slice).unwrap() - }) - }; - let message = if message_len < 0 { - std::ffi::CStr::from_ptr(message).to_str().unwrap() - } else { - let slice = - std::slice::from_raw_parts(message as *const u8, message_len as usize); - std::str::from_utf8(slice).unwrap() - }; - panic!( - "Fatal exception triggered by napi_fatal_error!\nLocation: {location:?}\n{message}" - ); -} - -// napi-3 - -#[napi_sym::napi_sym] -fn napi_fatal_exception(env: *mut Env, value: napi_value) -> napi_status { - let Some(env) = env.as_mut() else { - return napi_invalid_arg; - }; - let value = transmute::<napi_value, v8::Local<v8::Value>>(value); - let error = value.to_rust_string_lossy(&mut env.scope()); - panic!("Fatal exception triggered by napi_fatal_exception!\n{error}"); -} - -#[napi_sym::napi_sym] -fn napi_add_env_cleanup_hook( - env: *mut Env, - hook: extern "C" fn(*const c_void), - data: *const c_void, -) -> napi_status { - let Some(env) = env.as_mut() else { - return napi_invalid_arg; - }; - - { - let mut env_cleanup_hooks = env.cleanup_hooks.borrow_mut(); - if env_cleanup_hooks - .iter() - .any(|pair| pair.0 == hook && pair.1 == data) - { - panic!("Cleanup hook with this data already registered"); - } - env_cleanup_hooks.push((hook, data)); - } - napi_ok -} - -#[napi_sym::napi_sym] -fn napi_remove_env_cleanup_hook( - env: *mut Env, - hook: extern "C" fn(*const c_void), - data: *const c_void, -) -> napi_status { - let Some(env) = env.as_mut() else { - return napi_invalid_arg; - }; - - { - let mut env_cleanup_hooks = env.cleanup_hooks.borrow_mut(); - // Hooks are supposed to be removed in LIFO order - let maybe_index = env_cleanup_hooks - .iter() - .rposition(|&pair| pair.0 == hook && pair.1 == data); - - if let Some(index) = maybe_index { - env_cleanup_hooks.remove(index); - } else { - panic!("Cleanup hook with this data not found"); - } - } - - napi_ok -} - -#[napi_sym::napi_sym] -fn napi_open_callback_scope( - _env: *mut Env, - _resource_object: napi_value, - _context: napi_value, - _result: *mut napi_callback_scope, -) -> napi_status { - // we open scope automatically when it's needed - napi_ok -} - -#[napi_sym::napi_sym] -fn napi_close_callback_scope( - _env: *mut Env, - _scope: napi_callback_scope, -) -> napi_status { - // we close scope automatically when it's needed - napi_ok -} - -#[napi_sym::napi_sym] -fn node_api_get_module_file_name( - env: *mut Env, - result: *mut *const c_char, -) -> napi_status { - let Some(env) = env.as_mut() else { - return napi_invalid_arg; - }; - - let shared = env.shared(); - *result = shared.filename; - napi_ok -} - -#[napi_sym::napi_sym] -fn napi_module_register(module: *const NapiModule) -> napi_status { - MODULE_TO_REGISTER.with(|cell| { - let mut slot = cell.borrow_mut(); - let prev = slot.replace(module); - assert!(prev.is_none()); - }); - napi_ok -} - -#[napi_sym::napi_sym] -fn napi_get_uv_event_loop( - _env: *mut Env, - uv_loop: *mut *mut (), -) -> napi_status { - // There is no uv_loop in Deno - *uv_loop = std::ptr::null_mut(); - napi_ok -} - -const NODE_VERSION: napi_node_version = napi_node_version { - major: 18, - minor: 13, - patch: 0, - release: "Deno\0".as_ptr() as *const c_char, -}; - -#[napi_sym::napi_sym] -fn napi_get_node_version( - env: *mut Env, - result: *mut *const napi_node_version, -) -> napi_status { - crate::check_env!(env); - crate::check_arg!(env, result); - - *result = &NODE_VERSION as *const napi_node_version; - napi_ok -} |