danielpclark / rutie

“The Tie Between Ruby and Rust.”
MIT License
939 stars 62 forks source link

Bug: Rust 1.78.0 breaks type casting #185

Open Jack12816 opened 3 months ago

Jack12816 commented 3 months ago

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 - ::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 - ```

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 commented 3 months ago

What I found so far: