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 PyGILState_STATE state = PyGILState_Ensure();
14 PyObject* result = nullptr;
15 if (fPyHardRef) {
18 } else if (fPyWeakRef) {
20 if (result) { // dispatcher object disappeared?
22 }
23 }
24 PyGILState_Release(state);
25 return result;
26}
27
28//-----------------------------------------------------------------------------
30{
31 PyGILState_STATE state = PyGILState_Ensure();
32 if (strong) {
35 fPyWeakRef = nullptr;
36 } else {
37 fPyHardRef = nullptr;
39 }
40 ((CPPInstance*)pyobj)->SetDispatchPtr(this);
41 PyGILState_Release(state);
42}
43
44//-----------------------------------------------------------------------------
45CPyCppyy::DispatchPtr::DispatchPtr(const DispatchPtr& other, void* cppinst) : fPyWeakRef(nullptr)
46{
47 PyGILState_STATE state = PyGILState_Ensure();
48 PyObject* pyobj = other.Get(false /* not borrowed */);
49 fPyHardRef = pyobj ? (PyObject*)((CPPInstance*)pyobj)->Copy(cppinst) : nullptr;
50 if (fPyHardRef) ((CPPInstance*)fPyHardRef)->SetDispatchPtr(this);
52 PyGILState_Release(state);
53}
54
55//-----------------------------------------------------------------------------
57// if we're holding a hard reference, or holding weak reference while being part
58// of a dispatcher intermediate, then this delete is from the C++ side, and Python
59// is "notified" by nulling out the reference and an exception will be raised on
60// continued access
61 PyGILState_STATE state = PyGILState_Ensure();
62 if (fPyWeakRef) {
63 PyObject* pyobj = CPyCppyy_GetWeakRef(fPyWeakRef);
65 ((CPPInstance*)pyobj)->GetObjectRaw() = nullptr;
67 Py_DECREF(fPyWeakRef);
68 } else if (fPyHardRef) {
69 ((CPPInstance*)fPyHardRef)->GetObjectRaw() = nullptr;
70 Py_DECREF(fPyHardRef);
71 }
72 PyGILState_Release(state);
73}
74
75//-----------------------------------------------------------------------------
77{
78 PyGILState_STATE state = PyGILState_Ensure();
79 if (this != &other) {
80 Py_XDECREF(fPyWeakRef); fPyWeakRef = nullptr;
81 Py_XDECREF(fPyHardRef);
82 PyObject* pyobj = other.Get(false /* not borrowed */);
83 fPyHardRef = pyobj ? (PyObject*)((CPPInstance*)pyobj)->Copy(cppinst) : nullptr;
84 if (fPyHardRef) ((CPPInstance*)fPyHardRef)->SetDispatchPtr(this);
86 }
87 PyGILState_Release(state);
88 return *this;
89}
90
91//-----------------------------------------------------------------------------
93{
94// Python maintains the hardref, so only allowed a weakref here
95 if (fPyHardRef) {
96 fPyWeakRef = PyWeakref_NewRef(fPyHardRef, nullptr);
97 Py_DECREF(fPyHardRef); fPyHardRef = nullptr;
98 }
99}
100
101//-----------------------------------------------------------------------------
103{
104// C++ maintains the hardref, keeping the PyObject alive w/o outstanding ref
105 PyGILState_STATE state = PyGILState_Ensure();
106 if (fPyWeakRef) {
107 fPyHardRef = CPyCppyy_GetWeakRef(fPyWeakRef);
108 Py_DECREF(fPyWeakRef); fPyWeakRef = nullptr;
109 }
110 PyGILState_Release(state);
111}
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
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t result
DispatchPtr & assign(const DispatchPtr &other, void *cppinst)
PyObject * Get(bool borrowed=true) const