Error reporting
SPL code generation APIs provide four different families
of functions that are related to error reporting. These functions
are the print
, warn
, error
,
and exit
family of functions that are supplied by
the SPL::CodeGen
module.
The print
function takes a format string and zero
or more arguments that are used to customize the format string. It
prints to the standard output. For details of the format string and
the rules that govern substitutions within the format string, refer
to the documentation of the built-in Perl function printf
.
The following is a sample use:
SPL::CodeGen::print("The cost is %6.2f", 499);
There are three other variants of print.println
is
similar to print
, but adds a line at the end. printVerbose
is
similar to print
but only prints if the compiler
is launched with the verbose
option. printlnVerbose
is
the verbose variation that appends a new line at the end.
The warn
function is used to print warnings and
similar to print
it has the ln
and Verbose
variants.
However, it prints to the standard error rather than the standard
output. It also uses the standard SPL compiler output formatting for
warnings and errors. The error
function is similar
to warn
, but is used for errors. It has the ln
variant,
but not the Verbose
one, since errors are not maskable
based on the verbosity setting. If the error
function
is called at least once during the execution of a code generator,
then the exit code for that execution indicates that there were failures. The exit
function
is similar to error
but it exits the code generator
right away after it prints an error message, and the exit code will
indicate that there were failures. It also has an ln
variant.
The built-in Perl function exit
must not be used
for exiting a code generator, but instead SPL::CodeGen::exit
is
used.
The warn
, error
, and exit
functions
take similar arguments as the print
function, but
they also support an optional last argument of type SourceLocation
.
This argument represents the SPL source location of the error or warning. SourceLocation
objects
are available through the getSourceLocation
methods
that are provided by various objects accessible from the $model variable
that represents the operator instance model. The following is an example
use:
<%
my $inputPort = $model->getInputPortAt(0);
my $outputPort = $model->getOutputPortAt(0);
my $inTupleType = $inputPort->getCppTupleType();
my $outTupleType = $outputPort->getCppTupleType();
if($inTupleType ne $outTupleType) {
SPL::CodeGen::exitln("Schema mismatch between input and output ports. " .
"The types are %s and %s, respectively.", $inputPort->getSPLTupleType(),
$outputPort->getSPLTupleType(),
$outputPort->getSourceLocation());
}
%>
And the resulting output:
a.spl:9:5: ERROR: Schema mismatch between input and output ports. The types are
tuple<int a> and tuple<int b>.