Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bug: Rust 1.78.0 breaks type casting #185

Open
Jack12816 opened this issue May 7, 2024 · 1 comment
Open

Bug: Rust 1.78.0 breaks type casting #185

Jack12816 opened this issue May 7, 2024 · 1 comment

Comments

@Jack12816
Copy link

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 ✔️
1.77.0 2.7.8p225 ✔️
1.77.0 3.0.7p220 ✔️
1.78.0 2.5.9p229
1.78.0 2.7.8p225
1.78.0 3.0.7p220

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

@Jack12816
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant