# # Pyrex - Errors # import sys from Pyrex.Utils import open_new_file warnings_issued = {} class PyrexError(EnvironmentError): pass class CompileError(PyrexError): def __init__(self, position = None, message = ""): self.position = position if position: pos_str = "%s:%d:%d: " % position else: pos_str = "" PyrexError.__init__(self, pos_str + message) class InternalError(Exception): # If this is ever raised, there is a bug in the compiler. def __init__(self, message): Exception.__init__(self, "Internal compiler error: %s" % message) listing_file = None num_errors = 0 echo_file = None def open_listing_file(path, echo_to_stderr = 1): # Begin a new error listing. If path is None, no file # is opened, the error counter is just reset. global listing_file, num_errors, echo_file if path is not None: listing_file = open_new_file(path) else: listing_file = None if echo_to_stderr: echo_file = sys.stderr else: echo_file = None num_errors = 0 def close_listing_file(): global listing_file if listing_file: listing_file.close() listing_file = None def report(position, message): err = CompileError(position, message) line = "%s\n" % err if listing_file: listing_file.write(line) if echo_file: echo_file.write(line) return err def warning(position, message): return report(position, "Warning: %s" % message) def one_time_warning(position, key, message): if key not in warnings_issued: warnings_issued[key] = 1 warning(position, message) def error(position, message): global num_errors num_errors = num_errors + 1 return report(position, message)