From da6a07efd5c271b1dfbb248abadd642953c0f9b6 Mon Sep 17 00:00:00 2001 From: Lasse Blaauwbroek Date: Thu, 8 Jun 2023 04:18:42 +0200 Subject: [PATCH] No more need for promise joining --- capnp/helpers/capabilityHelper.cpp | 21 +++++++-------------- capnp/lib/capnp.pyx | 13 ------------- 2 files changed, 7 insertions(+), 27 deletions(-) diff --git a/capnp/helpers/capabilityHelper.cpp b/capnp/helpers/capabilityHelper.cpp index 94f6591..0c69755 100644 --- a/capnp/helpers/capabilityHelper.cpp +++ b/capnp/helpers/capabilityHelper.cpp @@ -58,32 +58,25 @@ void check_py_error() { } } -inline kj::Promise> maybeUnwrapPromise(PyObject * result) { - check_py_error(); - auto promise = extract_promise(result); - Py_DECREF(result); - return kj::mv(*promise); -} - kj::Promise> wrapPyFunc(kj::Own func, kj::Own arg) { GILAcquire gil; - // Creates an owned reference, which will be destroyed in maybeUnwrapPromise PyObject * result = PyObject_CallFunctionObjArgs(func->obj, arg->obj, NULL); - return maybeUnwrapPromise(result); + check_py_error(); + return stealPyRef(result); } kj::Promise> wrapPyFuncNoArg(kj::Own func) { GILAcquire gil; - // Creates an owned reference, which will be destroyed in maybeUnwrapPromise PyObject * result = PyObject_CallFunctionObjArgs(func->obj, NULL); - return maybeUnwrapPromise(result); + check_py_error(); + return stealPyRef(result); } kj::Promise> wrapRemoteCall(kj::Own func, capnp::Response & arg) { GILAcquire gil; - // Creates an owned reference, which will be destroyed in maybeUnwrapPromise - PyObject * ret = wrap_remote_call(func->obj, arg); - return maybeUnwrapPromise(ret); + PyObject * result = wrap_remote_call(func->obj, arg); + check_py_error(); + return stealPyRef(result); } ::kj::Promise> then(kj::Own>> promise, diff --git a/capnp/lib/capnp.pyx b/capnp/lib/capnp.pyx index 5e74f94..f6efc0b 100644 --- a/capnp/lib/capnp.pyx +++ b/capnp/lib/capnp.pyx @@ -155,19 +155,6 @@ cdef api VoidPromise * call_server_method(object server, .format(method_name, str(ret))) -cdef api Own[Promise[Own[PyRefCounter]]] extract_promise(object obj): - if type(obj) is _Promise: - return move((<_Promise>obj).thisptr) - elif type(obj) is _RemotePromise: - parent = (<_RemotePromise>obj)._parent - # We don't need parent anymore. Setting to none allows quicker garbage collection - (<_RemotePromise>obj)._parent = None - return capnp.heap[PyPromise](helpers.convert_to_pypromise(move((<_RemotePromise>obj).thisptr)) - .attach(capnp.heap[PyRefCounter](parent))) - else: - return capnp.heap[PyPromise](capnp.heap[PyRefCounter](obj)) - - cdef extern from "" namespace " ::kj": String strStructReader" ::kj::str"(C_DynamicStruct.Reader) String strStructBuilder" ::kj::str"(DynamicStruct_Builder)