summaryrefslogtreecommitdiff
path: root/cli/napi/env.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/napi/env.rs')
-rw-r--r--cli/napi/env.rs141
1 files changed, 141 insertions, 0 deletions
diff --git a/cli/napi/env.rs b/cli/napi/env.rs
new file mode 100644
index 000000000..24dc8af81
--- /dev/null
+++ b/cli/napi/env.rs
@@ -0,0 +1,141 @@
+// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
+
+use deno_runtime::deno_napi::*;
+
+/// # 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: {:?}\n{}",
+ location, message
+ );
+}
+
+// napi-3
+
+#[napi_sym::napi_sym]
+fn napi_fatal_exception(env: *mut Env, value: napi_value) -> Result {
+ let env: &mut Env = env.as_mut().ok_or(Error::InvalidArg)?;
+ 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
+ );
+}
+
+// TODO: properly implement
+#[napi_sym::napi_sym]
+fn napi_add_env_cleanup_hook(
+ _env: *mut Env,
+ _hook: extern "C" fn(*const c_void),
+ _data: *const c_void,
+) -> Result {
+ eprintln!("napi_add_env_cleanup_hook is currently not supported");
+ 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,
+) -> Result {
+ eprintln!("napi_remove_env_cleanup_hook is currently not supported");
+ 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,
+) -> Result {
+ // we open scope automatically when it's needed
+ Ok(())
+}
+
+#[napi_sym::napi_sym]
+fn napi_close_callback_scope(
+ _env: *mut Env,
+ _scope: napi_callback_scope,
+) -> Result {
+ // we close scope automatically when it's needed
+ Ok(())
+}
+
+#[napi_sym::napi_sym]
+fn node_api_get_module_file_name(
+ env: *mut Env,
+ result: *mut *const c_char,
+) -> Result {
+ let env: &mut Env = env.as_mut().ok_or(Error::InvalidArg)?;
+
+ let shared = env.shared();
+ *result = shared.filename;
+ Ok(())
+}
+
+#[napi_sym::napi_sym]
+fn napi_module_register(module: *const NapiModule) -> Result {
+ MODULE.with(|cell| {
+ let mut slot = cell.borrow_mut();
+ slot.replace(module);
+ });
+ Ok(())
+}
+
+#[napi_sym::napi_sym]
+fn napi_get_uv_event_loop(_env: *mut Env, uv_loop: *mut *mut ()) -> Result {
+ // Don't error out because addons may pass this to
+ // our libuv _polyfills_.
+ *uv_loop = std::ptr::null_mut();
+ Ok(())
+}
+
+const NODE_VERSION: napi_node_version = napi_node_version {
+ major: 17,
+ minor: 4,
+ patch: 0,
+ release: "Deno\0".as_ptr() as *const i8,
+};
+
+#[napi_sym::napi_sym]
+fn napi_get_node_version(
+ env: *mut Env,
+ result: *mut *const napi_node_version,
+) -> Result {
+ let _: &mut Env = env.as_mut().ok_or(Error::InvalidArg)?;
+ crate::check_arg!(result);
+
+ *result = &NODE_VERSION as *const napi_node_version;
+ Ok(())
+}