Remove internal dependancy on included .pxd files
authorRobert Bradshaw <robertwb@math.washington.edu>
Fri, 27 Mar 2009 11:58:21 +0000 (04:58 -0700)
committerRobert Bradshaw <robertwb@math.washington.edu>
Fri, 27 Mar 2009 11:58:21 +0000 (04:58 -0700)
Cython/Compiler/CythonScope.py
Cython/Compiler/Optimize.py

index 5a4a8c9d3570415bd50e992f8ff4753dfbc0d746..54dc38666d572a104660c168d1006c4092759d81 100644 (file)
@@ -15,7 +15,7 @@ class CythonScope(ModuleScope):
                                                   pos=None,
                                                   defining = 1,
                                                   cname='<error>')
-                                                  
+        
     def lookup_type(self, name):
         # This function should go away when types are all first-level objects. 
         type = parse_basic_type(name)
@@ -23,4 +23,27 @@ class CythonScope(ModuleScope):
             return type
 
 def create_cython_scope(context):
+    create_utility_scope(context)
     return CythonScope(context)
+
+
+def create_utility_scope(context):
+    global utility_scope
+    utility_scope = ModuleScope(u'utility', None, context)
+
+    # These are used to optimize isinstance in FinalOptimizePhase
+    type_object = utility_scope.declare_typedef('PyTypeObject', 
+                                                base_type = c_void_type, 
+                                                pos = None,
+                                                cname = 'PyTypeObject')
+    type_object.is_void = True
+    
+    utility_scope.declare_cfunction(
+                'PyObject_TypeCheck',
+                CFuncType(c_bint_type, [CFuncTypeArg("o", py_object_type, None),
+                                        CFuncTypeArg("t", c_ptr_type(type_object), None)]),
+                pos = None,
+                defining = 1,
+                cname = 'PyObject_TypeCheck')
+    
+    return utility_scope
index 7aec738ae84b8da6dceb57eb064a13d0da623b14..5e94aa2bff213259b27ffa903e90594b996be44c 100644 (file)
@@ -640,11 +640,9 @@ class FinalOptimizePhase(Visitor.CythonTransform):
             if node.function.name == 'isinstance':
                 type_arg = node.args[1]
                 if type_arg.type.is_builtin_type and type_arg.type.name == 'type':
-                    object_module = self.context.find_module('python_object')
-                    node.function.entry = object_module.lookup('PyObject_TypeCheck')
-                    if node.function.entry is None:
-                        return node # only happens when there was an error earlier
+                    from CythonScope import utility_scope
+                    node.function.entry = utility_scope.lookup('PyObject_TypeCheck')
                     node.function.type = node.function.entry.type
-                    PyTypeObjectPtr = PyrexTypes.CPtrType(object_module.lookup('PyTypeObject').type)
+                    PyTypeObjectPtr = PyrexTypes.CPtrType(utility_scope.lookup('PyTypeObject').type)
                     node.args[1] = ExprNodes.CastNode(node.args[1], PyTypeObjectPtr)
         return node