2016-01-21 23:19:23 +00:00
|
|
|
[package]
|
|
|
|
authors = ["The Rust Project Developers"]
|
|
|
|
name = "core"
|
|
|
|
version = "0.0.0"
|
2021-02-20 18:18:01 +00:00
|
|
|
license = "MIT OR Apache-2.0"
|
|
|
|
repository = "https://github.com/rust-lang/rust.git"
|
|
|
|
description = "The Rust Core Library"
|
2018-05-10 18:02:19 +00:00
|
|
|
autotests = false
|
|
|
|
autobenches = false
|
2019-04-15 02:23:21 +00:00
|
|
|
edition = "2018"
|
2016-01-21 23:19:23 +00:00
|
|
|
|
|
|
|
[lib]
|
|
|
|
test = false
|
2016-11-25 21:13:59 +00:00
|
|
|
bench = false
|
2016-04-29 21:23:15 +00:00
|
|
|
|
|
|
|
[[test]]
|
2017-04-03 14:53:04 +00:00
|
|
|
name = "coretests"
|
2020-06-12 02:31:49 +00:00
|
|
|
path = "tests/lib.rs"
|
2016-11-25 21:13:59 +00:00
|
|
|
|
2017-02-03 23:04:22 +00:00
|
|
|
[[bench]]
|
2017-02-06 10:38:47 +00:00
|
|
|
name = "corebenches"
|
2020-06-12 02:31:49 +00:00
|
|
|
path = "benches/lib.rs"
|
2020-06-08 16:09:21 +00:00
|
|
|
test = true
|
2018-02-26 17:07:16 +00:00
|
|
|
|
|
|
|
[dev-dependencies]
|
2019-08-04 12:27:48 +00:00
|
|
|
rand = "0.7"
|
2018-11-29 21:06:10 +00:00
|
|
|
|
|
|
|
[features]
|
|
|
|
# Make panics and failed asserts immediately abort without formatting any message
|
|
|
|
panic_immediate_abort = []
|
Add `debug-refcell` feature to libcore
See https://rust-lang.zulipchat.com/#narrow/stream/131828-t-compiler/topic/Attaching.20backtraces.20to.20RefCell/near/226273614
for some background discussion
This PR adds a new off-by-default feature `debug-refcell` to libcore.
When enabled, this feature stores additional debugging information in
`RefCell`. This information is included in the panic message when
`borrow()` or `borrow_mut()` panics, to make it easier to track down the
source of the issue.
Currently, we store the caller location for the earliest active borrow.
This has a number of advantages:
* There is only a constant amount of overhead per `RefCell`
* We don't need any heap memory, so it can easily be implemented in core
* Since we are storing the *earliest* active borrow, we don't need any
extra logic in the `Drop` implementation for `Ref` and `RefMut`
Limitations:
* We only store the caller location, not a full `Backtrace`. Until
we get support for `Backtrace` in libcore, this is the best tha we can
do.
* The captured location is only displayed when `borrow()` or
`borrow_mut()` panics. If a crate calls `try_borrow().unwrap()`
or `try_borrow_mut().unwrap()`, this extra information will be lost.
To make testing easier, I've enabled the `debug-refcell` feature by
default. I'm not sure how to write a test for this feature - we would
need to rebuild core from the test framework, and create a separate
sysroot.
Since this feature will be off-by-default, users will need to use
`xargo` or `cargo -Z build-std` to enable this feature. For users using
a prebuilt standard library, this feature will be disabled with zero
overhead.
I've created a simple test program:
```rust
use std::cell::RefCell;
fn main() {
let _ = std::panic::catch_unwind(|| {
let val = RefCell::new(true);
let _first = val.borrow();
let _second = val.borrow();
let _third = val.borrow_mut();
});
let _ = std::panic::catch_unwind(|| {
let val = RefCell::new(true);
let first = val.borrow_mut();
drop(first);
let _second = val.borrow_mut();
let _thid = val.borrow();
});
}
```
which produces the following output:
```
thread 'main' panicked at 'already borrowed: BorrowMutError { location: Location { file: "refcell_test.rs", line: 6, col: 26 } }', refcell_test.rs:8:26
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
thread 'main' panicked at 'already mutably borrowed: BorrowError { location: Location { file: "refcell_test.rs", line: 16, col: 27 } }', refcell_test.rs:18:25
```
2021-02-18 02:30:39 +00:00
|
|
|
# Make `RefCell` store additional debugging information, which is printed out when
|
|
|
|
# a borrow error occurs
|
|
|
|
debug_refcell = []
|