Index: third_party/cython/src/Cython/Compiler/CythonScope.py |
diff --git a/third_party/cython/src/Cython/Compiler/CythonScope.py b/third_party/cython/src/Cython/Compiler/CythonScope.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2bc72b44476a977f0ff8fee0bfecd7a54f75d1b2 |
--- /dev/null |
+++ b/third_party/cython/src/Cython/Compiler/CythonScope.py |
@@ -0,0 +1,155 @@ |
+from Symtab import ModuleScope |
+from PyrexTypes import * |
+from UtilityCode import CythonUtilityCode |
+from Errors import error |
+from Scanning import StringSourceDescriptor |
+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() |
+ # The Main.Context object |
+ 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 lookup_type(self, name): |
+ # This function should go away when types are all first-level objects. |
+ 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: |
+ # TODO: fix find_submodule control flow so that we're not |
+ # expected to create a submodule here (to protect CythonScope's |
+ # possible immutability). Hack ourselves out of the situation |
+ # for now. |
+ raise error((StringSourceDescriptor(u"cython", u""), 0, 0), |
+ "cython.%s is not available" % module_name) |
+ |
+ def lookup_qualified_name(self, qname): |
+ # ExprNode.as_cython_attribute generates qnames and we untangle it here... |
+ name_path = qname.split(u'.') |
+ scope = self |
+ while len(name_path) > 1: |
+ scope = scope.lookup_here(name_path[0]).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): |
+ # These are used to optimize isinstance in FinalOptimizePhase |
+ 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) |
+ |
+ # |
+ # The view sub-scope |
+ # |
+ 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) |
+ |
+ # self.entries["array"] = view_utility_scope.entries.pop("array") |
+ |
+ |
+def create_cython_scope(context): |
+ # One could in fact probably make it a singleton, |
+ # but not sure yet whether any code mutates it (which would kill reusing |
+ # it across different contexts) |
+ return CythonScope(context) |
+ |
+# Load test utilities for the cython scope |
+ |
+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") |