rolled back accidentally committed files
authorStefan Behnel <scoder@users.berlios.de>
Fri, 18 Sep 2009 06:16:51 +0000 (08:16 +0200)
committerStefan Behnel <scoder@users.berlios.de>
Fri, 18 Sep 2009 06:16:51 +0000 (08:16 +0200)
Cython/Compiler/Builtin.py
Cython/Compiler/Optimize.py
Cython/Compiler/PyrexTypes.py
tests/bugs.txt

index 923cfc4a3e4285ff148cea4ca855f2662cb9aeaf..53ce01b13382c282bb68d26e9cf253e40460a12b 100644 (file)
@@ -21,7 +21,7 @@ builtin_function_table = [
     #('eval',      "",     "",      ""),
     #('execfile',  "",     "",      ""),
     #('filter',    "",     "",      ""),
-    #('getattr',    "OO",   "O",     "PyObject_GetAttr"),   #  optimised later on
+    #('getattr',    "OO",   "O",     "PyObject_GetAttr"),   # optimised later on
     ('getattr3',   "OOO",  "O",     "__Pyx_GetAttr3",       "getattr"),
     ('hasattr',    "OO",   "b",     "PyObject_HasAttr"),
     ('hash',       "O",    "l",     "PyObject_Hash"),
@@ -29,7 +29,7 @@ builtin_function_table = [
     #('id',        "",     "",      ""),
     #('input',     "",     "",      ""),
     ('intern',     "s",    "O",     "__Pyx_InternFromString"),
-    #('isinstance', "OO",   "b",     "PyObject_IsInstance"),    # optimised later on
+    ('isinstance', "OO",   "b",     "PyObject_IsInstance"),
     ('issubclass', "OO",   "b",     "PyObject_IsSubclass"),
     ('iter',       "O",    "O",     "PyObject_GetIter"),
     ('len',        "O",    "Z",     "PyObject_Length"),
index fe0a73299ddcd8f508547a0e7121ed8147cf189b..425c7f6eff136fa95fe1bc7fe3bfdfdb0894dd9f 100644 (file)
@@ -712,41 +712,6 @@ class OptimizeBuiltinCalls(Visitor.VisitorTransform):
                   "expected 2 or 3, found %d" % len(args))
         return node
 
-    PyObject_TypeCheck_func_type = PyrexTypes.CFuncType(
-        PyrexTypes.c_bint_type, [
-            PyrexTypes.CFuncTypeArg("obj", PyrexTypes.py_object_type, None),
-            PyrexTypes.CFuncTypeArg("type", PyrexTypes.c_py_type_object_ptr_type, None),
-            ])
-
-    PyObject_IsInstance_func_type = PyrexTypes.CFuncType(
-        PyrexTypes.c_bint_type, [
-            PyrexTypes.CFuncTypeArg("obj", PyrexTypes.py_object_type, None),
-            PyrexTypes.CFuncTypeArg("type", PyrexTypes.py_object_type, None),
-            ])
-
-    def _handle_simple_function_isinstance(self, node, pos_args):
-        """Replace generic calls to isinstance(x, type) by a more
-        efficient type check.
-        """
-        args = pos_args.args
-        if len(args) != 2:
-            error(node.pos, "isinstance(x, type) called with wrong number of args, found %d" %
-                  len(args))
-            return node
-
-        type_arg = args[1]
-        if type_arg.type is Builtin.type_type:
-            function_name = "PyObject_TypeCheck"
-            function_type = self.PyObject_TypeCheck_func_type
-            args[1] = ExprNodes.CastNode(type_arg, PyrexTypes.c_py_type_object_ptr_type)
-        else:
-            function_name = "PyObject_IsInstance"
-            function_type = self.PyObject_IsInstance_func_type
-
-        return ExprNodes.PythonCapiCallNode(
-            node.pos, function_name, function_type,
-            args = args, is_temp = node.is_temp)
-
     Pyx_Type_func_type = PyrexTypes.CFuncType(
         Builtin.type_type, [
             PyrexTypes.CFuncTypeArg("object", PyrexTypes.py_object_type, None)
@@ -1093,8 +1058,8 @@ class FinalOptimizePhase(Visitor.CythonTransform):
     just before the C code generation phase. 
     
     The optimizations currently implemented in this class are: 
-        - Eliminate None assignment and refcounting for first assignment.
-        - Eliminate dead coercion nodes.
+        - Eliminate None assignment and refcounting for first assignment. 
+        - isinstance -> typecheck for cdef types
     """
     def visit_SingleAssignmentNode(self, node):
         """Avoid redundant initialisation of local variables before their
@@ -1110,23 +1075,18 @@ class FinalOptimizePhase(Visitor.CythonTransform):
                 lhs.entry.init = 0
         return node
 
-    def visit_NoneCheckNode(self, node):
-        """Remove NoneCheckNode nodes wrapping nodes that cannot
-        possibly be None.
-
-        FIXME: the list below might be better maintained as a node
-        class attribute...
+    def visit_SimpleCallNode(self, node):
+        """Replace generic calls to isinstance(x, type) by a more efficient
+        type check.
         """
-        target = node.arg
-        if isinstance(target, ExprNodes.NoneNode):
-            return node
-        if not target.type.is_pyobject:
-            return target
-        if isinstance(target, (ExprNodes.ConstNode,
-                               ExprNodes.NumBinopNode)):
-            return target
-        if isinstance(target, (ExprNodes.SequenceNode,
-                               ExprNodes.ComprehensionNode,
-                               ExprNodes.SetNode, ExprNodes.DictNode)):
-            return target
+        self.visitchildren(node)
+        if node.function.type.is_cfunction and isinstance(node.function, ExprNodes.NameNode):
+            if node.function.name == 'isinstance':
+                type_arg = node.args[1]
+                if type_arg.type.is_builtin_type and type_arg.type.name == 'type':
+                    from CythonScope import utility_scope
+                    node.function.entry = utility_scope.lookup('PyObject_TypeCheck')
+                    node.function.type = node.function.entry.type
+                    PyTypeObjectPtr = PyrexTypes.CPtrType(utility_scope.lookup('PyTypeObject').type)
+                    node.args[1] = ExprNodes.CastNode(node.args[1], PyTypeObjectPtr)
         return node
index 46f21ab626337e4123216a31c0af0e6d0c46dda5..17d886c53589a40209e6eb2f27fd0e35914e1cee 100644 (file)
@@ -1691,9 +1691,6 @@ c_anon_enum_type =    CAnonEnumType(-1, 1)
 c_py_buffer_type = CStructOrUnionType("Py_buffer", "struct", None, 1, "Py_buffer")
 c_py_buffer_ptr_type = CPtrType(c_py_buffer_type)
 
-c_py_type_object_type = CStructOrUnionType("PyTypeObject", "struct", None, 1, "PyTypeObject")
-c_py_type_object_ptr_type = CPtrType(c_py_type_object_type)
-
 error_type =    ErrorType()
 unspecified_type = UnspecifiedType()
 
index 9de9fdf2ee37abd3b7dfd90b59313d5359dc59c8..3c6ad215bfde7d2c233745a6d0802ad6bc221bdf 100644 (file)
@@ -8,7 +8,6 @@ unsignedbehaviour_T184
 funcexc_iter_T228
 bad_c_struct_T252
 missing_baseclass_in_predecl_T262
-compile_time_unraisable_T370
 
 # Not yet enabled
 profile_test