|
|
from __future__ import absolute_import |
|
|
|
|
|
from .Symtab import ModuleScope |
|
|
from .PyrexTypes import * |
|
|
from .UtilityCode import CythonUtilityCode |
|
|
from .Errors import error |
|
|
from .Scanning import StringSourceDescriptor |
|
|
from . import MemoryView |
|
|
|
|
|
|
|
|
class CythonScope(ModuleScope): |
|
|
is_cython_builtin = 1 |
|
|
_cythonscope_initialized = False |
|
|
|
|
|
def __init__(self, context): |
|
|
ModuleScope.__init__(self, u'cython', None, None) |
|
|
self.pxd_file_loaded = True |
|
|
self.populate_cython_scope() |
|
|
|
|
|
self.context = context |
|
|
|
|
|
for fused_type in (cy_integral_type, cy_floating_type, cy_numeric_type): |
|
|
entry = self.declare_typedef(fused_type.name, |
|
|
fused_type, |
|
|
None, |
|
|
cname='<error>') |
|
|
entry.in_cinclude = True |
|
|
|
|
|
def is_cpp(self): |
|
|
|
|
|
return self.context.cpp |
|
|
|
|
|
def lookup_type(self, name): |
|
|
|
|
|
type = parse_basic_type(name) |
|
|
if type: |
|
|
return type |
|
|
|
|
|
return super(CythonScope, self).lookup_type(name) |
|
|
|
|
|
def lookup(self, name): |
|
|
entry = super(CythonScope, self).lookup(name) |
|
|
|
|
|
if entry is None and not self._cythonscope_initialized: |
|
|
self.load_cythonscope() |
|
|
entry = super(CythonScope, self).lookup(name) |
|
|
|
|
|
return entry |
|
|
|
|
|
def find_module(self, module_name, pos): |
|
|
error("cython.%s is not available" % module_name, pos) |
|
|
|
|
|
def find_submodule(self, module_name): |
|
|
entry = self.entries.get(module_name, None) |
|
|
if not entry: |
|
|
self.load_cythonscope() |
|
|
entry = self.entries.get(module_name, None) |
|
|
|
|
|
if entry and entry.as_module: |
|
|
return entry.as_module |
|
|
else: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
raise error((StringSourceDescriptor(u"cython", u""), 0, 0), |
|
|
"cython.%s is not available" % module_name) |
|
|
|
|
|
def lookup_qualified_name(self, qname): |
|
|
|
|
|
name_path = qname.split(u'.') |
|
|
scope = self |
|
|
while len(name_path) > 1: |
|
|
scope = scope.lookup_here(name_path[0]) |
|
|
if scope: |
|
|
scope = scope.as_module |
|
|
del name_path[0] |
|
|
if scope is None: |
|
|
return None |
|
|
else: |
|
|
return scope.lookup_here(name_path[0]) |
|
|
|
|
|
def populate_cython_scope(self): |
|
|
|
|
|
type_object = self.declare_typedef( |
|
|
'PyTypeObject', |
|
|
base_type = c_void_type, |
|
|
pos = None, |
|
|
cname = 'PyTypeObject') |
|
|
type_object.is_void = True |
|
|
type_object_type = type_object.type |
|
|
|
|
|
self.declare_cfunction( |
|
|
'PyObject_TypeCheck', |
|
|
CFuncType(c_bint_type, [CFuncTypeArg("o", py_object_type, None), |
|
|
CFuncTypeArg("t", c_ptr_type(type_object_type), None)]), |
|
|
pos = None, |
|
|
defining = 1, |
|
|
cname = 'PyObject_TypeCheck') |
|
|
|
|
|
def load_cythonscope(self): |
|
|
""" |
|
|
Creates some entries for testing purposes and entries for |
|
|
cython.array() and for cython.view.*. |
|
|
""" |
|
|
if self._cythonscope_initialized: |
|
|
return |
|
|
|
|
|
self._cythonscope_initialized = True |
|
|
cython_testscope_utility_code.declare_in_scope( |
|
|
self, cython_scope=self) |
|
|
cython_test_extclass_utility_code.declare_in_scope( |
|
|
self, cython_scope=self) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self.viewscope = viewscope = ModuleScope(u'view', self, None) |
|
|
self.declare_module('view', viewscope, None).as_module = viewscope |
|
|
viewscope.is_cython_builtin = True |
|
|
viewscope.pxd_file_loaded = True |
|
|
|
|
|
cythonview_testscope_utility_code.declare_in_scope( |
|
|
viewscope, cython_scope=self) |
|
|
|
|
|
view_utility_scope = MemoryView.view_utility_code.declare_in_scope( |
|
|
self.viewscope, cython_scope=self, |
|
|
whitelist=MemoryView.view_utility_whitelist) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def create_cython_scope(context): |
|
|
|
|
|
|
|
|
|
|
|
return CythonScope(context) |
|
|
|
|
|
|
|
|
|
|
|
def load_testscope_utility(cy_util_name, **kwargs): |
|
|
return CythonUtilityCode.load(cy_util_name, "TestCythonScope.pyx", **kwargs) |
|
|
|
|
|
|
|
|
undecorated_methods_protos = UtilityCode(proto=u""" |
|
|
/* These methods are undecorated and have therefore no prototype */ |
|
|
static PyObject *__pyx_TestClass_cdef_method( |
|
|
struct __pyx_TestClass_obj *self, int value); |
|
|
static PyObject *__pyx_TestClass_cpdef_method( |
|
|
struct __pyx_TestClass_obj *self, int value, int skip_dispatch); |
|
|
static PyObject *__pyx_TestClass_def_method( |
|
|
PyObject *self, PyObject *value); |
|
|
""") |
|
|
|
|
|
cython_testscope_utility_code = load_testscope_utility("TestScope") |
|
|
|
|
|
test_cython_utility_dep = load_testscope_utility("TestDep") |
|
|
|
|
|
cython_test_extclass_utility_code = \ |
|
|
load_testscope_utility("TestClass", name="TestClass", |
|
|
requires=[undecorated_methods_protos, |
|
|
test_cython_utility_dep]) |
|
|
|
|
|
cythonview_testscope_utility_code = load_testscope_utility("View.TestScope") |
|
|
|