Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
DispatchPtr.cxx
Go to the documentation of this file.
1// Bindings
2#include "CPyCppyy.h"
3#define CPYCPPYY_INTERNAL 1
5#undef CPYCPPYY_INTERNAL
6#include "CPPInstance.h"
7#include "CPPScope.h"
8
9
10//-----------------------------------------------------------------------------
12{
13 if (fPyHardRef) {
14 if (!borrowed) Py_INCREF(fPyHardRef);
15 return fPyHardRef;
16 }
17 if (fPyWeakRef) {
19 if (disp) { // dispatcher object disappeared?
20 if (borrowed) Py_DECREF(disp);
21 return disp;
22 }
23 }
24 return nullptr;
25}
26
27//-----------------------------------------------------------------------------
28CPyCppyy::DispatchPtr::DispatchPtr(PyObject* pyobj, bool strong) : fPyHardRef(nullptr)
29{
30 if (strong) {
31 Py_INCREF(pyobj);
32 fPyHardRef = pyobj;
33 fPyWeakRef = nullptr;
34 } else {
35 fPyHardRef = nullptr;
36 fPyWeakRef = PyWeakref_NewRef(pyobj, nullptr);
37 }
38 ((CPPInstance*)pyobj)->SetDispatchPtr(this);
39}
40
41//-----------------------------------------------------------------------------
42CPyCppyy::DispatchPtr::DispatchPtr(const DispatchPtr& other, void* cppinst) : fPyWeakRef(nullptr)
43{
44 PyObject* pyobj = other.Get(false /* not borrowed */);
45 fPyHardRef = pyobj ? (PyObject*)((CPPInstance*)pyobj)->Copy(cppinst) : nullptr;
46 if (fPyHardRef) ((CPPInstance*)fPyHardRef)->SetDispatchPtr(this);
47 Py_XDECREF(pyobj);
48}
49
50//-----------------------------------------------------------------------------
52// if we're holding a hard reference, or holding weak reference while being part
53// of a dispatcher intermediate, then this delete is from the C++ side, and Python
54// is "notified" by nulling out the reference and an exception will be raised on
55// continued access
56 if (fPyWeakRef) {
57 PyObject* pyobj = CPyCppyy_GetWeakRef(fPyWeakRef);
58 if (pyobj && ((CPPScope*)Py_TYPE(pyobj))->fFlags & CPPScope::kIsPython)
59 ((CPPInstance*)pyobj)->GetObjectRaw() = nullptr;
60 Py_XDECREF(pyobj);
61 Py_DECREF(fPyWeakRef);
62 } else if (fPyHardRef) {
63 ((CPPInstance*)fPyHardRef)->GetObjectRaw() = nullptr;
64 Py_DECREF(fPyHardRef);
65 }
66}
67
68//-----------------------------------------------------------------------------
70{
71 if (this != &other) {
72 Py_XDECREF(fPyWeakRef); fPyWeakRef = nullptr;
73 Py_XDECREF(fPyHardRef);
74 PyObject* pyobj = other.Get(false /* not borrowed */);
75 fPyHardRef = pyobj ? (PyObject*)((CPPInstance*)pyobj)->Copy(cppinst) : nullptr;
76 if (fPyHardRef) ((CPPInstance*)fPyHardRef)->SetDispatchPtr(this);
77 Py_XDECREF(pyobj);
78 }
79 return *this;
80}
81
82//-----------------------------------------------------------------------------
84{
85// Python maintains the hardref, so only allowed a weakref here
86 if (fPyHardRef) {
87 fPyWeakRef = PyWeakref_NewRef(fPyHardRef, nullptr);
88 Py_DECREF(fPyHardRef); fPyHardRef = nullptr;
89 }
90}
91
92//-----------------------------------------------------------------------------
94{
95// C++ maintains the hardref, keeping the PyObject alive w/o outstanding ref
96 if (fPyWeakRef) {
97 fPyHardRef = CPyCppyy_GetWeakRef(fPyWeakRef);
98 Py_DECREF(fPyWeakRef); fPyWeakRef = nullptr;
99 }
100}
static PyObject * CPyCppyy_GetWeakRef(PyObject *ref)
Definition CPyCppyy.h:356
#define Py_TYPE(ob)
Definition CPyCppyy.h:196
_object PyObject
std::ios_base::fmtflags fFlags
DispatchPtr & assign(const DispatchPtr &other, void *cppinst)
PyObject * Get(bool borrowed=true) const