Skip to content

Implicit binds in virtual calls cause borrow errors #338

Closed
@lilizoey

Description

@lilizoey

Edit bromeon -- title was "Cannot add_child in a &mut self function if Self overrides on_notification"

#[derive(GodotClass)]
#[class(init, base = Node)]
pub struct Bar {
    #[base]
    base: Base<Node>,
}

#[godot_api]
impl NodeVirtual for Bar {
    fn ready(&mut self) {
        if Engine::singleton().is_editor_hint() {
            return;
        }

        let foo = Node::new_alloc();
        self.add_child(foo.share().upcast());
    }

    fn on_notification(&mut self, what: NodeNotification) {}
}

add_child will trigger a notification (https://docs.godotengine.org/en/stable/classes/class_node.html#class-node-constant-notification-child-order-changed), and that will in turn trigger a call to on_notification, which will try to get a mutable borrow of self. This causes a crash.

It seems like this is a big issue tbh because it basically makes self.add_child almost unusable whenever on_notification is overridden.

I'm not sure what a good solution to this is, but it's related to the common issue of calling a signal that will trigger on self.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugc: engineGodot classes (nodes, resources, ...)

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions