Skip to content

Virtual methods must take Option<Gd<T>> instead of Gd<T> #494

@andreymal

Description

@andreymal

I'm trying to make an editor plugin:

use godot::engine::IEditorPlugin;
use godot::prelude::*;

#[derive(GodotClass)]
#[class(tool, editor_plugin, init, base=EditorPlugin)]
pub struct MyEditorPlugin {}

#[godot_api]
impl IEditorPlugin for MyEditorPlugin {
    fn handles(&self, _: Gd<Object>) -> bool {
        true
    }

    fn edit(&mut self, object: Gd<Object>) {}
}

For some reason object's type is non-optional Gd<Object>, but the documentation says:

object can be null if the plugin was editing an object, but there is no longer any selected object handled by this plugin. It can be used to cleanup editing state.

As a result, when no node is selected, Godot tries to call ._edit(null) and crashes.

Backtrace if needed
thread '<unnamed>' panicked at /home/andreymal/.cargo/git/checkouts/gdext-76630c89719e160c/13ab375/godot-core/src/builtin/meta/signature.rs:450:5:
edit: parameter [0] has type godot_core::obj::gd::Gd<godot_core::gen::classes::object::re_export::Object>, which is unable to store argument "TODO"
stack backtrace:
   0:     0x7fb90fde422c - std::backtrace_rs::backtrace::libunwind::trace::h67a838aed1f4d6ec
                               at /rustc/79e9716c980570bfd1f666e3b16ac583f0168962/library/std/src/../../backtrace/src/backtrace/libunwind.rs:93:5
   1:     0x7fb90fde422c - std::backtrace_rs::backtrace::trace_unsynchronized::h1d1786bb1962baf8
                               at /rustc/79e9716c980570bfd1f666e3b16ac583f0168962/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5
   2:     0x7fb90fde422c - std::sys_common::backtrace::_print_fmt::h5a0b1f807a002d23
                               at /rustc/79e9716c980570bfd1f666e3b16ac583f0168962/library/std/src/sys_common/backtrace.rs:67:5
   3:     0x7fb90fde422c - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::hf84ab6ad0b91784c
                               at /rustc/79e9716c980570bfd1f666e3b16ac583f0168962/library/std/src/sys_common/backtrace.rs:44:22
   4:     0x7fb90fe07fec - core::fmt::rt::Argument::fmt::h28f463bd1fdabed5
                               at /rustc/79e9716c980570bfd1f666e3b16ac583f0168962/library/core/src/fmt/rt.rs:138:9
   5:     0x7fb90fe07fec - core::fmt::write::ha37c23b175e921b3
                               at /rustc/79e9716c980570bfd1f666e3b16ac583f0168962/library/core/src/fmt/mod.rs:1114:21
   6:     0x7fb90fde1ebe - std::io::Write::write_fmt::haa1b000741bcbbe1
                               at /rustc/79e9716c980570bfd1f666e3b16ac583f0168962/library/std/src/io/mod.rs:1763:15
   7:     0x7fb90fde4014 - std::sys_common::backtrace::_print::h1ff1030b04dfb157
                               at /rustc/79e9716c980570bfd1f666e3b16ac583f0168962/library/std/src/sys_common/backtrace.rs:47:5
   8:     0x7fb90fde4014 - std::sys_common::backtrace::print::hb982056c6f29541c
                               at /rustc/79e9716c980570bfd1f666e3b16ac583f0168962/library/std/src/sys_common/backtrace.rs:34:9
   9:     0x7fb90fde5783 - std::panicking::default_hook::{{closure}}::h11f92f82c62fbd68
                               at /rustc/79e9716c980570bfd1f666e3b16ac583f0168962/library/std/src/panicking.rs:272:22
  10:     0x7fb90fde54a4 - std::panicking::default_hook::hb8810fe276772c66
                               at /rustc/79e9716c980570bfd1f666e3b16ac583f0168962/library/std/src/panicking.rs:292:9
  11:     0x7fb90fde5e81 - <alloc::boxed::Box<F,A> as core::ops::function::Fn<Args>>::call::h87b887549356728a
                               at /rustc/79e9716c980570bfd1f666e3b16ac583f0168962/library/alloc/src/boxed.rs:2021:9
  12:     0x7fb90fde5e81 - std::panicking::rust_panic_with_hook::hd2f0efd2fec86cb0
                               at /rustc/79e9716c980570bfd1f666e3b16ac583f0168962/library/std/src/panicking.rs:735:13
  13:     0x7fb90fde5c01 - std::panicking::begin_panic_handler::{{closure}}::h3651b7fc4f61d784
                               at /rustc/79e9716c980570bfd1f666e3b16ac583f0168962/library/std/src/panicking.rs:609:13
  14:     0x7fb90fde4756 - std::sys_common::backtrace::__rust_end_short_backtrace::hbc468e4b98c7ae04
                               at /rustc/79e9716c980570bfd1f666e3b16ac583f0168962/library/std/src/sys_common/backtrace.rs:170:18
  15:     0x7fb90fde5952 - rust_begin_unwind
                               at /rustc/79e9716c980570bfd1f666e3b16ac583f0168962/library/std/src/panicking.rs:597:5
  16:     0x7fb90fc0ed25 - core::panicking::panic_fmt::h979245e2fdb2fabd
                               at /rustc/79e9716c980570bfd1f666e3b16ac583f0168962/library/core/src/panicking.rs:72:14
  17:     0x7fb90fc370e0 - godot_core::builtin::meta::signature::param_error::h9e5e0410d0fe12c0
                               at /home/andreymal/.cargo/git/checkouts/gdext-76630c89719e160c/13ab375/godot-core/src/builtin/meta/signature.rs:450:5
  18:     0x7fb90fc37b46 - godot_core::builtin::meta::signature::ptrcall_arg::{{closure}}::h3a978076abd52718
                               at /home/andreymal/.cargo/git/checkouts/gdext-76630c89719e160c/13ab375/godot-core/src/builtin/meta/signature.rs:430:41
  19:     0x7fb90fc268dc - core::option::Option<T>::unwrap_or_else::h235c3edeffbe6d51
                               at /rustc/79e9716c980570bfd1f666e3b16ac583f0168962/library/core/src/option.rs:979:21
  20:     0x7fb90fc37afc - godot_core::builtin::meta::signature::ptrcall_arg::hda9ba436188e0501
                               at /home/andreymal/.cargo/git/checkouts/gdext-76630c89719e160c/13ab375/godot-core/src/builtin/meta/signature.rs:430:5
  21:     0x7fb90fc3d3fd - <(R,P0) as godot_core::builtin::meta::signature::PtrcallSignatureTuple>::in_ptrcall::hd190a75f79badd54
                               at /home/andreymal/.cargo/git/checkouts/gdext-76630c89719e160c/13ab375/godot-core/src/builtin/meta/signature.rs:272:30
  22:     0x7fb90fc3612d - <my_project::MyEditorPlugin as godot_core::obj::traits::cap::ImplementsGodotVirtual>::__virtual_call::function::hbdcacccc161356a7
                               at /home/andreymal/projects/my_project/src/lib.rs:67:1
  23:     0x55e9ee942dec - _ZN12EditorPlugin21_gdvirtual__edit_callILb0EEEbP6Object
                               at /usr/src/debug/godot/godot-4.1.3-stable/editor/editor_plugin.h:86:2
  24:     0x55e9ee942dec - _ZN12EditorPlugin4editEP6Object
                               at /usr/src/debug/godot/godot-4.1.3-stable/editor/editor_plugin.cpp:320:2
  25:     0x55e9ee8e6ac0 - _ZN10EditorNode19hide_unused_editorsEPK6Object
                               at /usr/src/debug/godot/godot-4.1.3-stable/editor/editor_node.cpp:2237:21
  26:     0x55e9eec441b8 - _ZN13SceneTreeDock18_selection_changedEv
                               at /usr/src/debug/godot/godot-4.1.3-stable/editor/scene_tree_dock.cpp:2271:13
  27:     0x55e9f1d4f25b - _ZN6Object12emit_signalpERK10StringNamePPK7Varianti
                               at /usr/src/debug/godot/godot-4.1.3-stable/core/object/object.cpp:1070:20
  28:     0x55e9ef67df96 - _ZN6Object11emit_signalIJEEE5ErrorRK10StringNameDpT_
                               at /usr/src/debug/godot/godot-4.1.3-stable/./core/object/object.h:884:22
  29:     0x55e9ef67df96 - _ZN15EditorSelection12_emit_changeEv
                               at /usr/src/debug/godot/godot-4.1.3-stable/editor/editor_data.cpp:1292:13
  30:     0x55e9ed92430d - _Z29call_with_variant_args_helperI17__UnexistingClassJEJEEvPT_MS1_FvDpT0_EPPK7VariantRN8Callable9CallErrorE13IndexSequenceIJXspT1_EEE
                               at /usr/src/debug/godot/godot-4.1.3-stable/./core/variant/binder_common.h:303:25
  31:     0x55e9ed92430d - _Z25call_with_variant_args_dvI17__UnexistingClassJEEvPT_MS1_FvDpT0_EPPK7VariantiRN8Callable9CallErrorERK6VectorIS7_E
                               at /usr/src/debug/godot/godot-4.1.3-stable/./core/variant/binder_common.h:450:31
  32:     0x55e9ed92430d - _ZNK11MethodBindTIJEE4callEP6ObjectPPK7VariantiRN8Callable9CallErrorE
                               at /usr/src/debug/godot/godot-4.1.3-stable/./core/object/method_bind.h:331:28
  33:     0x55e9f1d4527b - _ZN6Object5callpERK10StringNamePPK7VariantiRN8Callable9CallErrorE
                               at /usr/src/debug/godot/godot-4.1.3-stable/core/object/object.cpp:739:21
  34:     0x55e9f1a5db9f - _ZNK8Callable5callpEPPK7VariantiRS0_RNS_9CallErrorE
                               at /usr/src/debug/godot/godot-4.1.3-stable/core/variant/callable.cpp:62:30
  35:     0x55e9f1d3b930 - _ZN9CallQueue14_call_functionERK8CallablePK7Variantib
                               at /usr/src/debug/godot/godot-4.1.3-stable/core/object/message_queue.cpp:219:18
  36:     0x55e9f1d3f0f0 - _ZN9CallQueue5flushEv
                               at /usr/src/debug/godot/godot-4.1.3-stable/core/object/message_queue.cpp:320:20
  37:     0x55e9efb184fa - _ZN9SceneTree15physics_processEd
                               at /usr/src/debug/godot/godot-4.1.3-stable/scene/main/scene_tree.cpp:471:38
  38:     0x55e9ed7f6c08 - _ZN4Main9iterationEv
                               at /usr/src/debug/godot/godot-4.1.3-stable/main/main.cpp:3390:60
  39:     0x55e9ed780340 - _ZN11OS_LinuxBSD3runEv
                               at /usr/src/debug/godot/godot-4.1.3-stable/platform/linuxbsd/os_linuxbsd.cpp:912:22
  40:     0x55e9ed76fc98 - main
                               at /usr/src/debug/godot/godot-4.1.3-stable/platform/linuxbsd/godot_linuxbsd.cpp:74:9
  41:     0x7fb915358cd0 - <unknown>
  42:     0x7fb915358d8a - __libc_start_main
  43:     0x55e9ed77d255 - _start
  44:                0x0 - <unknown>
fatal runtime error: failed to initiate panic, error 5

I don't know if this is a Godot bug or godot-rust bug, but since I ran into this issue during playing with Rust, I'm leaving this issue here.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugc: registerRegister classes, functions and other symbols to GDScript

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions