merge
authorStefan Behnel <scoder@users.berlios.de>
Wed, 25 Mar 2009 22:55:54 +0000 (23:55 +0100)
committerStefan Behnel <scoder@users.berlios.de>
Wed, 25 Mar 2009 22:55:54 +0000 (23:55 +0100)
Cython/Compiler/Builtin.py
Cython/Compiler/Nodes.py
tests/bugs/missing_self_in_cpdef_method_T165.pyx [deleted file]
tests/errors/builtin_type_conflict_T170.pyx [new file with mode: 0644]
tests/errors/missing_self_in_cpdef_method_T165.pyx [new file with mode: 0644]

index 3140b5334f9a34c2e18c16b0c3e7df070035cbd2..c7b1be6f42e93fe2810de7c0b0f510633cb0d1be 100644 (file)
@@ -91,7 +91,10 @@ builtin_types_table = [
     ("int",     "PyInt_Type",      []),
     ("long",    "PyLong_Type",     []),
     ("float",   "PyFloat_Type",    []),
-    ("complex", "PyComplex_Type",  []),
+    
+# Until we have a way to access attributes of a type, 
+# we don't want to make this one builtin.    
+#    ("complex", "PyComplex_Type",  []),
 
     ("bytes",   "PyBytes_Type",    []),
     ("str",     "PyString_Type",   []),
@@ -340,10 +343,14 @@ def init_builtin_funcs():
     for desc in builtin_function_table:
         declare_builtin_func(*desc)
 
+builtin_types = {}
+
 def init_builtin_types():
+    global builtin_types
     for name, cname, funcs in builtin_types_table:
         utility = builtin_utility_code.get(name)
         the_type = builtin_scope.declare_builtin_type(name, cname, utility)
+        builtin_types[name] = the_type
         for name, args, ret, cname in funcs:
             sig = Signature(args, ret)
             the_type.scope.declare_cfunction(name, sig.function_type(), None, cname)
index f28f0204a7557ef80334df5ea7b1841f5134205c..f9d7fb532de933e9dc5bed89eddf4acf10184b0a 100644 (file)
@@ -1335,7 +1335,12 @@ class CFuncDefNode(FuncDefNode):
         self.entry.inline_func_in_pxd = self.inline_in_pxd
         self.return_type = type.return_type
         
-        if self.overridable and len(self.args) > 0:
+        if self.overridable and not env.is_module_scope:
+            if len(self.args) < 1 or not self.args[0].type.is_pyobject:
+                # An error will be produced in the cdef function
+                self.overridable = False
+            
+        if self.overridable:
             import ExprNodes
             py_func_body = self.call_self_node(is_module_scope = env.is_module_scope)
             self.py_func = DefNode(pos = self.pos, 
@@ -2669,6 +2674,11 @@ class CClassDefNode(ClassDefNode):
                 return
         else:
             home_scope = env
+
+        if self.visibility == 'extern':
+            if self.module_name == '__builtin__' and self.class_name in Builtin.builtin_types:
+                warning(self.pos, "%s already a builtin Cython type" % self.class_name, 1)
+
         self.entry = home_scope.declare_c_class(
             name = self.class_name, 
             pos = self.pos,
diff --git a/tests/bugs/missing_self_in_cpdef_method_T165.pyx b/tests/bugs/missing_self_in_cpdef_method_T165.pyx
deleted file mode 100644 (file)
index 75349a8..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-
-cdef class A:
-    cpdef a(int not_self):
-        pass
-
diff --git a/tests/errors/builtin_type_conflict_T170.pyx b/tests/errors/builtin_type_conflict_T170.pyx
new file mode 100644 (file)
index 0000000..89d4153
--- /dev/null
@@ -0,0 +1,15 @@
+cdef extern from *:
+    ctypedef class __builtin__.list [object PyListObject]:
+        pass
+
+cdef list foo = []
+
+# This is too invasive for Python 0.11.x, re-enable in 0.12
+NEW_ERRORS = u"""
+:2:4: list already a builtin Cython type
+"""
+
+_ERRORS = u"""
+:5:16: Cannot coerce list to type 'list'
+"""
+
diff --git a/tests/errors/missing_self_in_cpdef_method_T165.pyx b/tests/errors/missing_self_in_cpdef_method_T165.pyx
new file mode 100644 (file)
index 0000000..3b66bc7
--- /dev/null
@@ -0,0 +1,8 @@
+
+cdef class A:
+    cpdef a(int not_self):
+        pass
+
+_ERRORS = u"""
+3:10: Self argument (int) of C method 'a' does not match parent type (A)
+"""