#![no_std]
#![cfg_attr(all(thread_local = "attribute"), feature(thread_local))]
#![cfg_attr(
any(backend = "itanium", backend = "seh", backend = "emscripten"),
expect(
internal_features,
reason = "Can't do anything about core::intrinsics::catch_unwind yet",
)
)]
#![cfg_attr(
any(backend = "itanium", backend = "seh", backend = "emscripten"),
feature(core_intrinsics, rustc_attrs)
)]
#![cfg_attr(backend = "seh", feature(fn_ptr_trait, std_internals))]
#![cfg_attr(
all(backend = "itanium", target_arch = "wasm32"),
feature(wasm_exception_handling_intrinsics)
)]
#![deny(unsafe_op_in_unsafe_fn)]
#![warn(
clippy::cargo,
clippy::pedantic,
clippy::alloc_instead_of_core,
clippy::allow_attributes_without_reason,
clippy::arithmetic_side_effects,
clippy::as_underscore,
clippy::assertions_on_result_states,
clippy::clone_on_ref_ptr,
clippy::decimal_literal_representation,
clippy::default_numeric_fallback,
clippy::deref_by_slicing,
clippy::else_if_without_else,
clippy::empty_drop,
clippy::empty_enum_variants_with_brackets,
clippy::empty_structs_with_brackets,
clippy::exhaustive_enums,
clippy::exhaustive_structs,
clippy::fn_to_numeric_cast_any,
clippy::format_push_string,
clippy::infinite_loop,
clippy::inline_asm_x86_att_syntax,
clippy::mem_forget, // use ManuallyDrop instead
clippy::missing_assert_message,
clippy::missing_const_for_fn,
clippy::missing_inline_in_public_items,
clippy::mixed_read_write_in_expression,
clippy::multiple_unsafe_ops_per_block,
clippy::mutex_atomic,
clippy::needless_raw_strings,
clippy::pub_without_shorthand,
clippy::rc_buffer,
clippy::rc_mutex,
clippy::redundant_type_annotations,
clippy::rest_pat_in_fully_bound_structs,
clippy::same_name_method,
clippy::self_named_module_files,
clippy::semicolon_inside_block,
clippy::separated_literal_suffix,
clippy::shadow_unrelated,
clippy::std_instead_of_alloc,
clippy::std_instead_of_core,
clippy::string_lit_chars_any,
clippy::string_to_string,
clippy::tests_outside_test_module,
clippy::try_err,
clippy::undocumented_unsafe_blocks,
clippy::unnecessary_safety_comment,
clippy::unnecessary_safety_doc,
clippy::unnecessary_self_imports,
clippy::unneeded_field_pattern,
clippy::unused_result_ok,
clippy::wildcard_enum_match_arm,
)]
#![allow(
clippy::inline_always,
reason = "I'm not an idiot, this is a result of benchmarking/profiling"
)]
#[cfg(panic = "abort")]
compile_error!("Using Lithium with panic = \"abort\" is unsupported");
#[cfg(any(abort = "std", backend = "panic", thread_local = "std", test))]
extern crate std;
extern crate alloc;
mod api;
mod backend;
#[cfg(any(backend = "itanium", backend = "emscripten", backend = "panic"))]
mod heterogeneous_stack;
#[cfg(any(backend = "itanium", backend = "emscripten", backend = "panic"))]
mod stacked_exceptions;
#[cfg(any(backend = "itanium", backend = "seh", backend = "emscripten"))]
mod intrinsic;
pub use api::{catch, intercept, throw, InFlightException};
#[cfg(any(backend = "itanium", backend = "seh", backend = "emscripten"))]
#[cold]
#[inline(never)]
fn abort(message: &str) -> ! {
#[cfg(abort = "std")]
{
use std::io::Write;
let _ = std::io::stderr().write_all(message.as_bytes());
std::process::abort();
}
#[cfg(not(abort = "std"))]
{
let _ = message;
core::intrinsics::abort();
}
}