You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@lucy.apache.org by Marvin Humphrey <ma...@rectangular.com> on 2011/01/07 04:31:41 UTC
[lucy-dev] Error reporting in allot_params
Greets,
The main function we use for converting named arguments in Perl-space to
variables in C-space is XSBind_allot_params(), located in
trunk/perl/xs/XSBind.c. For the Python people out there, allot_params()
vaguely resembles the PyArg_Parse* functions documented at
<http://docs.python.org/py3k/c-api/arg.html#api-functions> and
<http://docs.python.org/py3k/extending/extending.html>. (There is no analogue
in the Perl C API.)
There are two improvements I have in mind for allot_params(). The first has
to do with error reporting.
If allot_params() discovers one of the following problems, it throws an
exception:
* Unrecognized parameter name.
* Odd number of arguments (i.e. not key-value pairs).
* Missing parameter name hash.
However, the resulting stack trace does not include the name of the method
where the error occurred. It mentions allot_params(), but it does not mention
the XS binding caller:
Invalid parameter: 'bogus'
cfish_XSBind_allot_params at xs/XSBind.c line 408
at foo.t line 5
If we change allot_params() to return false and store an exception object in
Err_error on failure, then the calling code can RETHROW the exception...
bool_t args_ok = XSBind_allot_params( &(ST(0)), 1,
items, "Lucy::Search::IndexSearcher::new_PARAMS",
&index_sv, "index", 5,
NULL);
if (!args_ok) {
RETHROW(INCREF(Err_get_error()));
}
... so that we see its location in the stack trace instead.
Invalid parameter: 'bogus'
cfish_XSBind_allot_params at xs/XSBind.c line 408
XS_Lucy_Search_IndexSearcher_new at lib/Lucy.xs line 1647
at foo.t line 5
"XS_Lucy_Search_IndexSearcher_new" isn't quite as good as
"Lucy::Search::IndexSearcher::new", but it's better than nothing.
The second improvement I have in mind is to give allot_params() significantly
more responsibility with regards to extracting values. I'll explain the
details in a separate email.
Marvin Humphrey
Re: [lucy-dev] Error reporting in allot_params
Posted by Peter Karman <pe...@peknet.com>.
Marvin Humphrey wrote on 1/6/11 9:31 PM:
> If we change allot_params() to return false and store an exception object in
> Err_error on failure, then the calling code can RETHROW the exception...
>
> bool_t args_ok = XSBind_allot_params( &(ST(0)), 1,
> items, "Lucy::Search::IndexSearcher::new_PARAMS",
> &index_sv, "index", 5,
> NULL);
> if (!args_ok) {
> RETHROW(INCREF(Err_get_error()));
> }
>
> ... so that we see its location in the stack trace instead.
>
> Invalid parameter: 'bogus'
> cfish_XSBind_allot_params at xs/XSBind.c line 408
> XS_Lucy_Search_IndexSearcher_new at lib/Lucy.xs line 1647
> at foo.t line 5
>
> "XS_Lucy_Search_IndexSearcher_new" isn't quite as good as
> "Lucy::Search::IndexSearcher::new", but it's better than nothing.
>
+1
--
Peter Karman . http://peknet.com/ . peter@peknet.com