aboutsummaryrefslogtreecommitdiffstats
path: root/sources/shiboken2
diff options
context:
space:
mode:
Diffstat (limited to 'sources/shiboken2')
-rw-r--r--sources/shiboken2/libshiboken/pep384impl.h7
-rw-r--r--sources/shiboken2/libshiboken/signature.cpp95
-rw-r--r--sources/shiboken2/shibokenmodule/CMakeLists.txt2
-rw-r--r--sources/shiboken2/shibokenmodule/support/signature/__init__.py5
-rw-r--r--sources/shiboken2/shibokenmodule/support/signature/lib/enum_sig.py4
-rw-r--r--sources/shiboken2/shibokenmodule/support/signature/loader.py3
-rw-r--r--sources/shiboken2/shibokenmodule/support/signature/mapping.py14
-rw-r--r--sources/shiboken2/shibokenmodule/support/signature/parser.py1
8 files changed, 76 insertions, 55 deletions
diff --git a/sources/shiboken2/libshiboken/pep384impl.h b/sources/shiboken2/libshiboken/pep384impl.h
index 78b9defb5..bfa8f38a7 100644
--- a/sources/shiboken2/libshiboken/pep384impl.h
+++ b/sources/shiboken2/libshiboken/pep384impl.h
@@ -333,10 +333,11 @@ LIBSHIBOKEN_API PyObject *PepFunction_Get(PyObject *, const char *);
#define PyFunction_Check(op) (Py_TYPE(op) == PepFunction_TypePtr)
#define PyFunction_GET_CODE(func) PyFunction_GetCode(func)
-#define PyFunction_GetCode(func) PepFunction_Get((PyObject *)func, "__code__")
-#define PepFunction_GetName(func) PepFunction_Get((PyObject *)func, "__name__")
+#define PyFunction_GetCode(func) PepFunction_Get((PyObject *)func, "__code__")
+#define PepFunction_GetName(func) PepFunction_Get((PyObject *)func, "__name__")
#else
-#define PepFunction_GetName(func) (((PyFunctionObject *)func)->func_name)
+#define PepFunction_TypePtr (&PyFunction_Type)
+#define PepFunction_GetName(func) (((PyFunctionObject *)func)->func_name)
#endif
/*****************************************************************************
diff --git a/sources/shiboken2/libshiboken/signature.cpp b/sources/shiboken2/libshiboken/signature.cpp
index 92ce3e50a..922f85906 100644
--- a/sources/shiboken2/libshiboken/signature.cpp
+++ b/sources/shiboken2/libshiboken/signature.cpp
@@ -120,6 +120,8 @@ pyside_sm_get___signature__(PyObject *sm, const char *modifier)
{
init_module_2();
Shiboken::AutoDecRef func(PyObject_GetAttrString(sm, "__func__"));
+ if (Py_TYPE(func) == PepFunction_TypePtr)
+ Py_RETURN_NONE;
return GetSignature_Function(func, modifier);
}
@@ -299,28 +301,38 @@ GetClassKey(PyObject *ob)
return Py_BuildValue("O", class_name.object());
}
+static PyObject *empty_dict = nullptr;
+
+static PyObject *
+TypeKey_to_PropsDict(PyObject *type_key, PyObject *obtype)
+{
+ PyObject *dict = PyDict_GetItem(pyside_globals->arg_dict, type_key);
+ if (dict == nullptr) {
+ if (empty_dict == nullptr)
+ empty_dict = PyDict_New();
+ dict = empty_dict;
+ }
+ if (PyTuple_Check(dict))
+ dict = PySide_BuildSignatureProps(obtype);
+ return dict;
+}
+
static PyObject *
GetSignature_Function(PyObject *ob_func, const char *modifier)
{
+ // make sure that we look into PyCFunction, only...
+ if (Py_TYPE(ob_func) == PepFunction_TypePtr)
+ Py_RETURN_NONE;
Shiboken::AutoDecRef typemod(GetClassOfFunc(ob_func));
Shiboken::AutoDecRef type_key(GetClassKey(typemod));
if (type_key.isNull())
Py_RETURN_NONE;
- PyObject *dict = PyDict_GetItem(pyside_globals->arg_dict, type_key);
- if (dict == NULL)
- Py_RETURN_NONE;
- if (PyTuple_Check(dict)) {
- /*
- * We do the initialization lazily.
- * This has also the advantage that we can freely import PySide.
- */
- dict = PySide_BuildSignatureProps(typemod);
- if (dict == NULL)
- Py_RETURN_NONE;
- }
+ PyObject *dict = TypeKey_to_PropsDict(type_key, typemod);
+ if (dict == nullptr)
+ return nullptr;
Shiboken::AutoDecRef func_name(PyObject_GetAttrString(ob_func, "__name__"));
PyObject *props = !func_name.isNull() ? PyDict_GetItem(dict, func_name) : nullptr;
- if (props == NULL)
+ if (props == nullptr)
Py_RETURN_NONE;
int flags = PyCFunction_GET_FLAGS(ob_func);
@@ -333,8 +345,7 @@ GetSignature_Function(PyObject *ob_func, const char *modifier)
sig_kind = "staticmethod";
else
sig_kind = "method";
- PyObject *ret = GetSignature_Cached(props, sig_kind, modifier);
- return ret;
+ return GetSignature_Cached(props, sig_kind, modifier);
}
static PyObject *
@@ -346,20 +357,11 @@ GetSignature_Wrapper(PyObject *ob, const char *modifier)
if (func_name.isNull() || objclass.isNull() || class_key.isNull())
return nullptr;
- PyObject *dict = PyDict_GetItem(pyside_globals->arg_dict, class_key);
- if (dict == NULL)
- Py_RETURN_NONE;
- if (PyTuple_Check(dict)) {
- /*
- * We do the initialization lazily.
- * This has also the advantage that we can freely import PySide.
- */
- dict = PySide_BuildSignatureProps(objclass);
- if (dict == NULL)
- Py_RETURN_NONE;
- }
+ PyObject *dict = TypeKey_to_PropsDict(class_key, objclass);
+ if (dict == nullptr)
+ return nullptr;
PyObject *props = PyDict_GetItem(dict, func_name);
- if (props == NULL)
+ if (props == nullptr)
Py_RETURN_NONE;
return GetSignature_Cached(props, "method", modifier);
}
@@ -370,18 +372,11 @@ GetSignature_TypeMod(PyObject *ob, const char *modifier)
Shiboken::AutoDecRef ob_name(PyObject_GetAttrString(ob, "__name__"));
Shiboken::AutoDecRef ob_key(GetClassKey(ob));
- PyObject *dict = PyDict_GetItem(pyside_globals->arg_dict, ob_key);
- if (dict == NULL)
- Py_RETURN_NONE;
-
- if (PyTuple_Check(dict)) {
- dict = PySide_BuildSignatureProps(ob);
- if (dict == NULL) {
- Py_RETURN_NONE;
- }
- }
+ PyObject *dict = TypeKey_to_PropsDict(ob_key, ob);
+ if (dict == nullptr)
+ return nullptr;
PyObject *props = PyDict_GetItem(dict, ob_name);
- if (props == NULL)
+ if (props == nullptr)
Py_RETURN_NONE;
return GetSignature_Cached(props, "method", modifier);
}
@@ -587,6 +582,9 @@ get_signature(PyObject *self, PyObject *args)
if (!PyArg_ParseTuple(args, "O|s", &ob, &modifier))
return NULL;
+ if (Py_TYPE(ob) == PepFunction_TypePtr)
+ Py_RETURN_NONE;
+
if (Py_TYPE(ob) == &PyCFunction_Type)
return pyside_cf_get___signature__(ob, modifier);
if (Py_TYPE(ob) == PepStaticMethod_TypePtr)
@@ -723,14 +721,13 @@ static PyMethodDef signature_methods[] = {
static void
init_module_2(void)
{
- static int init_done = 0, initializing = 0;
+ static int init_done = 0;
if (!init_done) {
- if (initializing)
- Py_FatalError("Init 2 called recursively!");
- init_phase_2(pyside_globals, signature_methods);
+ // Phase 2 will call __init__.py which touches a signature, itself.
+ // Therefore we set init_done prior to init_phase_2().
init_done = 1;
- initializing = 0;
+ init_phase_2(pyside_globals, signature_methods);
}
}
@@ -751,8 +748,14 @@ PySide_BuildSignatureProps(PyObject *classmod)
if (arg_tup == nullptr)
return nullptr;
PyObject *dict = PyObject_CallObject(pyside_globals->sigparse_func, arg_tup);
- if (dict == nullptr)
- return nullptr;
+ if (dict == nullptr) {
+ if (PyErr_Occurred())
+ return nullptr;
+ // No error: return an empty dict.
+ if (empty_dict == nullptr)
+ empty_dict = PyDict_New();
+ return empty_dict;
+ }
// We replace the arguments by the result dict.
if (PyDict_SetItem(pyside_globals->arg_dict, type_key, dict) < 0)
diff --git a/sources/shiboken2/shibokenmodule/CMakeLists.txt b/sources/shiboken2/shibokenmodule/CMakeLists.txt
index 342b6d908..0eba3eaff 100644
--- a/sources/shiboken2/shibokenmodule/CMakeLists.txt
+++ b/sources/shiboken2/shibokenmodule/CMakeLists.txt
@@ -74,7 +74,7 @@ else()
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/support/signature/backport_inspect.py"
"${CMAKE_CURRENT_BINARY_DIR}/support/signature/backport_inspect.py" COPYONLY)
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/support/signature/typing27.py"
- "${CMAKE_CURRENT_BINARY_DIR}/support/signature/typing.py" COPYONLY)
+ "${CMAKE_CURRENT_BINARY_DIR}/support/signature/typing27.py" COPYONLY)
endif()
install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/support"
DESTINATION "${PYTHON_SITE_PACKAGES}/shiboken2")
diff --git a/sources/shiboken2/shibokenmodule/support/signature/__init__.py b/sources/shiboken2/shibokenmodule/support/signature/__init__.py
index 253ba98dc..d0791df04 100644
--- a/sources/shiboken2/shibokenmodule/support/signature/__init__.py
+++ b/sources/shiboken2/shibokenmodule/support/signature/__init__.py
@@ -41,4 +41,7 @@ from __future__ import print_function, absolute_import
# Trigger initialization phase 2.
_ = type.__signature__
-from signature_loader import get_signature, inspect, typing
+
+## from signature_loader import get_signature, inspect, typing
+# This causes a recursion in Python 2!
+# We do everything from signature_loader, instead.
diff --git a/sources/shiboken2/shibokenmodule/support/signature/lib/enum_sig.py b/sources/shiboken2/shibokenmodule/support/signature/lib/enum_sig.py
index f79f3266a..013ec36cc 100644
--- a/sources/shiboken2/shibokenmodule/support/signature/lib/enum_sig.py
+++ b/sources/shiboken2/shibokenmodule/support/signature/lib/enum_sig.py
@@ -81,6 +81,10 @@ class ExactEnumerator(object):
return ret
def klass(self, class_name, klass):
+ if not "Shiboken" in repr(klass.mro()):
+ # don't look into any foreign classes!
+ ret = self.result_type()
+ return ret
bases_list = []
for base in klass.__bases__:
name = base.__name__
diff --git a/sources/shiboken2/shibokenmodule/support/signature/loader.py b/sources/shiboken2/shibokenmodule/support/signature/loader.py
index 170fb0a2a..de27d441c 100644
--- a/sources/shiboken2/shibokenmodule/support/signature/loader.py
+++ b/sources/shiboken2/shibokenmodule/support/signature/loader.py
@@ -146,7 +146,8 @@ with ensure_import_support():
else:
import inspect
namespace = inspect.__dict__
- from support.signature import typing
+ from support.signature import typing27 as typing
+ typing.__name__ = "typing"
from support.signature import backport_inspect as inspect
_doc = inspect.__doc__
inspect.__dict__.update(namespace)
diff --git a/sources/shiboken2/shibokenmodule/support/signature/mapping.py b/sources/shiboken2/shibokenmodule/support/signature/mapping.py
index bca1ce307..3e76cd94a 100644
--- a/sources/shiboken2/shibokenmodule/support/signature/mapping.py
+++ b/sources/shiboken2/shibokenmodule/support/signature/mapping.py
@@ -104,7 +104,7 @@ class _NotCalled(str):
real object is needed, the wrapper can simply be called.
"""
def __repr__(self):
- suppress = "PySide2.support.signature.typing."
+ suppress = "support.signature.typing."
text = self[len(suppress):] if self.startswith(suppress) else self
return "{}({})".format(type(self).__name__, text)
@@ -119,7 +119,8 @@ class Virtual(_NotCalled):
# Other types I simply could not find.
class Missing(_NotCalled):
- pass
+ def __repr__(self):
+ return '{}("{}")'.format(type(self).__name__, self)
class Invalid(_NotCalled):
pass
@@ -148,7 +149,14 @@ class Reloader(object):
g = globals()
for mod_name in self.uninitialized[:]:
for prefix in self._prefixes:
- if prefix + mod_name in sys.modules:
+ import_name = prefix + mod_name
+ if import_name in sys.modules:
+ # check if this is a real module
+ obj = sys.modules[import_name]
+ if not getattr(obj, "__file__", None) or os.path.isdir(obj.__file__):
+ raise ImportError("Module '{mod_name}' is at most a "
+ "namespace!".format(**locals()))
+ # module is real
self.uninitialized.remove(mod_name)
proc_name = "init_" + mod_name
if proc_name in g:
diff --git a/sources/shiboken2/shibokenmodule/support/signature/parser.py b/sources/shiboken2/shibokenmodule/support/signature/parser.py
index 4bb1bf234..5178d9ef9 100644
--- a/sources/shiboken2/shibokenmodule/support/signature/parser.py
+++ b/sources/shiboken2/shibokenmodule/support/signature/parser.py
@@ -76,6 +76,7 @@ def dprint(*args, **kw):
import pprint
for arg in args:
pprint.pprint(arg)
+ sys.stdout.flush()
def _parse_line(line):
line_re = r"""