From cbcbdc0cd8faa9f40e016fd09620dd8db33d7e8d Mon Sep 17 00:00:00 2001 From: Robert Bradshaw Date: Wed, 10 Oct 2007 23:31:46 -0700 Subject: [PATCH] Minor bug fixes --- Cython/Compiler/ExprNodes.py | 2 ++ Cython/Compiler/Nodes.py | 19 ++++++++++++------- Cython/Compiler/Parsing.py | 2 +- Cython/Compiler/Symtab.py | 3 +-- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index ac3656f7..b0526ef4 100644 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -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'" diff --git a/Cython/Compiler/Nodes.py b/Cython/Compiler/Nodes.py index 83f0cf03..6ba8f543 100644 --- a/Cython/Compiler/Nodes.py +++ b/Cython/Compiler/Nodes.py @@ -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: diff --git a/Cython/Compiler/Parsing.py b/Cython/Compiler/Parsing.py index 0c556d71..4b594367 100644 --- a/Cython/Compiler/Parsing.py +++ b/Cython/Compiler/Parsing.py @@ -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 diff --git a/Cython/Compiler/Symtab.py b/Cython/Compiler/Symtab.py index 6748eaa7..b9a97cf3 100644 --- a/Cython/Compiler/Symtab.py +++ b/Cython/Compiler/Symtab.py @@ -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: -- 2.26.2