Commit cbcbdc0c authored by Robert Bradshaw's avatar Robert Bradshaw

Minor bug fixes

parent e352a0b3
...@@ -1678,6 +1678,8 @@ class AttributeNode(ExprNode): ...@@ -1678,6 +1678,8 @@ class AttributeNode(ExprNode):
entry = None entry = None
if obj_type.attributes_known(): if obj_type.attributes_known():
entry = obj_type.scope.lookup_here(self.attribute) entry = obj_type.scope.lookup_here(self.attribute)
if entry and entry.is_member:
entry = None
else: else:
error(self.pos, error(self.pos,
"Cannot select attribute of incomplete type '%s'" "Cannot select attribute of incomplete type '%s'"
......
...@@ -684,7 +684,7 @@ class FuncDefNode(StatNode, BlockNode): ...@@ -684,7 +684,7 @@ class FuncDefNode(StatNode, BlockNode):
class CFuncDefNode(FuncDefNode): class CFuncDefNode(FuncDefNode):
# C function definition. # C function definition.
# #
# modifiers 'inline ' or 'visible' or 'overrideable' # modifiers ['inline']
# visibility 'private' or 'public' or 'extern' # visibility 'private' or 'public' or 'extern'
# base_type CBaseTypeNode # base_type CBaseTypeNode
# declarator CDeclaratorNode # declarator CDeclaratorNode
...@@ -766,7 +766,7 @@ class CFuncDefNode(FuncDefNode): ...@@ -766,7 +766,7 @@ class CFuncDefNode(FuncDefNode):
storage_class = "%s " % Naming.extern_c_macro storage_class = "%s " % Naming.extern_c_macro
else: else:
storage_class = "" storage_class = ""
code.putln("%s%s%s {" % ( code.putln("%s%s %s {" % (
storage_class, storage_class,
' '.join(self.modifiers).upper(), # macro forms ' '.join(self.modifiers).upper(), # macro forms
header)) header))
...@@ -1003,13 +1003,14 @@ class DefNode(FuncDefNode): ...@@ -1003,13 +1003,14 @@ class DefNode(FuncDefNode):
self.synthesize_assignment_node(env) self.synthesize_assignment_node(env)
def analyse_default_values(self, env): def analyse_default_values(self, env):
genv = env.global_scope()
for arg in self.args: for arg in self.args:
if arg.default: if arg.default:
if arg.is_generic: if arg.is_generic:
arg.default.analyse_types(env) arg.default.analyse_types(genv)
arg.default = arg.default.coerce_to(arg.type, env) arg.default = arg.default.coerce_to(arg.type, genv)
arg.default.allocate_temps(env) arg.default.allocate_temps(genv)
arg.default_entry = env.add_default_value(arg.type) arg.default_entry = genv.add_default_value(arg.type)
arg.default_entry.used = 1 arg.default_entry.used = 1
else: else:
error(arg.pos, error(arg.pos,
...@@ -1222,8 +1223,12 @@ class DefNode(FuncDefNode): ...@@ -1222,8 +1223,12 @@ class DefNode(FuncDefNode):
old_type = arg.hdr_type old_type = arg.hdr_type
new_type = arg.type new_type = arg.type
if old_type.is_pyobject: 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) self.generate_arg_conversion_from_pyobject(arg, code)
code.putln("}")
elif new_type.is_pyobject: elif new_type.is_pyobject:
self.generate_arg_conversion_to_pyobject(arg, code) self.generate_arg_conversion_to_pyobject(arg, code)
else: else:
......
...@@ -1209,9 +1209,9 @@ def p_statement(s, level, cdef_flag = 0, visibility = 'private'): ...@@ -1209,9 +1209,9 @@ def p_statement(s, level, cdef_flag = 0, visibility = 'private'):
if level not in ('module', 'module_pxd'): if level not in ('module', 'module_pxd'):
s.error("ctypedef statement not allowed here") s.error("ctypedef statement not allowed here")
return p_ctypedef_statement(s, level, visibility) return p_ctypedef_statement(s, level, visibility)
overridable = 0
if s.sy == 'cdef': if s.sy == 'cdef':
cdef_flag = 1 cdef_flag = 1
overridable = 0
s.next() s.next()
if s.sy == 'rdef': if s.sy == 'rdef':
cdef_flag = 1 cdef_flag = 1
......
...@@ -1104,8 +1104,7 @@ class CClassScope(ClassScope): ...@@ -1104,8 +1104,7 @@ class CClassScope(ClassScope):
def declare_pyfunction(self, name, pos): def declare_pyfunction(self, name, pos):
# Add an entry for a method. # Add an entry for a method.
if name in ('__eq__', '__ne__', '__lt__', '__gt__', '__le__', '__ge__'): if name in ('__eq__', '__ne__', '__lt__', '__gt__', '__le__', '__ge__'):
error(pos, "Special method %s must be implemented via __richcmp__" error(pos, "Special method %s must be implemented via __richcmp__" % name)
% name)
entry = self.declare_var(name, py_object_type, pos) entry = self.declare_var(name, py_object_type, pos)
special_sig = get_special_method_signature(name) special_sig = get_special_method_signature(name)
if special_sig: if special_sig:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment