gozer 2004/08/09 17:38:36
Modified: . Changes src/modules/perl modperl_filter.c t/filter/TestFilter out_str_eval.pm todo release Log: Filters should not reset $@ if it was already set before invocation. Perl_warn if an filter error occurs while a previous error already existed to avoid completely losing the error message. Reviewed by: stas Revision Changes Path 1.432 +3 -0 modperl-2.0/Changes Index: Changes =================================================================== RCS file: /home/cvs/modperl-2.0/Changes,v retrieving revision 1.431 retrieving revision 1.432 diff -u -r1.431 -r1.432 --- Changes 9 Aug 2004 21:42:34 -0000 1.431 +++ Changes 10 Aug 2004 00:38:35 -0000 1.432 @@ -12,6 +12,9 @@ =item 1.99_15-dev +Filters should not reset $@ if it was already set before +invocation [Gozer] + Apache::compat server_root_relative now correctly handles absolute paths like ap_server_root_relative does [Gozer] 1.94 +35 -0 modperl-2.0/src/modules/perl/modperl_filter.c Index: modperl_filter.c =================================================================== RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_filter.c,v retrieving revision 1.93 retrieving revision 1.94 diff -u -r1.93 -r1.94 --- modperl_filter.c 2 Jun 2004 21:35:58 -0000 1.93 +++ modperl_filter.c 10 Aug 2004 00:38:35 -0000 1.94 @@ -54,6 +54,36 @@ } \ safefree(filter); +/* Save the value of $@ if it was set */ +#define MP_FILTER_SAVE_ERRSV(tmpsv) \ + if (SvTRUE(ERRSV)) { \ + tmpsv = newSVsv(ERRSV); \ + MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT \ + "Saving [EMAIL PROTECTED]'%s'", \ + MP_FILTER_NAME(filter->f), \ + SvPVX(tmpsv) \ + ); \ + } + +/* Restore previously saved value of $@, warning if a new error was generated */ +#define MP_FILTER_RESTORE_ERRSV(tmpsv) \ + if (tmpsv) { \ + if (SvTRUE(ERRSV)) { \ + Perl_warn(aTHX_ "%s", SvPVX(ERRSV)); \ + MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT \ + "error: %s", \ + MP_FILTER_NAME(filter->f), \ + SvPVX(ERRSV) \ + ); \ + } \ + sv_setsv(ERRSV, tmpsv); \ + MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT \ + "Restoring [EMAIL PROTECTED]'%s'", \ + MP_FILTER_NAME(filter->f), \ + SvPVX(tmpsv) \ + ); \ + } + /* this function is for tracing only, it's not optimized for performance */ static int is_modperl_filter(ap_filter_t *f) { @@ -432,6 +462,7 @@ int modperl_run_filter(modperl_filter_t *filter) { AV *args = Nullav; + SV *errsv = Nullsv; int status; modperl_handler_t *handler = ((modperl_filter_ctx_t *)filter->f->ctx)->handler; @@ -443,6 +474,8 @@ MP_dINTERP_SELECT(r, c, s); + MP_FILTER_SAVE_ERRSV(errsv); + modperl_handler_make_args(aTHX_ &args, "Apache::Filter", filter->f, "APR::Brigade", @@ -503,6 +536,8 @@ MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT "return: %d\n", modperl_handler_name(handler), status); + MP_FILTER_RESTORE_ERRSV(errsv); + return status; } 1.4 +2 -3 modperl-2.0/t/filter/TestFilter/out_str_eval.pm Index: out_str_eval.pm =================================================================== RCS file: /home/cvs/modperl-2.0/t/filter/TestFilter/out_str_eval.pm,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- out_str_eval.pm 3 Jul 2004 18:45:46 -0000 1.3 +++ out_str_eval.pm 10 Aug 2004 00:38:35 -0000 1.4 @@ -25,9 +25,8 @@ sub response { my $r = shift; - plan $r, tests => 1, todo => [1]; - # XXX: see if we can fix filter handlers to restore the original - # $@ when the callback completes + plan $r, tests => 1; + # test that filters don't reset $@ eval { i_do_not_exist_really_i_do_not() }; # trigger the filter invocation, before using $@ $r->print("# whatever"); 1.42 +0 -5 modperl-2.0/todo/release Index: release =================================================================== RCS file: /home/cvs/modperl-2.0/todo/release,v retrieving revision 1.41 retrieving revision 1.42 diff -u -r1.41 -r1.42 --- release 9 Aug 2004 21:42:35 -0000 1.41 +++ release 10 Aug 2004 00:38:35 -0000 1.42 @@ -8,11 +8,6 @@ http://marc.theaimsgroup.com/?l=apache-modperl-dev&m=108967266419527&w=2 owner: gozer -* filters reset $@ generated by eval, see if we can fix that. The TODO - test: TestFilter::out_str_eval presents the case - The description is here: - http://marc.theaimsgroup.com/?l=apache-modperl-dev&m=108639632031457&w=2 - * on windows $pool->clean, followed by $pool->destroy breaks other tests See test TestAPR::pool http://marc.theaimsgroup.com/?l=apache-modperl-dev&m=108547894817083&w=2