26#if PY_VERSION_HEX < 0x030b0000
46 struct InitOperatorMapping_t {
48 InitOperatorMapping_t() {
117#if PY_VERSION_HEX < 0x03000000
134 return (
unsigned long)-1;
136 return (
unsigned long)0;
144 ul = (
unsigned long)i;
147 "can\'t convert negative value to unsigned long");
148 return (
unsigned long)-1;
163 return (
unsigned long)0;
174 "can\'t convert negative value to unsigned long long");
192 pdef->ml_name =
const_cast<char*
>(label);
194 pdef->ml_flags = flags;
195 pdef->ml_doc =
nullptr;
265 std::string
opname =
"operator";
300 bool reverse =
false;
358 &&
lcname.find(
"__wrap_iter") == std::string::npos
374 else {
fname <<
"not_implemented<"; }
412#if PY_VERSION_HEX < 0x03000000
435#if PY_VERSION_HEX < 0x03000000
458 tmpl_name.append(arg ?
"double" :
"float");
462#if PY_VERSION_HEX < 0x03000000
473 std::string
subtype{
"std::initializer_list<"};
486 if (CPPScope_Check(
tn)) {
491 if (CPPInstance_Check(
pyobj)) {
492 if (
pyobj->fFlags & CPPInstance::kIsRValue)
524 std::ostringstream
tpn;
557 for (
auto nn : {PyStrings::gCppName, PyStrings::gName}) {
607 "could not construct C++ name from provided template argument.");
630 const std::vector<std::string>&
argtypes, std::ostringstream& code)
638 code <<
" CPYCPPYY_STATIC std::unique_ptr<CPyCppyy::Converter, std::function<void(CPyCppyy::Converter*)>> "
639 "retconv{CPyCppyy::CreateConverter(\""
640 <<
retType <<
"\"), CPyCppyy::DestroyConverter};\n";
644 code <<
" CPYCPPYY_STATIC std::vector<std::unique_ptr<CPyCppyy::Converter, std::function<void(CPyCppyy::Converter*)>>> argcvs;\n"
645 <<
" if (argcvs.empty()) {\n"
646 <<
" argcvs.reserve(" <<
nArgs <<
");\n";
647 for (
int i = 0; i <
nArgs; ++i) {
649 code <<
" argcvs.emplace_back(CPyCppyy::CreateConverter(\"";
650 const std::string& at =
argtypes[i];
652 const std::string&
cpd = TypeManip::compound(
res_at);
665 code <<
"\"), CPyCppyy::DestroyConverter);\n";
672 code <<
" " <<
retType <<
" ret{};\n";
675 code <<
" PyGILState_STATE state = PyGILState_Ensure();\n";
679 code <<
" std::vector<PyObject*> pyargs;\n";
680 code <<
" pyargs.reserve(" <<
nArgs <<
");\n"
682 for (
int i = 0; i <
nArgs; ++i) {
683 code <<
" pyargs.emplace_back(argcvs[" << i <<
"]->FromMemory((void*)";
685 code <<
"arg" << i <<
"));\n"
686 <<
" if (!pyargs.back()) throw " << i <<
";\n";
688 code <<
" } catch(int) {\n"
689 <<
" for (auto pyarg : pyargs) Py_XDECREF(pyarg);\n"
690 <<
" CPyCppyy::PyException pyexc; PyGILState_Release(state); throw pyexc;\n"
702 code <<
" for (auto pyarg : pyargs) Py_DECREF(pyarg);\n";
703 code <<
" bool cOk = (bool)pyresult;\n"
704 " if (pyresult) {\n";
708 code <<
" if (!CPyCppyy::Instance_IsLively(pyresult))\n"
712 code << (
isVoid ?
"" :
" cOk = retconv->ToMemory(pyresult, (void*)&ret);\n")
713 <<
" Py_DECREF(pyresult);\n }\n";
714 if (
isPtr) code <<
" }\n";
715 code <<
" if (!cOk) {"
719 " /* do nothing */ }\n"
721 " CPyCppyy::PyException pyexc; PyGILState_Release(state); throw pyexc; }\n"
723 " PyGILState_Release(state);\n"
725 code << (
isVoid ?
";\n }\n" :
" ret;\n }\n");
748 std::ostringstream
fname;
751 std::ostringstream code;
752 code <<
"namespace __cppyy_internal { std::function<"
754 <<
"(intptr_t faddr) { return (" <<
retType <<
"(*)" <<
signature <<
")faddr;} }";
778 ((
CPPInstance*)func)->fFlags |= CPPInstance::kIsLValue;
834 || (
sizeof(
long int) ==
sizeof(
int) && ((
tc ==
'I' &&
strchr(
bufinfo.format,
'L')) ||
845 "buffer itemsize (%ld) does not match expected size (%d)",
bufinfo.itemsize,
size);
853 else if (buf &&
bufinfo.ndim == 1)
883#if PY_VERSION_HEX < 0x03000000
893 if (buf &&
check ==
true) {
905 }
else if (buflen ==
size) {
915 (
char*)
"%s and given element size (%ld) do not match needed (%d)",
935 if (8 <
name.size() &&
name.substr(0, 8) ==
"operator") {
936 std::string
op =
name.substr(8, std::string::npos);
939 std::string::size_type start = 0, end =
op.size();
940 while (start < end &&
isspace(
op[start])) ++start;
941 while (start < end &&
isspace(
op[end-1])) --end;
942 op =
op.substr(start, end - start);
959 }
else if (
op ==
"*") {
965 }
else if (
op ==
"/") {
969 }
else if (
op ==
"+") {
975 }
else if (
op ==
"-") {
981 }
else if (
op ==
"++") {
985 }
else if (
op ==
"--") {
1000 std::string
clname =
"<unknown>";
1022 std::string
tt =
"<int>::";
1023 for (
auto c : {
"std::vector",
"std::list",
"std::deque"}) {
1024 for (
auto i : {
"iterator",
"const_iterator"}) {
1026 auto pos =
itname.find(
'<');
1027 if (pos != std::string::npos)
1033 auto pos = classname.find(
'<');
1034 if (pos != std::string::npos)
1059#if PY_VERSION_HEX >= 0x02030000
1136 }
else if (
e.fValue) {
1169 "#include \"CPyCppyy/API.h\"\n"
1172 "#include \"CPyCppyy/DispatchPtr.h\"\n"
1173 "#include \"CPyCppyy/PyException.h\"\n"
PyDictEntry *(* dict_lookup_func)(PyDictObject *, PyObject *, long)
#define CPyCppyy_PyText_InternFromString
#define CPyCppyy_PyText_Append
#define CPyCppyy_PyText_AsString
#define CPyCppyy_PyText_AppendAndDel
void CPyCppyy_PyBuffer_Release(PyObject *, Py_buffer *view)
#define CPyCppyy_PyText_FromFormat
#define CPyCppyy_PyText_FromString
#define CPyCppyy_PyText_Check
unsigned long long PY_ULONG_LONG
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
static std::set< std::string > sIteratorTypes
static TC2POperatorMapping_t gC2POperatorMapping
static CPyCppyy::PyCallable * BuildOperator(const std::string &lcname, const std::string &rcname, const char *op, Cppyy::TCppScope_t scope, bool reverse=false)
static std::set< std::string > gOpRemove
static std::map< std::string, PyObject * > sStdFuncMakerLookup
static std::set< std::string > gOpSkip
static std::map< void *, PyObject * > sStdFuncLookup
static bool AddTypeName(std::string &tmpl_name, PyObject *tn, PyObject *arg, CPyCppyy::Utility::ArgPreference pref, int *pcnt=nullptr)
static bool check_scope(const std::string &name)
std::map< std::string, std::string > TC2POperatorMapping_t
static std::string AnnotationAsText(PyObject *pyobj)
const_iterator begin() const
const_iterator end() const
std::string clean_type(const std::string &cppname, bool template_strip=true, bool const_strip=true)
PyCallable * FindBinaryOperator(PyObject *left, PyObject *right, const char *op, Cppyy::TCppScope_t scope=0)
void ConstructCallbackPreamble(const std::string &retType, const std::vector< std::string > &argtypes, std::ostringstream &code)
void ConstructCallbackReturn(const std::string &retType, int nArgs, std::ostringstream &code)
Py_ssize_t GetBuffer(PyObject *pyobject, char tc, int size, void *&buf, bool check=true)
std::string ConstructTemplateArgs(PyObject *pyname, PyObject *tpArgs, PyObject *args=nullptr, ArgPreference=kNone, int argoff=0, int *pcnt=nullptr)
PyObject * FuncPtr2StdFunction(const std::string &retType, const std::string &signature, void *address)
PyCallable * FindUnaryOperator(PyObject *pyclass, const char *op)
size_t FetchError(std::vector< PyError_t > &, bool is_cpp=false)
std::string MapOperatorName(const std::string &name, bool bTakesParames, bool *stubbed=nullptr)
void SetDetailedException(std::vector< PyError_t > &errors, PyObject *topmsg, PyObject *defexc)
bool InitProxy(PyObject *module, PyTypeObject *pytype, const char *name)
bool AddToClass(PyObject *pyclass, const char *label, PyCFunction cfunc, int flags=METH_VARARGS)
bool IsSTLIterator(const std::string &classname)
std::string ClassName(PyObject *pyobj)
PyObject * PyErr_Occurred_WithGIL()
CPPOverload * CPPOverload_New(const std::string &name, std::vector< PyCallable * > &methods)
unsigned long PyLongOrInt_AsULong(PyObject *pyobject)
PyObject * gDefaultObject
PyObject * CustomInstanceMethod_New(PyObject *func, PyObject *self, PyObject *pyclass)
dict_lookup_func gDictLookupOrg
PyObject * CreateScopeProxy(Cppyy::TCppScope_t, const unsigned flags=0)
bool CPPOverload_Check(T *object)
bool CPPScope_Check(T *object)
PY_ULONG_LONG PyLongOrInt_AsULong64(PyObject *pyobject)
bool CPPInstance_Check(T *object)
PyObject * gNullPtrObject
RPY_EXPORTED bool Compile(const std::string &code, bool silent=false)
RPY_EXPORTED TCppScope_t gGlobalScope
RPY_EXPORTED TCppMethod_t GetMethodTemplate(TCppScope_t scope, const std::string &name, const std::string &proto)
RPY_EXPORTED std::string ResolveName(const std::string &cppitem_name)
RPY_EXPORTED std::string GetScopedFinalName(TCppType_t type)
RPY_EXPORTED TCppMethod_t GetMethod(TCppScope_t scope, TCppIndex_t imeth)
RPY_EXPORTED TCppScope_t GetScope(const std::string &scope_name)
RPY_EXPORTED TCppIndex_t GetGlobalOperator(TCppType_t scope, const std::string &lc, const std::string &rc, const std::string &op)
static void Clear(PyError_t &e)