for name, cname, attribute_types in builtin_structs_table:
scope = StructOrUnionScope(name)
for attribute_name, attribute_type in attribute_types:
- scope.declare_var(
- attribute_name, attribute_type, None, attribute_name)
+ scope.declare_var(attribute_name, attribute_type, None,
+ attribute_name, allow_pyobject=True)
builtin_scope.declare_struct_or_union(
name, "struct", scope, 1, None, cname = cname)
else:
pos_str = u""
cont = u''
- Exception.__init__(self, u'\nError converting Pyrex file to C:\n%s\n%s%s' % (
- cont, pos_str, message))
+ 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))
class CompileWarning(PyrexWarning):
def error(position, message):
#print "Errors.error:", repr(position), repr(message) ###
- err = CompileError(position, message)
+ if position is None:
+ raise InternalError(message)
+ err = CompileError(position, message)
#if position is not None: raise Exception(err) # debug
report_error(err)
return err
names.reverse()
return ".".join(names)
- def setup_errors(self, options):
+ def setup_errors(self, options, result):
if options.use_listing_file:
result.listing_file = Utils.replace_suffix(source, ".lis")
- Errors.open_listing_file(result.listing_file,
- echo_to_stderr = options.errors_to_stderr)
+ path = result.listing_file
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):
source_desc = result.compilation_source.source_desc
else:
pipeline = context.create_pyx_pipeline(options, result)
- context.setup_errors(options)
+ context.setup_errors(options, result)
err, enddata = context.run_pipeline(pipeline, source)
context.teardown_errors(err, options, result)
return result
# know which module it's defined in, it will be imported.
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,
for_display = 0, dll_linkage = None, pyrex = 0, deref = 0):
if pyrex or for_display:
args = type.args
if not args:
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)" %
(args[0].type, name, self.parent_type))
entry = self.lookup_here(name)