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)
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
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