artichoke/ferrocarril

RustBackedValue::try_into_ruby holds a borrow while executing downstream Rust code

Closed this issue · 1 comments

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

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.