diff options
author | Christian Tismer <tismer@stackless.com> | 2018-07-14 15:10:56 +0200 |
---|---|---|
committer | Christian Tismer <tismer@stackless.com> | 2018-12-22 12:26:10 +0000 |
commit | 73a9168ad56559bb3fba0d93866b05a7fde812de (patch) | |
tree | b57018ee6702eac794867635d549a3b65509ca71 /sources/shiboken2/shibokenmodule | |
parent | c013faebdfb248e1ce66fa41aa0a771aaf4e3d80 (diff) |
Complete The Signature Introspection
The signature module has been quite far developed.
In the course of making things fit for the TypeErrors with
the signature module, now also all signatures from all
shiboken modules are queried.
Instead of writing an extra signature existence test for
shiboken, it made more sense to extend the existing
init_platform.py by the shiboken modules.
In fact, by this query a corner case was exploited that
worked on Python 2 but assertion-crashed on Python 3.
The mapping.py modules were also completed to support
all new PySide2 modules.
Special care had to be taken because the "shiboken2" module
exists both as directory and as binary module. The fix was
tricky, and I will add a task that replaces such workarounds
by a better design.
Task-number: PYSIDE-510
Change-Id: Ibf8e322d1905976a0044a702ea178b7f98629fb4
Reviewed-by: Christian Tismer <tismer@stackless.com>
Diffstat (limited to 'sources/shiboken2/shibokenmodule')
-rw-r--r-- | sources/shiboken2/shibokenmodule/support/signature/backport_inspect.py | 4 | ||||
-rw-r--r-- | sources/shiboken2/shibokenmodule/support/signature/mapping.py | 72 |
2 files changed, 69 insertions, 7 deletions
diff --git a/sources/shiboken2/shibokenmodule/support/signature/backport_inspect.py b/sources/shiboken2/shibokenmodule/support/signature/backport_inspect.py index 6b97470e2..e890dcdcf 100644 --- a/sources/shiboken2/shibokenmodule/support/signature/backport_inspect.py +++ b/sources/shiboken2/shibokenmodule/support/signature/backport_inspect.py @@ -113,8 +113,8 @@ CO_NOFREE = 0x0040 # We use '__builtin__' and '__name__' instead. # It is further changed because we use a local copy of typing def formatannotation(annotation, base_module=None): - if getattr(annotation, '__module__', None) == 'support.signature.typing': - return repr(annotation).replace('support.signature.typing', 'typing') + if getattr(annotation, '__module__', None) == 'support.signature.typing27': + return repr(annotation).replace('support.signature.typing27', 'typing') if isinstance(annotation, type): if annotation.__module__ in ('__builtin__', base_module): return annotation.__name__ diff --git a/sources/shiboken2/shibokenmodule/support/signature/mapping.py b/sources/shiboken2/shibokenmodule/support/signature/mapping.py index 3e76cd94a..f638bc42b 100644 --- a/sources/shiboken2/shibokenmodule/support/signature/mapping.py +++ b/sources/shiboken2/shibokenmodule/support/signature/mapping.py @@ -88,6 +88,7 @@ WId = int GL_TEXTURE_2D = 0x0DE1 GL_RGBA = 0x1908 + class _NotCalled(str): """ Wrap some text with semantics @@ -104,7 +105,7 @@ class _NotCalled(str): real object is needed, the wrapper can simply be called. """ def __repr__(self): - suppress = "support.signature.typing." + suppress = "support.signature.typing27." text = self[len(suppress):] if self.startswith(suppress) else self return "{}({})".format(type(self).__name__, text) @@ -113,14 +114,20 @@ class _NotCalled(str): text = self if self.endswith(")") else self + "()" return eval(text, namespace) +USE_PEP563 = sys.version_info[:2] >= (3, 7) + + # Some types are abstract. They just show their name. class Virtual(_NotCalled): pass # Other types I simply could not find. class Missing(_NotCalled): - def __repr__(self): - return '{}("{}")'.format(type(self).__name__, self) + if not USE_PEP563: + # The string must be quoted, because the object does not exist. + def __repr__(self): + return '{}("{}")'.format(type(self).__name__, self) + class Invalid(_NotCalled): pass @@ -129,12 +136,20 @@ class Invalid(_NotCalled): class Default(_NotCalled): pass + class Instance(_NotCalled): pass class Reloader(object): - _uninitialized = ["sample"] + """ + Reloder class + + This is a singleton class which provides the update function for the + shiboken and PySide classes. + """ + ## Note: We needed to rename shiboken2 in order to avoid a name clash. + _uninitialized = "Shiboken minimal sample other smart".split() _prefixes = [""] def __init__(self): @@ -142,6 +157,14 @@ class Reloader(object): self.uninitialized = self._uninitialized def update(self, g=None): + """ + update is responsible to import all modules from shiboken and PySide + which are already in sys.modules. + The purpose is to follow all user imports without introducing new + ones. + This function is called by pyside_type_init to adapt imports + when the number of imported modules has changed. + """ if self.sys_module_count == len(sys.modules): return self.sys_module_count = len(sys.modules) @@ -160,6 +183,14 @@ class Reloader(object): self.uninitialized.remove(mod_name) proc_name = "init_" + mod_name if proc_name in g: + # Do the 'import {import_name}' first. + # 'top' is PySide2 when we do 'import PySide.QtCore' + # or Shiboken if we do 'import Shiboken'. + # Convince yourself that these two lines below have the same + # global effect as "import Shiboken" or "import PySide2.QtCore". + top = __import__(import_name) + g[top.__name__] = top + # Modules are in place, we can update the type_map. g.update(g[proc_name]()) @@ -167,8 +198,23 @@ update_mapping = Reloader().update type_map = {} +def init_Shiboken(): + type_map.update({ + "shiboken2.bool": bool, + "size_t": int, + "PyType": type, + }) + return locals() + + +def init_minimal(): + type_map.update({ + "MinBool": bool, + }) + return locals() + + def init_sample(): - import sample import datetime type_map.update({ "sample.int": int, @@ -207,4 +253,20 @@ def init_sample(): }) return locals() + +def init_other(): + import numbers + type_map.update({ + "other.Number": numbers.Number, + "other.ExtendsNoImplicitConversion": Missing("other.ExtendsNoImplicitConversion"), + }) + return locals() + + +def init_smart(): + type_map.update({ + "smart.SharedPtr": Missing("smart.SharedPtr"), # bad object "SharedPtr<Obj >" + }) + return locals() + # end of file |