RustBackedValue::try_into_ruby holds a borrow while executing downstream Rust code
Closed this issue · 1 comments
lopopolo commented
In MatchData#eql?:
.thread 'main' panicked at 'already borrowed: BorrowMutError', src/libcore/result.rs:999:5
stack backtrace:
0: backtrace::backtrace::libunwind::trace
at /Users/travis/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.29/src/backtrace/libunwind.rs:88
1: backtrace::backtrace::trace_unsynchronized
at /Users/travis/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.29/src/backtrace/mod.rs:66
2: std::sys_common::backtrace::_print
at src/libstd/sys_common/backtrace.rs:47
3: std::sys_common::backtrace::print
at src/libstd/sys_common/backtrace.rs:36
4: std::panicking::default_hook::{{closure}}
at src/libstd/panicking.rs:198
5: std::panicking::default_hook
at src/libstd/panicking.rs:212
6: std::panicking::rust_panic_with_hook
at src/libstd/panicking.rs:475
7: std::panicking::continue_panic_fmt
at src/libstd/panicking.rs:382
8: rust_begin_unwind
at src/libstd/panicking.rs:309
9: core::panicking::panic_fmt
at src/libcore/panicking.rs:85
10: core::result::unwrap_failed
at /rustc/d132f544f9d74e3cc047ef211e57eae60b78e5c5/src/libcore/macros.rs:18
11: core::result::Result<T,E>::expect
at /rustc/d132f544f9d74e3cc047ef211e57eae60b78e5c5/src/libcore/result.rs:827
12: core::cell::RefCell<T>::borrow_mut
at /rustc/d132f544f9d74e3cc047ef211e57eae60b78e5c5/src/libcore/cell.rs:871
13: mruby::value::ValueLike::funcall
at mruby/src/value/mod.rs:119
14: mruby::value::Value::itself
at mruby/src/value/mod.rs:362
15: mruby::extn::core::regexp::enc::parse
at mruby/src/extn/core/regexp/enc.rs:48
16: mruby::extn::core::regexp::initialize::Args::extract
at mruby/src/extn/core/regexp/initialize.rs:57
17: mruby::extn::core::regexp::Regexp::initialize
at mruby/src/extn/core/regexp/mod.rs:194
18: mrb_funcall_with_block
at /Users/lopopolo/dev/repos/ferrocarril/target/debug/build/mruby-sys-a21763ba2a043d0b/out/mruby-1685c45/src/vm.c:522
19: mrb_funcall_argv
at /Users/lopopolo/dev/repos/ferrocarril/target/debug/build/mruby-sys-a21763ba2a043d0b/out/mruby-1685c45/src/vm.c:539
20: mrb_obj_new
at /Users/lopopolo/dev/repos/ferrocarril/target/debug/build/mruby-sys-a21763ba2a043d0b/out/mruby-1685c45/src/class.c:1512
21: mruby::convert::object::RustBackedValue::try_into_ruby
at mruby/src/convert/object.rs:76
22: mruby::extn::core::matchdata::regexp::method
at mruby/src/extn/core/matchdata/regexp.rs:15
23: mruby::extn::core::matchdata::MatchData::regexp
at mruby/src/extn/core/matchdata/mod.rs:263
24: mrb_vm_exec
at /Users/lopopolo/dev/repos/ferrocarril/target/debug/build/mruby-sys-a21763ba2a043d0b/out/mruby-1685c45/src/vm.c:1441
25: mrb_vm_run
at /Users/lopopolo/dev/repos/ferrocarril/target/debug/build/mruby-sys-a21763ba2a043d0b/out/mruby-1685c45/src/vm.c:949
26: mrb_top_run
at /Users/lopopolo/dev/repos/ferrocarril/target/debug/build/mruby-sys-a21763ba2a043d0b/out/mruby-1685c45/src/vm.c:2844
27: mrb_load_exec
at /Users/lopopolo/dev/repos/ferrocarril/target/debug/build/mruby-sys-a21763ba2a043d0b/out/mruby-1685c45/mrbgems/mruby-compiler/core/parse.y:6321
28: mrb_load_nstring_cxt
at /Users/lopopolo/dev/repos/ferrocarril/target/debug/build/mruby-sys-a21763ba2a043d0b/out/mruby-1685c45/mrbgems/mruby-compiler/core/parse.y:6343
29: <alloc::rc::Rc<core::cell::RefCell<mruby::state::State>> as mruby::eval::MrbEval>::eval::run_protected
at mruby/src/eval.rs:115
30: mrb_protect
at /Users/lopopolo/dev/repos/ferrocarril/target/debug/build/mruby-sys-a21763ba2a043d0b/out/mruby-1685c45/mrbgems/mruby-error/src/exception.c:16
31: <alloc::rc::Rc<core::cell::RefCell<mruby::state::State>> as mruby::eval::MrbEval>::eval
at mruby/src/eval.rs:155
32: <alloc::rc::Rc<core::cell::RefCell<mruby::state::State>> as mruby::eval::MrbEval>::eval_with_context
at mruby/src/eval.rs:190
33: mruby::extn::core::kernel::Kernel::require_impl
at mruby/src/extn/core/kernel.rs:129
34: mruby::extn::core::kernel::Kernel::require
at mruby/src/extn/core/kernel.rs:166
35: mrb_vm_exec
at /Users/lopopolo/dev/repos/ferrocarril/target/debug/build/mruby-sys-a21763ba2a043d0b/out/mruby-1685c45/src/vm.c:1441
36: mrb_vm_run
at /Users/lopopolo/dev/repos/ferrocarril/target/debug/build/mruby-sys-a21763ba2a043d0b/out/mruby-1685c45/src/vm.c:949
37: mrb_run
at /Users/lopopolo/dev/repos/ferrocarril/target/debug/build/mruby-sys-a21763ba2a043d0b/out/mruby-1685c45/src/vm.c:2823
38: mrb_funcall_with_block
at /Users/lopopolo/dev/repos/ferrocarril/target/debug/build/mruby-sys-a21763ba2a043d0b/out/mruby-1685c45/src/vm.c:529
39: mrb_funcall_argv
at /Users/lopopolo/dev/repos/ferrocarril/target/debug/build/mruby-sys-a21763ba2a043d0b/out/mruby-1685c45/src/vm.c:539
40: mruby::value::ValueLike::funcall::run_protected
at mruby/src/value/mod.rs:76
41: mrb_protect
at /Users/lopopolo/dev/repos/ferrocarril/target/debug/build/mruby-sys-a21763ba2a043d0b/out/mruby-1685c45/mrbgems/mruby-error/src/exception.c:16
42: mruby::value::ValueLike::funcall
at /Users/lopopolo/dev/repos/ferrocarril/mruby/src/value/mod.rs:126
43: spec_runner::mspec::Runner::run
at spec-runner/src/mspec.rs:58
44: spec_runner::main
at spec-runner/src/main.rs:37
45: std::rt::lang_start::{{closure}}
at /rustc/d132f544f9d74e3cc047ef211e57eae60b78e5c5/src/libstd/rt.rs:64
46: std::rt::lang_start_internal::{{closure}}
at src/libstd/rt.rs:49
47: std::panicking::try::do_call
at src/libstd/panicking.rs:294
48: __rust_maybe_catch_panic
at src/libpanic_unwind/lib.rs:85
49: std::panicking::try
at src/libstd/panicking.rs:273
50: std::panic::catch_unwind
at src/libstd/panic.rs:388
51: std::rt::lang_start_internal
at src/libstd/rt.rs:48
52: std::rt::lang_start
at /rustc/d132f544f9d74e3cc047ef211e57eae60b78e5c5/src/libstd/rt.rs:64
53: spec_runner::main
Illegal instruction: 4
lopopolo commented
Taking out a mutable borrow in Rust code triggered by mrb_obj_new
causes a panic because of the call to interp.borrow().mrb
in the call site for mrb_obj_new
.
To fix this, extract the mrb from the interp earlier in the function.