rutie icon indicating copy to clipboard operation
rutie copied to clipboard

Bug: Rust 1.78.0 breaks type casting

Open Jack12816 opened this issue 1 year ago • 1 comments

Hey there,

I bisected an issue down to Rust 1.78.0 (works well with 1.77.0) with Rutie 0.8.4 and 0.9.0, on Ruby 2.5.9. No data type can be converted anymore, at least on method arguments. Here comes an example:

// Call via: pp EntityReference.new('test')

methods!(
    EntityReference,
    itself,
    fn new(args: RString) -> AnyObject {
        println!("{:?}", args);
        println!("{:?}", args.unwrap().ty());
        return ruby::nil();
    }
)

// Err(#<TypeError: Error converting to String>)
// thread '<unnamed>' panicked at src/ruby/entity_reference.rs:83:31:
// called `Result::unwrap()` on an `Err` value: #<TypeError: Error converting to String>
Stack trace
   0:     0x7ffbbf5b40d7 - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::hffecb437d922f988
   1:     0x7ffbbf57792c - core::fmt::write::hd9a8d7d029f9ea1a
   2:     0x7ffbbf5b9114 - std::sys_common::backtrace::print::he907f6ad7eee41cb
   3:     0x7ffbbf5b8e1b - std::panicking::default_hook::{{closure}}::h3926193b61c9ca9b
   4:     0x7ffbbf5b9810 - std::panicking::rust_panic_with_hook::h0ad14d90dcf5224f
   5:     0x7ffbbf5b9380 - std::panicking::begin_panic_handler::{{closure}}::h4a1838a06f542647
   6:     0x7ffbbf5b92d6 - std::sys_common::backtrace::__rust_end_short_backtrace::h77cc4dc3567ca904
   7:     0x7ffbbf5b92c3 - rust_begin_unwind
   8:     0x7ffbbf56e224 - core::panicking::panic_fmt::h940d4fd01a4b4fd1
   9:     0x7ffbbf56e5a2 - core::result::unwrap_failed::h5119205a73b72b0d
  10:     0x7ffbbf5728f0 - restless::ruby::entity_reference::new::hafb7461ff4177bf2
  11:     0x7ffbc040a199 - vm_call_cfunc_with_frame
                               at /usr/src/ruby/vm_insnhelper.c:1918:12
  12:     0x7ffbc040a199 - vm_call_cfunc
                               at /usr/src/ruby/vm_insnhelper.c:1934:12
  13:     0x7ffbc041be8c - vm_call_method_each_type
                               at /usr/src/ruby/vm_insnhelper.c:2232:9
  14:     0x7ffbc041c50b - vm_call_method_each_type
                               at /usr/src/ruby/vm_insnhelper.c:2380:16
  15:     0x7ffbc041c50b - vm_call_method
                               at /usr/src/ruby/vm_insnhelper.c:2384:14
  16:     0x7ffbc041c50b - vm_call_method
                               at /usr/src/ruby/vm_insnhelper.c:2351:1
  17:     0x7ffbc0414eee - vm_exec_core
                               at /usr/src/ruby/insns.def:915:5
  18:     0x7ffbc0419fdd - vm_exec
                               at /usr/src/ruby/vm.c:1778:11
  19:     0x7ffbc041abab - invoke_block
                               at /usr/src/ruby/vm.c:979:12
  20:     0x7ffbc041abab - invoke_iseq_block_from_c
                               at /usr/src/ruby/vm.c:1031:9
  21:     0x7ffbc041af11 - vm_yield_with_cref
                               at /usr/src/ruby/vm.c:1086:12
  22:     0x7ffbc041af11 - yield_under
                               at /usr/src/ruby/vm_eval.c:1587:12
  23:     0x7ffbc040a199 - vm_call_cfunc_with_frame
                               at /usr/src/ruby/vm_insnhelper.c:1918:12
  24:     0x7ffbc040a199 - vm_call_cfunc
                               at /usr/src/ruby/vm_insnhelper.c:1934:12
  25:     0x7ffbc041be8c - vm_call_method_each_type
                               at /usr/src/ruby/vm_insnhelper.c:2232:9
  26:     0x7ffbc041c50b - vm_call_method_each_type
                               at /usr/src/ruby/vm_insnhelper.c:2380:16
  27:     0x7ffbc041c50b - vm_call_method
                               at /usr/src/ruby/vm_insnhelper.c:2384:14
  28:     0x7ffbc041c50b - vm_call_method
                               at /usr/src/ruby/vm_insnhelper.c:2351:1
  29:     0x7ffbc0415963 - vm_exec_core
                               at /usr/src/ruby/insns.def:850:5
  30:     0x7ffbc0419fdd - vm_exec
                               at /usr/src/ruby/vm.c:1778:11
  31:     0x7ffbc04204c5 - invoke_block
                               at /usr/src/ruby/vm.c:979:12
  32:     0x7ffbc04204c5 - invoke_iseq_block_from_c
                               at /usr/src/ruby/vm.c:1031:9
  33:     0x7ffbc04204c5 - invoke_block_from_c_bh
                               at /usr/src/ruby/vm.c:1049:13
  34:     0x7ffbc04204c5 - vm_yield_force_blockarg
                               at /usr/src/ruby/vm.c:1110:12
  35:     0x7ffbc04204c5 - rb_yield_force_blockarg
                               at /usr/src/ruby/vm_eval.c:1035:12
  36:     0x7ffbc0240fac - rb_ary_collect
                               at /usr/src/ruby/array.c:2758:2
  37:     0x7ffbc040a199 - vm_call_cfunc_with_frame
                               at /usr/src/ruby/vm_insnhelper.c:1918:12
  38:     0x7ffbc040a199 - vm_call_cfunc
                               at /usr/src/ruby/vm_insnhelper.c:1934:12
  39:     0x7ffbc0415963 - vm_exec_core
                               at /usr/src/ruby/insns.def:850:5
  40:     0x7ffbc0419fdd - vm_exec
                               at /usr/src/ruby/vm.c:1778:11
  41:     0x7ffbc04204c5 - invoke_block
                               at /usr/src/ruby/vm.c:979:12
  42:     0x7ffbc04204c5 - invoke_iseq_block_from_c
                               at /usr/src/ruby/vm.c:1031:9
  43:     0x7ffbc04204c5 - invoke_block_from_c_bh
                               at /usr/src/ruby/vm.c:1049:13
  44:     0x7ffbc04204c5 - vm_yield_force_blockarg
                               at /usr/src/ruby/vm.c:1110:12
  45:     0x7ffbc04204c5 - rb_yield_force_blockarg
                               at /usr/src/ruby/vm_eval.c:1035:12
  46:     0x7ffbc0240fac - rb_ary_collect
                               at /usr/src/ruby/array.c:2758:2
  47:     0x7ffbc040a199 - vm_call_cfunc_with_frame
                               at /usr/src/ruby/vm_insnhelper.c:1918:12
  48:     0x7ffbc040a199 - vm_call_cfunc
                               at /usr/src/ruby/vm_insnhelper.c:1934:12
  49:     0x7ffbc0415963 - vm_exec_core
                               at /usr/src/ruby/insns.def:850:5
  50:     0x7ffbc0419fdd - vm_exec
                               at /usr/src/ruby/vm.c:1778:11
  51:     0x7ffbc04204c5 - invoke_block
                               at /usr/src/ruby/vm.c:979:12
  52:     0x7ffbc04204c5 - invoke_iseq_block_from_c
                               at /usr/src/ruby/vm.c:1031:9
  53:     0x7ffbc04204c5 - invoke_block_from_c_bh
                               at /usr/src/ruby/vm.c:1049:13
  54:     0x7ffbc04204c5 - vm_yield_force_blockarg
                               at /usr/src/ruby/vm.c:1110:12
  55:     0x7ffbc04204c5 - rb_yield_force_blockarg
                               at /usr/src/ruby/vm_eval.c:1035:12
  56:     0x7ffbc0240fac - rb_ary_collect
                               at /usr/src/ruby/array.c:2758:2
  57:     0x7ffbc040a199 - vm_call_cfunc_with_frame
                               at /usr/src/ruby/vm_insnhelper.c:1918:12
  58:     0x7ffbc040a199 - vm_call_cfunc
                               at /usr/src/ruby/vm_insnhelper.c:1934:12
  59:     0x7ffbc041be8c - vm_call_method_each_type
                               at /usr/src/ruby/vm_insnhelper.c:2232:9
  60:     0x7ffbc041c50b - vm_call_method_each_type
                               at /usr/src/ruby/vm_insnhelper.c:2380:16
  61:     0x7ffbc041c50b - vm_call_method
                               at /usr/src/ruby/vm_insnhelper.c:2384:14
  62:     0x7ffbc041c50b - vm_call_method
                               at /usr/src/ruby/vm_insnhelper.c:2351:1
  63:     0x7ffbc0415963 - vm_exec_core
                               at /usr/src/ruby/insns.def:850:5
  64:     0x7ffbc0419fdd - vm_exec
                               at /usr/src/ruby/vm.c:1778:11
  65:     0x7ffbc04204c5 - invoke_block
                               at /usr/src/ruby/vm.c:979:12
  66:     0x7ffbc04204c5 - invoke_iseq_block_from_c
                               at /usr/src/ruby/vm.c:1031:9
  67:     0x7ffbc04204c5 - invoke_block_from_c_bh
                               at /usr/src/ruby/vm.c:1049:13
  68:     0x7ffbc04204c5 - vm_yield_force_blockarg
                               at /usr/src/ruby/vm.c:1110:12
  69:     0x7ffbc04204c5 - rb_yield_force_blockarg
                               at /usr/src/ruby/vm_eval.c:1035:12
  70:     0x7ffbc0240fac - rb_ary_collect
                               at /usr/src/ruby/array.c:2758:2
  71:     0x7ffbc040a199 - vm_call_cfunc_with_frame
                               at /usr/src/ruby/vm_insnhelper.c:1918:12
  72:     0x7ffbc040a199 - vm_call_cfunc
                               at /usr/src/ruby/vm_insnhelper.c:1934:12
  73:     0x7ffbc041be8c - vm_call_method_each_type
                               at /usr/src/ruby/vm_insnhelper.c:2232:9
  74:     0x7ffbc041c50b - vm_call_method_each_type
                               at /usr/src/ruby/vm_insnhelper.c:2380:16
  75:     0x7ffbc041c50b - vm_call_method
                               at /usr/src/ruby/vm_insnhelper.c:2384:14
  76:     0x7ffbc041c50b - vm_call_method
                               at /usr/src/ruby/vm_insnhelper.c:2351:1
  77:     0x7ffbc0415963 - vm_exec_core
                               at /usr/src/ruby/insns.def:850:5
  78:     0x7ffbc0419fdd - vm_exec
                               at /usr/src/ruby/vm.c:1778:11
  79:     0x7ffbc02b7ed4 - ruby_exec_internal
                               at /usr/src/ruby/eval.c:247:2
  80:     0x7ffbc02b9d4d - ruby_exec_node
                               at /usr/src/ruby/eval.c:311:12
  81:     0x7ffbc02bc7be - ruby_run_node
                               at /usr/src/ruby/eval.c:303:12
  82:     0x6206de64b0eb - main
                               at /usr/src/ruby/./main.c:42:9
  83:     0x7ffbbfdfd09b - __libc_start_main
  84:     0x6206de64b11a - _start
  85:                0x0 - <unknown>
---

Using the AnyObject as input data type, I can call the method, but I'm unable to convert it to a RString. See:

// Call via: pp EntityReference.new('test')

methods!(
    EntityReference,
    itself,
    fn new(args: AnyObject) -> AnyObject {
        println!("{:?}", args);
        println!("{:?}", args.unwrap().try_convert_to::<RString>());
        return ruby::nil();
    }
)

// Ok(AnyObject { value: Value { value: 107874929200480 } })
// Err(#<TypeError: Error converting to String>)

I'm unsure why this happens, as this works well since quite long time. I tested it down to Rust 1.75.0 which works as expected. I've tested the following combinations:

Rust Ruby Works
1.77.0 2.5.9p229 :heavy_check_mark:
1.77.0 2.7.8p225 :heavy_check_mark:
1.77.0 3.0.7p220 :heavy_check_mark:
1.78.0 2.5.9p229 :x:
1.78.0 2.7.8p225 :x:
1.78.0 3.0.7p220 :x:

So it looks like it's at the Rust side of things. Does anybody have an idea?

Jack12816 avatar May 07 '24 10:05 Jack12816

What I found so far:

  • https://blog.rust-lang.org/2024/05/02/Rust-1.78.0.html
  • https://blog.rust-lang.org/2024/03/30/i128-layout-update.html (which mentions FFI)

Jack12816 avatar May 07 '24 11:05 Jack12816