#![allow(non_snake_case)]
#![allow(clippy::missing_safety_doc)]
#![allow(clippy::not_unsafe_ptr_arg_deref)]
use core::ffi::{c_char, c_int, c_short, c_void};
use std::sync::atomic::{AtomicI32, AtomicI64, Ordering};
#[inline(never)]
pub fn force_link_product_native_symbols() {
let _ = force_link_product_native_symbols as *const () as usize;
let _ = WTF__parseES5Date as *const () as usize;
let _ = WTF__parseDouble as *const () as usize;
let _ = WTF__dtoa as *const () as usize;
let _ = URL__fromString as *const () as usize;
let _ = __bun_regex_compile as *const () as usize;
let _ = Bun__registerSignalsForForwarding as *const () as usize;
let _ = Bun__currentSyncPID.load(Ordering::Relaxed);
crate::linux_trace::force_link_linux_trace();
}
static PENDING_SIGNAL: AtomicI32 = AtomicI32::new(0);
#[unsafe(no_mangle)]
pub static Bun__currentSyncPID: AtomicI64 = AtomicI64::new(-1);
#[cfg(unix)]
extern "C" fn bun_forward_signal_handler(sig: c_int) {
let pid = Bun__currentSyncPID.load(Ordering::Relaxed);
if pid != 0 && pid != -1 {
unsafe {
libc::kill(pid as libc::pid_t, sig);
}
} else {
PENDING_SIGNAL.store(sig, Ordering::SeqCst);
}
}
#[unsafe(no_mangle)]
pub extern "C" fn Bun__registerSignalsForForwarding() {
#[cfg(unix)]
{
PENDING_SIGNAL.store(0, Ordering::SeqCst);
unsafe {
let mut sa: libc::sigaction = core::mem::zeroed();
sa.sa_sigaction = bun_forward_signal_handler as *const () as usize;
libc::sigemptyset(&mut sa.sa_mask);
sa.sa_flags = libc::SA_RESTART;
for sig in [libc::SIGINT, libc::SIGTERM, libc::SIGHUP, libc::SIGQUIT] {
libc::sigaction(sig, &sa, core::ptr::null_mut());
}
}
}
}
#[unsafe(no_mangle)]
pub extern "C" fn Bun__unregisterSignalsForForwarding() {
#[cfg(unix)]
{
unsafe {
let mut sa: libc::sigaction = core::mem::zeroed();
sa.sa_sigaction = libc::SIG_DFL;
libc::sigemptyset(&mut sa.sa_mask);
sa.sa_flags = 0;
for sig in [libc::SIGINT, libc::SIGTERM, libc::SIGHUP, libc::SIGQUIT] {
libc::sigaction(sig, &sa, core::ptr::null_mut());
}
}
PENDING_SIGNAL.store(0, Ordering::SeqCst);
}
}
#[unsafe(no_mangle)]
pub extern "C" fn Bun__sendPendingSignalIfNecessary() {
let sig = PENDING_SIGNAL.swap(0, Ordering::SeqCst);
if sig == 0 {
return;
}
let pid = Bun__currentSyncPID.load(Ordering::Relaxed);
if pid != 0 && pid != -1 {
#[cfg(unix)]
unsafe {
libc::kill(pid as libc::pid_t, sig);
}
}
}
#[unsafe(no_mangle)]
pub extern "C" fn WTF__parseES5Date(bytes: *const u8, length: usize) -> f64 {
if bytes.is_null() || length == 0 {
return f64::NAN;
}
let slice = unsafe { core::slice::from_raw_parts(bytes, length) };
bun_core::wtf::parse_es5_date_raw(slice)
}
#[unsafe(no_mangle)]
pub extern "C" fn WTF__parseDouble(bytes: *const u8, length: usize, counted: *mut usize) -> f64 {
if bytes.is_null() || length == 0 {
if !counted.is_null() {
unsafe {
*counted = 0;
}
}
return f64::NAN;
}
let slice = unsafe { core::slice::from_raw_parts(bytes, length) };
let mut count = 0usize;
let v = bun_core::fmt::parse_double_raw(slice, &mut count);
if !counted.is_null() {
unsafe {
*counted = count;
}
}
v
}
#[unsafe(no_mangle)]
pub extern "C" fn WTF__dtoa(buf: &mut [u8; 124], number: f64) -> usize {
bun_core::fmt::dtoa_into(buf, number)
}
use bun_core::String as BunString;
use bun_url::whatwg::URL as WhatwgUrl;
#[repr(C, align(8))]
#[derive(Clone, Copy)]
pub struct BunStringValue {
tag: u64,
_impl: [u64; 2],
}
fn as_bun_string(s: &BunStringValue) -> &BunString {
unsafe { &*(s as *const BunStringValue as *const BunString) }
}
fn as_bun_string_mut(s: &mut BunStringValue) -> &mut BunString {
unsafe { &mut *(s as *mut BunStringValue as *mut BunString) }
}
fn to_bun_string_value(s: BunString) -> BunStringValue {
unsafe { core::mem::transmute(s) }
}
fn dead_string_value() -> BunStringValue {
to_bun_string_value(BunString::dead())
}
#[unsafe(no_mangle)]
pub extern "C" fn URL__getHref(input: &mut BunStringValue) -> BunStringValue {
let s = as_bun_string(input);
to_bun_string_value(bun_url::href_from_string(s))
}
#[unsafe(no_mangle)]
pub extern "C" fn URL__getHrefJoin(
base: &mut BunStringValue,
relative: &mut BunStringValue,
) -> BunStringValue {
to_bun_string_value(bun_url::join(as_bun_string(base), as_bun_string(relative)))
}
#[unsafe(no_mangle)]
pub extern "C" fn URL__fromString(
str: &mut BunStringValue,
) -> Option<core::ptr::NonNull<WhatwgUrl>> {
WhatwgUrl::from_string(as_bun_string(str))
}
#[unsafe(no_mangle)]
pub extern "C" fn URL__pathname(url: &WhatwgUrl) -> BunStringValue {
to_bun_string_value(url.pathname())
}
#[unsafe(no_mangle)]
pub extern "C" fn URL__protocol(url: &WhatwgUrl) -> BunStringValue {
to_bun_string_value(url.protocol())
}
#[unsafe(no_mangle)]
pub extern "C" fn URL__hostname(url: &WhatwgUrl) -> BunStringValue {
to_bun_string_value(url.hostname())
}
#[unsafe(no_mangle)]
pub extern "C" fn URL__hash(url: &WhatwgUrl) -> BunStringValue {
to_bun_string_value(url.hash())
}
#[unsafe(no_mangle)]
pub extern "C" fn URL__host(url: &WhatwgUrl) -> BunStringValue {
to_bun_string_value(url.host())
}
#[unsafe(no_mangle)]
pub extern "C" fn URL__password(url: &WhatwgUrl) -> BunStringValue {
to_bun_string_value(url.password())
}
#[unsafe(no_mangle)]
pub extern "C" fn URL__username(url: &WhatwgUrl) -> BunStringValue {
to_bun_string_value(url.username())
}
#[unsafe(no_mangle)]
pub extern "C" fn URL__search(url: &WhatwgUrl) -> BunStringValue {
to_bun_string_value(url.search())
}
#[unsafe(no_mangle)]
pub extern "C" fn URL__fragmentIdentifier(url: &WhatwgUrl) -> BunStringValue {
to_bun_string_value(url.fragment_identifier())
}
#[unsafe(no_mangle)]
pub extern "C" fn URL__href(url: &WhatwgUrl) -> BunStringValue {
to_bun_string_value(url.href())
}
#[unsafe(no_mangle)]
pub extern "C" fn URL__getFileURLString(input: &mut BunStringValue) -> BunStringValue {
to_bun_string_value(bun_url::file_url_from_string(as_bun_string(input)))
}
#[unsafe(no_mangle)]
pub extern "C" fn URL__pathFromFileURL(input: &mut BunStringValue) -> BunStringValue {
to_bun_string_value(bun_url::path_from_file_url(as_bun_string(input)))
}
#[unsafe(no_mangle)]
pub extern "C" fn URL__port(url: &WhatwgUrl) -> u32 {
url.port()
}
#[unsafe(no_mangle)]
pub extern "C" fn URL__deinit(url: &mut WhatwgUrl) {
url.deinit();
}
#[unsafe(no_mangle)]
pub extern "C" fn URL__originLength(latin1_slice: *const u8, len: usize) -> u32 {
if latin1_slice.is_null() || len == 0 {
return 0;
}
let slice = unsafe { core::slice::from_raw_parts(latin1_slice, len) };
match bun_url::origin_from_slice(slice) {
Some(o) => o.len() as u32,
None => 0,
}
}
#[allow(dead_code)]
fn _touch_mut(s: &mut BunStringValue) {
let _ = as_bun_string_mut(s);
}
#[allow(dead_code)]
fn _touch_dead() {
let _ = dead_string_value();
}
#[unsafe(no_mangle)]
pub fn __bun_regex_compile(pattern: BunString) -> Option<core::ptr::NonNull<()>> {
let utf8 = pattern.to_utf8_without_ref();
let bytes = utf8.slice();
let pat = core::str::from_utf8(bytes).ok()?;
let re = regex::Regex::new(pat).ok()?;
let boxed = Box::new(re);
Some(unsafe { core::ptr::NonNull::new_unchecked(Box::into_raw(boxed) as *mut ()) })
}
#[unsafe(no_mangle)]
pub fn __bun_regex_matches(regex: core::ptr::NonNull<()>, input: &BunString) -> bool {
let re = unsafe { &*(regex.as_ptr() as *const regex::Regex) };
let utf8 = input.to_utf8_without_ref();
let Ok(s) = core::str::from_utf8(utf8.slice()) else {
return false;
};
re.is_match(s)
}
#[unsafe(no_mangle)]
pub fn __bun_regex_drop(regex: core::ptr::NonNull<()>) {
unsafe {
drop(Box::from_raw(regex.as_ptr() as *mut regex::Regex));
}
}