develooper Front page | perl.perl5.porters | Postings from October 2003

Re: 5.8.2 perldelta

From:
Stas Bekman
Date:
October 29, 2003 16:18
Subject:
Re: 5.8.2 perldelta
Message ID:
3FA058B9.90905@stason.org
Nicholas Clark wrote:
> On Wed, Oct 29, 2003 at 03:06:35PM -0800, Stas Bekman wrote:
> 
>>Chip Salzenberg wrote:
>>
>>>According to Nicholas Clark:
>>>
>>>
>>>>C<require> should now behave correctly when repeated attempts are made
>>>>to load a file which fails.
>>
>>Hmm, may be this is the problem. Can you please point me to this patch? 
>>Indeed I fail to require the same file twice.
> 
> 
> Nick
> 
> 21415 and 21427 integrated as 21496
> 
> Change 21496 by nicholas@entropy on 2003/10/19 18:31:14

Aha! This is the patch that broke mod_perl 1.0's test suite. Thanks Nick!

I'm going to figure out how to provide you an easy to reproduce code running 
outside mod_perl.

>  Integrate:
>  [ 21415]
>  Subject: [PATCH bleadperl] (was Re: require() does not behave aas documented)
>  From: Rick Delaney <rick@bort.ca>
>  Date: Tue, 23 Sep 2003 12:14:52 -0400
>  Message-ID: <20030923121452.G18845@biff.bort.ca>
>  
>  [ 21427]
>  Subject: Re: require patch breaks locale
>  From: Rick Delaney <rick@bort.ca>
>  Date: Wed, 8 Oct 2003 22:41:55 -0400
>  Message-Id: <20031008224155.A14638@biff.bort.ca>
> 
> Affected files ...
> 
> ... //depot/maint-5.8/perl/pp_ctl.c#39 integrate
> ... //depot/maint-5.8/perl/t/comp/require.t#6 integrate
> 
> Differences ...
> 
> ==== //depot/maint-5.8/perl/pp_ctl.c#39 (text) ====
> 
> @@ -1375,6 +1375,9 @@
>  
>        if (optype == OP_REQUIRE) {
>     char* msg = SvPVx(ERRSV, n_a);
> +               SV *nsv = cx->blk_eval.old_namesv;
> +               (void)hv_store(GvHVn(PL_incgv), SvPVX(nsv), SvCUR(nsv),
> +                               &PL_sv_undef, 0);
>     DIE(aTHX_ "%sCompilation failed in require",
>         *msg ? msg : "Unknown error\n");
>        }
> @@ -2801,7 +2804,7 @@
>    sv_setpv(ERRSV,"");
>      if (yyparse() || PL_error_count || !PL_eval_root) {
>    SV **newsp;   /* Used by POPBLOCK. */
> -  PERL_CONTEXT *cx;
> +       PERL_CONTEXT *cx = &cxstack[cxstack_ix];
>    I32 optype = 0;    /* Might be reset by POPEVAL. */
>    STRLEN n_a;
>    
> @@ -2820,6 +2823,9 @@
>    LEAVE;
>    if (optype == OP_REQUIRE) {
>        char* msg = SvPVx(ERRSV, n_a);
> +           SV *nsv = cx->blk_eval.old_namesv;
> +           (void)hv_store(GvHVn(PL_incgv), SvPVX(nsv), SvCUR(nsv),
> +                          &PL_sv_undef, 0);
>        DIE(aTHX_ "%sCompilation failed in require",
>     *msg ? msg : "Unknown error\n");
>    }
> @@ -3017,9 +3023,12 @@
>    DIE(aTHX_ "Null filename used");
>      TAINT_PROPER("require");
>      if (PL_op->op_type == OP_REQUIRE &&
> -      (svp = hv_fetch(GvHVn(PL_incgv), name, len, 0)) &&
> -      *svp != &PL_sv_undef)
> -  RETPUSHYES;
> +       (svp = hv_fetch(GvHVn(PL_incgv), name, len, 0))) {
> +       if (*svp != &PL_sv_undef)
> +           RETPUSHYES;
> +       else
> +           DIE(aTHX_ "Compilation failed in require");
> +    }
>  
>      /* prepare to compile file */
>  
> 
> ==== //depot/maint-5.8/perl/t/comp/require.t#6 (xtext) ====
> 
> @@ -11,8 +11,8 @@
>  
>  my $Is_EBCDIC = (ord('A') == 193) ? 1 : 0;
>  my $Is_UTF8   = (${^OPEN} || "") =~ /:utf8/;
> -my $total_tests = 30;
> -if ($Is_EBCDIC || $Is_UTF8) { $total_tests = 27; }
> +my $total_tests = 44;
> +if ($Is_EBCDIC || $Is_UTF8) { $total_tests = 41; }
>  print "1..$total_tests\n";
>  
>  sub do_require {
> @@ -108,6 +108,24 @@
>  print "# $@\nnot " unless $@ =~ /did not return a true/;
>  print "ok ",$i++,"\n";
>  
> +print "not " if exists $INC{'bleah.pm'};
> +print "ok ",$i++,"\n";
> +
> +my $flag_file = 'bleah.flg';
> +# run-time error in require
> +for my $expected_compile (1,0) {
> +    write_file($flag_file, 1);
> +    print "not " unless -e $flag_file;
> +    print "ok ",$i++,"\n";
> +    write_file('bleah.pm', "unlink '$flag_file' or die; \$a=0; \$b=1/\$a; 1;\n");
> +    print "# $@\nnot " if eval { require 'bleah.pm' };
> +    print "ok ",$i++,"\n";
> +    print "not " unless -e $flag_file xor $expected_compile;
> +    print "ok ",$i++,"\n";
> +    print "not " unless exists $INC{'bleah.pm'};
> +    print "ok ",$i++,"\n";
> +}
> +
>  # compile-time failure in require
>  do_require "1)\n";
>  # bison says 'parse error' instead of 'syntax error',
> @@ -115,6 +133,20 @@
>  print "# $@\nnot " unless $@ =~ /(syntax|parse) error/mi;
>  print "ok ",$i++,"\n";
>  
> +# previous failure cached in %INC
> +print "not " unless exists $INC{'bleah.pm'};
> +print "ok ",$i++,"\n";
> +write_file($flag_file, 1);
> +write_file('bleah.pm', "unlink '$flag_file'; 1");
> +print "# $@\nnot " if eval { require 'bleah.pm' };
> +print "ok ",$i++,"\n";
> +print "# $@\nnot " unless $@ =~ /Compilation failed/i;
> +print "ok ",$i++,"\n";
> +print "not " unless -e $flag_file;
> +print "ok ",$i++,"\n";
> +print "not " unless exists $INC{'bleah.pm'};
> +print "ok ",$i++,"\n";
> +
>  # successful require
>  do_require "1";
>  print "# $@\nnot " if $@;
> @@ -163,7 +195,11 @@
>  $i++; do_require(bytes_to_utf16('n', qq(print "ok $i\\n"; 1;\n), 1)); # BE
>  $i++; do_require(bytes_to_utf16('v', qq(print "ok $i\\n"; 1;\n), 1)); # LE
>  
> -END { 1 while unlink 'bleah.pm'; 1 while unlink 'bleah.do'; }
> +END {
> +    1 while unlink 'bleah.pm';
> +    1 while unlink 'bleah.do';
> +    1 while unlink 'bleah.flg';
> +}
>  
>  # ***interaction with pod (don't put any thing after here)***
>  


-- 


__________________________________________________________________
Stas Bekman            JAm_pH ------> Just Another mod_perl Hacker
http://stason.org/     mod_perl Guide ---> http://perl.apache.org
mailto:stas@stason.org http://use.perl.org http://apacheweek.com
http://modperlbook.org http://apache.org   http://ticketmaster.com




nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About