Commit 31d3224c authored by Craig Citro's avatar Craig Citro

Make Cython report errors during load, and fix several bugs this uncovered

parent 89c37c3c
...@@ -404,8 +404,8 @@ def init_builtin_structs(): ...@@ -404,8 +404,8 @@ def init_builtin_structs():
for name, cname, attribute_types in builtin_structs_table: for name, cname, attribute_types in builtin_structs_table:
scope = StructOrUnionScope(name) scope = StructOrUnionScope(name)
for attribute_name, attribute_type in attribute_types: for attribute_name, attribute_type in attribute_types:
scope.declare_var( scope.declare_var(attribute_name, attribute_type, None,
attribute_name, attribute_type, None, attribute_name) attribute_name, allow_pyobject=True)
builtin_scope.declare_struct_or_union( builtin_scope.declare_struct_or_union(
name, "struct", scope, 1, None, cname = cname) name, "struct", scope, 1, None, cname = cname)
......
...@@ -43,7 +43,11 @@ class CompileError(PyrexError): ...@@ -43,7 +43,11 @@ class CompileError(PyrexError):
else: else:
pos_str = u"" pos_str = u""
cont = u'' cont = u''
Exception.__init__(self, u'\nError converting Pyrex file to C:\n%s\n%s%s' % ( if position is None:
Exception.__init__(self, message)
else:
Exception.__init__(
self, u'\nError converting Pyrex file to C:\n%s\n%s%s' % (
cont, pos_str, message)) cont, pos_str, message))
class CompileWarning(PyrexWarning): class CompileWarning(PyrexWarning):
...@@ -133,6 +137,8 @@ def report_error(err): ...@@ -133,6 +137,8 @@ def report_error(err):
def error(position, message): def error(position, message):
#print "Errors.error:", repr(position), repr(message) ### #print "Errors.error:", repr(position), repr(message) ###
if position is None:
raise InternalError(message)
err = CompileError(position, message) err = CompileError(position, message)
#if position is not None: raise Exception(err) # debug #if position is not None: raise Exception(err) # debug
report_error(err) report_error(err)
......
...@@ -493,13 +493,14 @@ class Context(object): ...@@ -493,13 +493,14 @@ class Context(object):
names.reverse() names.reverse()
return ".".join(names) return ".".join(names)
def setup_errors(self, options): def setup_errors(self, options, result):
if options.use_listing_file: if options.use_listing_file:
result.listing_file = Utils.replace_suffix(source, ".lis") result.listing_file = Utils.replace_suffix(source, ".lis")
Errors.open_listing_file(result.listing_file, path = result.listing_file
echo_to_stderr = options.errors_to_stderr)
else: else:
Errors.open_listing_file(None) path = None
Errors.open_listing_file(path=path,
echo_to_stderr=options.errors_to_stderr)
def teardown_errors(self, err, options, result): def teardown_errors(self, err, options, result):
source_desc = result.compilation_source.source_desc source_desc = result.compilation_source.source_desc
...@@ -563,7 +564,7 @@ def run_pipeline(source, options, full_module_name = None): ...@@ -563,7 +564,7 @@ def run_pipeline(source, options, full_module_name = None):
else: else:
pipeline = context.create_pyx_pipeline(options, result) pipeline = context.create_pyx_pipeline(options, result)
context.setup_errors(options) context.setup_errors(options, result)
err, enddata = context.run_pipeline(pipeline, source) err, enddata = context.run_pipeline(pipeline, source)
context.teardown_errors(err, options, result) context.teardown_errors(err, options, result)
return result return result
......
...@@ -518,6 +518,14 @@ class PyExtensionType(PyObjectType): ...@@ -518,6 +518,14 @@ class PyExtensionType(PyObjectType):
# know which module it's defined in, it will be imported. # know which module it's defined in, it will be imported.
return self.typeobj_cname is None and self.module_name is not None return self.typeobj_cname is None and self.module_name is not None
def assignable_from(self, src_type):
if self == src_type:
return True
if isinstance(src_type, PyExtensionType):
if src_type.base_type is not None:
return self.assignable_from(src_type.base_type)
return False
def declaration_code(self, entity_code, def declaration_code(self, entity_code,
for_display = 0, dll_linkage = None, pyrex = 0, deref = 0): for_display = 0, dll_linkage = None, pyrex = 0, deref = 0):
if pyrex or for_display: if pyrex or for_display:
......
...@@ -1440,7 +1440,7 @@ class CClassScope(ClassScope): ...@@ -1440,7 +1440,7 @@ class CClassScope(ClassScope):
args = type.args args = type.args
if not args: if not args:
error(pos, "C method has no self argument") error(pos, "C method has no self argument")
elif not args[0].type.same_as(self.parent_type): elif not self.parent_type.assignable_from(args[0].type):
error(pos, "Self argument (%s) of C method '%s' does not match parent type (%s)" % error(pos, "Self argument (%s) of C method '%s' does not match parent type (%s)" %
(args[0].type, name, self.parent_type)) (args[0].type, name, self.parent_type))
entry = self.lookup_here(name) entry = self.lookup_here(name)
......
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