Spracherkennung für: .rs vermutete Sprache: Unknown {[0] [0] [0]} [Methode: Schwerpunktbildung, einfache Gewichte, sechs Dimensionen]
// SPDX-License-Identifier: Apache-
2.
0 OR MIT
//! Rust standard library vendored code.
//!
//! The contents of this file come from the Rust standard library, hosted in
//! the <
https://github.com/rust-lang/rust> repository, licensed under
//! "Apache-
2.
0 OR MIT" and adapted for kernel use. For copyright details,
//! see <
https://github.com/rust-lang/rust/blob/master/COPYRIGHT>.
/// [`std::dbg`], but using [`pr_info`] instead of [`eprintln`].
///
/// Prints and returns the value of a given expression for quick and dirty
/// debugging.
///
/// An example:
///
/// ```rust
/// let a =
2;
/// # #[expect(clippy::disallowed_macros)]
/// let b = dbg!(a *
2) +
1;
/// // ^-- prints: [src/main.rs:
3:
9] a *
2 =
4
/// assert_eq!(b,
5);
/// ```
///
/// The macro works by using the `Debug` implementation of the type of
/// the given expression to print the value with [`printk`] along with the
/// source location of the macro invocation as well as the source code
/// of the expression.
///
/// Invoking the macro on an expression moves and takes ownership of it
/// before returning the evaluated expression unchanged. If the type
/// of the expression does not implement `Copy` and you don't want
/// to give up ownership, you can instead borrow with `dbg!(&expr)`
/// for some expression `expr`.
///
/// The `dbg!` macro works exactly the same in release builds.
/// This is useful when debugging issues that only occur in release
/// builds or when debugging in release mode is significantly faster.
///
/// Note that the macro is intended as a temporary debugging tool to be
/// used during development. Therefore, avoid committing `dbg!` macro
/// invocations into the kernel tree.
///
/// For debug output that is intended to be kept in the kernel tree,
/// use [`pr_debug`] and similar facilities instead.
///
/// # Stability
///
/// The exact output printed by this macro should not be relied upon
/// and is subject to future changes.
///
/// # Further examples
///
/// With a method call:
///
/// ```rust
/// # #[expect(clippy::disallowed_macros)]
/// fn foo(n: usize) {
/// if dbg!(n.checked_sub(
4)).is_some() {
/// // ...
/// }
/// }
///
/// foo(
3)
/// ```
///
/// This prints to the kernel log:
///
/// ```text,ignore
/// [src/main.rs:
3:
8] n.checked_sub(
4) = None
/// ```
///
/// Naive factorial implementation:
///
/// ```rust
/// # #![expect(clippy::disallowed_macros)]
/// fn factorial(n: u32) -> u32 {
/// if dbg!(n <=
1) {
/// dbg!(
1)
/// } else {
/// dbg!(n * factorial(n -
1))
/// }
/// }
///
/// dbg!(factorial(
4));
/// ```
///
/// This prints to the kernel log:
///
/// ```text,ignore
/// [src/main.rs:
3:
8] n <=
1 = false
/// [src/main.rs:
3:
8] n <=
1 = false
/// [src/main.rs:
3:
8] n <=
1 = false
/// [src/main.rs:
3:
8] n <=
1 = true
/// [src/main.rs:
4:
9]
1 =
1
/// [src/main.rs:
5:
9] n * factorial(n -
1) =
2
/// [src/main.rs:
5:
9] n * factorial(n -
1) =
6
/// [src/main.rs:
5:
9] n * factorial(n -
1) =
24
/// [src/main.rs:
11:
1] factorial(
4) =
24
/// ```
///
/// The `dbg!(..)` macro moves the input:
///
/// ```ignore
/// /// A wrapper around `usize` which importantly is not Copyable.
/// #[derive(Debug)]
/// struct NoCopy(usize);
///
/// let a = NoCopy(
42);
/// let _ = dbg!(a); // <-- `a` is moved here.
/// let _ = dbg!(a); // <-- `a` is moved again; error!
/// ```
///
/// You can also use `dbg!()` without a value to just print the
/// file and line whenever it's reached.
///
/// Finally, if you want to `dbg!(..)` multiple values, it will treat them as
/// a tuple (and return it, too):
///
/// ```
/// # #![expect(clippy::disallowed_macros)]
/// assert_eq!(dbg!(
1usize,
2u32), (
1,
2));
/// ```
///
/// However, a single argument with a trailing comma will still not be treated
/// as a tuple, following the convention of ignoring trailing commas in macro
/// invocations. You can use a
1-tuple directly if you need one:
///
/// ```
/// # #![expect(clippy::disallowed_macros)]
/// assert_eq!(
1, dbg!(
1u32,)); // trailing comma ignored
/// assert_eq!((
1,), dbg!((
1u32,))); //
1-tuple
/// ```
///
/// [`std::dbg`]:
https://doc.rust-lang.org/std/macro.dbg.html
/// [`eprintln`]:
https://doc.rust-lang.org/std/macro.eprintln.html
/// [`printk`]:
https://docs.kernel.org/core-api/printk-basics.html
/// [`pr_info`]: crate::pr_info!
/// [`pr_debug`]: crate::pr_debug!
#[macro_export]
macro_rules! dbg {
// NOTE: We cannot use `concat!` to make a static string as a format argument
// of `pr_info!` because `file!` could contain a `{` or
// `$val` expression could be a block (`{ .. }`), in which case the `pr_info!`
// will be malformed.
() => {
$crate::pr_info!("[{}:{}:{}]\n", ::core::file!(), ::core::line!(), ::core::column!(
))
};
($val:expr $(,)?) => {
// Use of `match` here is intentional because it affects the lifetimes
// of temporaries - <https://stackoverflow.com/a/48732525/1063961>
match $val {
tmp => {
$crate::pr_info!("[{}:{}:{}] {} = {:#?}\n",
::core::file!(), ::core::line!(), ::core::column!(),
::core::stringify!($val), &tmp);
tmp
}
}
};
($($val:expr),+ $(,)?) => {
($($crate::dbg!($val)),+,)
};
}