Skip to content
This repository was archived by the owner on Dec 2, 2020. It is now read-only.

Commit 5b7ab69

Browse files
bors[bot]nickray
andauthored
Merge #42
42: Add equivalent of dbg! macro r=adamgreig a=nickray I think this would be quite useful. Thoughts? Maybe it would be better for `dbg!` to be in core with somehow switchable implementation (semihosting, vcom, etc.), but I don't know how to approach that. Added CHANGELOG also for the missing one for #39 Perhaps some more documentation is needed? Co-authored-by: Nicolas Stalder <[email protected]>
2 parents 25cb553 + 5c03ae0 commit 5b7ab69

File tree

3 files changed

+59
-0
lines changed

3 files changed

+59
-0
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ This project adheres to [Semantic Versioning](http://semver.org/).
55

66
## [Unreleased]
77

8+
- Adds a feature to work around JLink quirks
9+
- Adds a dbg! macro using heprintln
10+
811
## [v0.3.4] - 2019-04-22
912

1013
### Fixed

src/lib.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,36 @@
123123
//! ```
124124
//! Output and monitoring proceed as in the above example.
125125
//!
126+
//! ## The `dbg!` macro
127+
//!
128+
//! Analogous to [`std::dbg`](https://doc.rust-lang.org/std/macro.dbg.html) the macro
129+
//! `dbg!` returns a given expression and prints it using `heprintln!` including context
130+
//! for quick and dirty debugging.
131+
//!
132+
//! Example:
133+
//!
134+
//! ```
135+
//! const UUID: *mut u32 = 0x0009_FC70 as *mut u32;
136+
//! dbg!(UUID);
137+
//! let mut uuid: [u32; 4] = [0; 4];
138+
//! for i in 0..4 {
139+
//! dbg!(i);
140+
//! uuid[i] = unsafe { dbg!(UUID.offset(i as isize).read_volatile()) }; }
141+
//! }
142+
//! ```
143+
//! outputs
144+
//! ```
145+
//! [examples/semihosting.rs:37] UUID = 0x0009fc70
146+
//! [examples/semihosting.rs:40] i = 0
147+
//! [examples/semihosting.rs:41] UUID.offset(i as isize).read_volatile() = 3370045464
148+
//! [examples/semihosting.rs:40] i = 1
149+
//! [examples/semihosting.rs:41] UUID.offset(i as isize).read_volatile() = 1426218275
150+
//! [examples/semihosting.rs:40] i = 2
151+
//! [examples/semihosting.rs:41] UUID.offset(i as isize).read_volatile() = 2422621116
152+
//! [examples/semihosting.rs:40] i = 3
153+
//! [examples/semihosting.rs:41] UUID.offset(i as isize).read_volatile() = 1044138593
154+
//! ```
155+
//!
126156
//! # Optional features
127157
//!
128158
//! ## `inline-asm`

src/macros.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,29 @@ macro_rules! heprintln {
8585
$crate::export::hstderr_fmt(format_args!(concat!($s, "\n"), $($tt)*))
8686
};
8787
}
88+
89+
/// Macro that prints and returns the value of a given expression
90+
/// for quick and dirty debugging. Works exactly like `dbg!` in
91+
/// the standard library, replacing `eprintln` with `heprintln`.
92+
#[macro_export]
93+
macro_rules! dbg {
94+
() => {
95+
$crate::hprintln!("[{}:{}]", file!(), line!());
96+
};
97+
($val:expr) => {
98+
// Use of `match` here is intentional because it affects the lifetimes
99+
// of temporaries - https://stackoverflow.com/a/48732525/1063961
100+
match $val {
101+
tmp => {
102+
$crate::hprintln!("[{}:{}] {} = {:#?}",
103+
file!(), line!(), stringify!($val), &tmp);
104+
tmp
105+
}
106+
}
107+
};
108+
// Trailing comma with single argument is ignored
109+
($val:expr,) => { $crate::dbg!($val) };
110+
($($val:expr),+ $(,)?) => {
111+
($($crate::dbg!($val)),+,)
112+
};
113+
}

0 commit comments

Comments
 (0)