Minor bug fixes
authorRobert Bradshaw <robertwb@math.washington.edu>
Thu, 11 Oct 2007 06:31:46 +0000 (23:31 -0700)
committerRobert Bradshaw <robertwb@math.washington.edu>
Thu, 11 Oct 2007 06:31:46 +0000 (23:31 -0700)
Cython/Compiler/ExprNodes.py
Cython/Compiler/Nodes.py
Cython/Compiler/Parsing.py
Cython/Compiler/Symtab.py

index ac3656f7edcffd5017880ab7f66f1fcfcfffde2e..b0526ef40b568c85ec87ff04e54c71a11aa0549e 100644 (file)
@@ -1678,6 +1678,8 @@ class AttributeNode(ExprNode):
             entry = None
             if obj_type.attributes_known():
                 entry = obj_type.scope.lookup_here(self.attribute)
+                if entry and entry.is_member:
+                    entry = None
             else:
                 error(self.pos, 
                     "Cannot select attribute of incomplete type '%s'" 
index 83f0cf039f1990dd1f57b53da1f3bf2f333122c5..6ba8f5437c9574203c68595cd8f6afca4a9b981f 100644 (file)
@@ -684,7 +684,7 @@ class FuncDefNode(StatNode, BlockNode):
 class CFuncDefNode(FuncDefNode):
     #  C function definition.
     #
-    #  modifiers     'inline ' or 'visible' or 'overrideable'
+    #  modifiers     ['inline']
     #  visibility    'private' or 'public' or 'extern'
     #  base_type     CBaseTypeNode
     #  declarator    CDeclaratorNode
@@ -766,7 +766,7 @@ class CFuncDefNode(FuncDefNode):
             storage_class = "%s " % Naming.extern_c_macro
         else:
             storage_class = ""
-        code.putln("%s%s%s {" % (
+        code.putln("%s%s %s {" % (
             storage_class,
             ' '.join(self.modifiers).upper(), # macro forms 
             header))
@@ -1003,13 +1003,14 @@ class DefNode(FuncDefNode):
             self.synthesize_assignment_node(env)
     
     def analyse_default_values(self, env):
+        genv = env.global_scope()
         for arg in self.args:
             if arg.default:
                 if arg.is_generic:
-                    arg.default.analyse_types(env)
-                    arg.default = arg.default.coerce_to(arg.type, env)
-                    arg.default.allocate_temps(env)
-                    arg.default_entry = env.add_default_value(arg.type)
+                    arg.default.analyse_types(genv)
+                    arg.default = arg.default.coerce_to(arg.type, genv)
+                    arg.default.allocate_temps(genv)
+                    arg.default_entry = genv.add_default_value(arg.type)
                     arg.default_entry.used = 1
                 else:
                     error(arg.pos,
@@ -1222,8 +1223,12 @@ class DefNode(FuncDefNode):
         old_type = arg.hdr_type
         new_type = arg.type
         if old_type.is_pyobject:
-            code.putln("assert(%s);" % arg.hdr_cname)
+            if arg.default:
+                code.putln("if (%s) {" % arg.hdr_cname)
+            else:
+                code.putln("assert(%s); {" % arg.hdr_cname)
             self.generate_arg_conversion_from_pyobject(arg, code)
+            code.putln("}")
         elif new_type.is_pyobject:
             self.generate_arg_conversion_to_pyobject(arg, code)
         else:
index 0c556d71f18ebb26ff18fcf405584fbcd6fe9114..4b594367d1e1667f540babc7bcfef3c4bebc7147 100644 (file)
@@ -1209,9 +1209,9 @@ def p_statement(s, level, cdef_flag = 0, visibility = 'private'):
         if level not in ('module', 'module_pxd'):
             s.error("ctypedef statement not allowed here")
         return p_ctypedef_statement(s, level, visibility)
+    overridable = 0
     if s.sy == 'cdef':
         cdef_flag = 1
-        overridable = 0
         s.next()
     if s.sy == 'rdef':
         cdef_flag = 1
index 6748eaa750b2fdbaef7369cf56cf14df0cc6927e..b9a97cf317cc963f32066de144884982baeadc08 100644 (file)
@@ -1104,8 +1104,7 @@ class CClassScope(ClassScope):
     def declare_pyfunction(self, name, pos):
         # Add an entry for a method.
         if name in ('__eq__', '__ne__', '__lt__', '__gt__', '__le__', '__ge__'):
-            error(pos, "Special method %s must be implemented via __richcmp__" 
-% name)
+            error(pos, "Special method %s must be implemented via __richcmp__" % name)
         entry = self.declare_var(name, py_object_type, pos)
         special_sig = get_special_method_signature(name)
         if special_sig: