def __init__(self, message):
Exception.__init__(self, "Internal compiler error: %s"
% message)
-
+
+class AbortCompilationError(Exception):
+ """
+ Raised in order to abort compilation.
+ """
listing_file = None
num_errors = 0
echo_file = None
+last_error = None
def open_listing_file(path, echo_to_stderr = 1):
# Begin a new error listing. If path is None, no file
listing_file = None
def report_error(err):
- global num_errors
+ global num_errors, last_error
# See Main.py for why dual reporting occurs. Quick fix for now.
if err.reported: return
err.reported = True
if echo_file:
echo_file.write(line)
num_errors = num_errors + 1
+ last_error = err
def error(position, message):
#print "Errors.error:", repr(position), repr(message) ###
from Buffer import IntroduceBufferAuxiliaryVars
from ModuleNode import check_c_classes
+ def abort_if_errors(t):
+ if Errors.num_errors > 0:
+ raise Errors.AbortCompilationError()
+ return t
+
if pxd:
_check_c_classes = None
_specific_post_parse = PxdPostParse(self)
# (this seems strange -- I believe the right concept is to split
# ModuleNode into a ModuleNode and a CodeGenerator, and tell that
# CodeGenerator to generate code both from the pyx and pxd ModuleNodes.
- stats.append(statlistnode)
- # Until utility code is moved to code generation phase everywhere,
- # we need to copy it over to the main scope
- module_node.scope.utility_code_list.extend(scope.utility_code_list)
+ stats.append(statlistnode)
+ # Until utility code is moved to code generation phase everywhere,
+ # we need to copy it over to the main scope
+ module_node.scope.utility_code_list.extend(scope.utility_code_list)
return module_node
return ([
for phase in pipeline:
if phase is not None:
data = phase(data)
+ print Errors.num_errors
except CompileError, err:
- # err is set
+ print "hello", err
Errors.report_error(err)
- return (err, data)
+ raise err
+ except Errors.AbortCompilationError:
+ print "abort", Errors.num_errors
+ pass
+ print "normal"
+ return data
def find_module(self, module_name,
relative_to = None, pos = None, need_pxd = 1):
if debug_find_module:
print("Context.find_module: Parsing %s" % pxd_pathname)
source_desc = FileSourceDescriptor(pxd_pathname)
- err, result = self.process_pxd(source_desc, scope, module_name)
- if err:
- raise err
- (pxd_codenodes, pxd_scope) = result
+ pxd_codenodes, pxd_scope = self.process_pxd(source_desc, scope, module_name)
self.pxds[module_name] = (pxd_codenodes, pxd_scope)
except CompileError:
pass
except UnicodeDecodeError, msg:
error((source_desc, 0, 0), "Decoding error, missing or incorrect coding=<encoding-name> at top of source (%s)" % msg)
if Errors.num_errors > 0:
- raise CompileError
+ raise Errors.AbortCompilationError()
return tree
def extract_module_name(self, path, options):
else:
Errors.open_listing_file(None)
- def teardown_errors(self, err, options, result):
+ def teardown_errors(self, options, result):
source_desc = result.compilation_source.source_desc
if not isinstance(source_desc, FileSourceDescriptor):
raise RuntimeError("Only file sources for code supported")
Errors.close_listing_file()
result.num_errors = Errors.num_errors
- if result.num_errors > 0:
- err = True
- if err and result.c_file:
+ if result.num_errors > 0 and result.c_file:
try:
Utils.castrate_file(result.c_file, os.stat(source_desc.filename))
except EnvironmentError:
pipeline = context.create_pyx_pipeline(options, result)
context.setup_errors(options)
- err, enddata = context.run_pipeline(pipeline, source)
- context.teardown_errors(err, options, result)
+ try:
+ enddata = context.run_pipeline(pipeline, source)
+ except Errors.CompileError:
+ pass
+ except Errors.AbortCompilationError:
+ pass
+ context.teardown_errors(options, result)
return result
#------------------------------------------------------------------------