From 050d86dadb6cb87afb47656187cdbb0e9565a462 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 1 Mar 2021 20:38:18 +0100 Subject: [PATCH] event: AsyncFuture::set_result() behavior changes: * Passing a Python subclass of a C++ class now works, the extra Python stuff isn't just discarded * EventParameter objects are no longer automagically unwrapped - there's no more reason to pass an EventParameter to this method anyway, and it might be unexpected if it is treated specially. --- panda/src/event/asyncFuture_ext.cxx | 34 ++++++++++++++--------------- tests/event/test_futures.py | 6 ++--- 2 files changed, 19 insertions(+), 21 deletions(-) diff --git a/panda/src/event/asyncFuture_ext.cxx b/panda/src/event/asyncFuture_ext.cxx index 63c67a5840..fcd49598fa 100644 --- a/panda/src/event/asyncFuture_ext.cxx +++ b/panda/src/event/asyncFuture_ext.cxx @@ -13,7 +13,6 @@ #include "asyncFuture_ext.h" #include "asyncTaskSequence.h" -#include "eventParameter.h" #include "paramValue.h" #include "paramPyObject.h" #include "pythonTask.h" @@ -24,7 +23,6 @@ #ifndef CPPPARSER extern struct Dtool_PyTypedObject Dtool_AsyncFuture; -extern struct Dtool_PyTypedObject Dtool_EventParameter; extern struct Dtool_PyTypedObject Dtool_ParamValueBase; extern struct Dtool_PyTypedObject Dtool_TypedObject; extern struct Dtool_PyTypedObject Dtool_TypedReferenceCount; @@ -174,22 +172,22 @@ set_result(PyObject *result) { return; } else if (DtoolInstance_Check(result)) { - void *ptr; - if ((ptr = DtoolInstance_UPCAST(result, Dtool_EventParameter))) { - _this->set_result(*(const EventParameter *)ptr); - return; - } - if ((ptr = DtoolInstance_UPCAST(result, Dtool_TypedWritableReferenceCount))) { - _this->set_result((TypedWritableReferenceCount *)ptr); - return; - } - if ((ptr = DtoolInstance_UPCAST(result, Dtool_TypedReferenceCount))) { - _this->set_result((TypedReferenceCount *)ptr); - return; - } - if ((ptr = DtoolInstance_UPCAST(result, Dtool_TypedObject))) { - _this->set_result((TypedObject *)ptr); - return; + // If this is a Python subclass of a C++ type, fall through to below, since + // we don't want to lose that extra information. + if (Py_TYPE(result) == (PyTypeObject *)DtoolInstance_TYPE(result)) { + void *ptr; + if ((ptr = DtoolInstance_UPCAST(result, Dtool_TypedWritableReferenceCount))) { + _this->set_result((TypedWritableReferenceCount *)ptr); + return; + } + if ((ptr = DtoolInstance_UPCAST(result, Dtool_TypedReferenceCount))) { + _this->set_result((TypedReferenceCount *)ptr); + return; + } + if ((ptr = DtoolInstance_UPCAST(result, Dtool_TypedObject))) { + _this->set_result((TypedObject *)ptr); + return; + } } } else if (PyUnicode_Check(result)) { diff --git a/tests/event/test_futures.py b/tests/event/test_futures.py index 9e390ba02e..56ab3073e0 100644 --- a/tests/event/test_futures.py +++ b/tests/event/test_futures.py @@ -200,12 +200,12 @@ def test_future_result(): fut = None assert tex.get_ref_count() == rc - # Store EventParameter (gets unwrapped) + # Store EventParameter (no longer gets unwrapped) ep = core.EventParameter(0.5) fut = core.AsyncFuture() fut.set_result(ep) - assert fut.result() == 0.5 - assert fut.result() == 0.5 + assert fut.result() is ep + assert fut.result() is ep # Store TypedObject dg = core.Datagram(b"test")