develooper Front page | perl.perl5.porters | Postings from May 2002

Re: perl@16861

Thread Previous | Thread Next
From:
Jarkko Hietaniemi
Date:
May 29, 2002 16:01
Subject:
Re: perl@16861
Message ID:
20020530020114.Y30595@alpha.hut.fi
On Wed, May 29, 2002 at 03:27:18PM -0700, Yitzchak Scott-Thoennes wrote:
> In article <20020529175206.B30595@alpha.hut.fi>,
> Jarkko Hietaniemi <jhi@iki.fi> wrote:
> >	http://www.iki.fi/jhi/perl@16861.tgz
> >	http://www.iki.fi/jhi/perl@16861.tbz
> >
> >	ftp://ftp.funet.fi/pub/languages/perl/snap/perl@16861.tgz
> >	ftp://ftp.funet.fi/pub/languages/perl/snap/perl@16861.tbz
> >
> >  	ftp.funet.fi::perlsnap
> >
> >Reminder: 5.8.0 RC1 Saturday the 1st of June.
> >
> >Todo:
> > 
> >- MM 6 syncup [Michael]
> >- Test::Harness syncup [Michael]
> >
> >Nice:
> >
> >- VMS PERLIO=perlio [Craig, NI-S]
> >- VMS socket trouble README.vms addition [Peter]
> >- Math::Big*, big* bugs [Tels] (ETA Thursday)
> >- ithreads XS docs [Arthur]
> >- sporadic lib/Memoize/t/expfile.t failures [mjd]
> 
> You've let self-ties fall off the list!

I lost faith after both you and NI-S seemed rather, err, lost.

Remember, at some point WE MUST STOP PATCHING.

> Patch:
> correctly croaks on aggregate self-ties
> restores sv_magic call to 5.6.1 state to fix scalar/IO self-ties
> restores the tie.t test to before the Great Retraction.
> (plus spelling bee, plus TODO failing test).
> 
> Only run through minitest so far.
> 
> Left to do: fix self-tied globs :(
> My current thought on this is to 1) move the tie magic back onto the GV
> or 2) require self-tied globs to use weakrefs, croaking if they don't.

If I don't have working tested patches by Thursday evening, no go.
(I said earlier Friday evening, but NI-S talked some sense to me.)
Core *.c patches must be in the Friday morning snapshot.

> --- perlo/pp_sys.c	Tue May 28 17:51:32 2002
> +++ perl/pp_sys.c	Wed May 29 14:24:24 2002
> @@ -828,11 +828,11 @@
>  	sv_unmagic(varsv, how);
>  	/* Croak if a self-tie on an aggregate is attempted. */
>  	if (varsv == SvRV(sv) &&
> -	    (SvTYPE(sv) == SVt_PVAV ||
> -	     SvTYPE(sv) == SVt_PVHV))
> +	    (SvTYPE(varsv) == SVt_PVAV ||
> +	     SvTYPE(varsv) == SVt_PVHV))
>  	    Perl_croak(aTHX_
>  		       "Self-ties of arrays and hashes are not supported");
> -	sv_magic(varsv, sv, how, Nullch, 0);
> +	sv_magic(varsv, (SvRV(sv) == varsv ? Nullsv : sv), how, Nullch, 0);
>      }
>      LEAVE;
>      SP = PL_stack_base + markoff;
> --- perlo/t/op/tie.t	Wed May 29 13:33:50 2002
> +++ perl/t/op/tie.t	Wed May 29 15:19:10 2002
> @@ -1,9 +1,13 @@
>  #!./perl
>  
> -# This test harness will (eventually) test the "tie" functionality
> -# without the need for a *DBM* implementation.
> -
> -# Currently it only tests the untie warning
> +# Add new tests to the end with format:
> +# ########
> +#
> +# # test description
> +# Test code
> +# EXPECT
> +# Warn or die msgs (if any) at - line 1234
> +#
>  
>  chdir 't' if -d 't';
>  @INC = '../lib';
> @@ -11,29 +15,23 @@
>  
>  $|=1;
>  
> -# catch warnings into fatal errors
> -$SIG{__WARN__} = sub { die "WARNING: @_" } ;
> -$SIG{__DIE__}  = sub { die @_ };
> -
>  undef $/;
> -@prgs = split "\n########\n", <DATA>;
> -print "1..", scalar @prgs, "\n";
> +@prgs = split /^########\n/m, <DATA>;
>  
> +require './test.pl';
> +plan(tests => scalar @prgs);
>  for (@prgs){
> -    my($prog,$expected) = split(/\nEXPECT\n/, $_);
> -    eval "$prog" ;
> -    $status = $?;
> -    $results = $@ ;
> +    ++$i;
> +    my($prog,$expected) = split(/\nEXPECT\n/, $_, 2);
> +    print("not ok $i # bad test format\n"), next
> +        unless defined $expected;
> +    my ($testname) = $prog =~ /^# (.*)\n/m;
> +    $testname ||= '';
> +    $TODO = $testname =~ s/^TODO //;
>      $results =~ s/\n+$//;
>      $expected =~ s/\n+$//;
> -    if ( $status or $results and $results !~ /^(WARNING: )?$expected/){
> -	print STDERR "STATUS: $status\n";
> -	print STDERR "PROG: $prog\n";
> -	print STDERR "EXPECTED:\n$expected\n";
> -	print STDERR "GOT:\n$results\n";
> -	print "not ";
> -    }
> -    print "ok ", ++$i, "\n";
> +
> +    fresh_perl_is($prog, $expected, {}, $testname);
>  }
>  
>  __END__
> @@ -106,7 +104,7 @@
>  $a = tie %h, Tie::StdHash;
>  untie %h;
>  EXPECT
> -untie attempted while 1 inner references still exist
> +untie attempted while 1 inner references still exist at - line 6.
>  ########
>  
>  # strict behaviour, with 1 extra references via tied generating an error
> @@ -116,7 +114,7 @@
>  $a = tied %h;
>  untie %h;
>  EXPECT
> -untie attempted while 1 inner references still exist
> +untie attempted while 1 inner references still exist at - line 7.
>  ########
>  
>  # strict behaviour, with 1 extra references which are destroyed
> @@ -145,7 +143,7 @@
>  $b = tied %h ;
>  untie %h;
>  EXPECT
> -untie attempted while 2 inner references still exist
> +untie attempted while 2 inner references still exist at - line 7.
>  ########
>  
>  # strict behaviour, check scope of strictness.
> @@ -162,56 +160,30 @@
>  untie %H;
>  EXPECT
>  ########
> +
>  # Forbidden aggregate self-ties
> -my ($a, $b) = (0, 0);
>  sub Self::TIEHASH { bless $_[1], $_[0] }
> -sub Self::DESTROY { $b = $_[0] + 1; }
>  {
> -    my %c = 42;
> +    my %c;
>      tie %c, 'Self', \%c;
>  }
>  EXPECT
> -Self-ties of arrays and hashes are not supported
> +Self-ties of arrays and hashes are not supported at - line 6.
>  ########
> +
>  # Allowed scalar self-ties
> -my ($a, $b) = (0, 0);
> +my $destroyed = 0;
>  sub Self::TIESCALAR { bless $_[1], $_[0] }
> -sub Self::DESTROY   { $b = $_[0] + 1; }
> +sub Self::DESTROY   { $destroyed = 1; }
>  {
>      my $c = 42;
> -    $a = $c + 0;
>      tie $c, 'Self', \$c;
>  }
> -die unless $a == 0 && $b == 43;
> -EXPECT
> -########
> -# Interaction of tie and vec
> -
> -my ($a, $b);
> -use Tie::Scalar;
> -tie $a,Tie::StdScalar or die;
> -vec($b,1,1)=1;
> -$a = $b;
> -vec($a,1,1)=0;
> -vec($b,1,1)=0;
> -die unless $a eq $b;
> +die "self-tied scalar not DESTROYed" unless $destroyed == 1;
>  EXPECT
>  ########
> -# An attempt at lvalueable barewords broke this
> -
> -tie FH, 'main';
> -EXPECT
>  
> -########
> -# correct unlocalisation of tied hashes (patch #16431)
> -use Tie::Hash ;
> -tie %tied, Tie::StdHash;
> -{ local $hash{'foo'} } warn "plain hash bad unlocalize" if exists $hash{'foo'};
> -{ local $tied{'foo'} } warn "tied hash bad unlocalize" if exists $tied{'foo'};
> -{ local $ENV{'foo'}  } warn "%ENV bad unlocalize" if exists $ENV{'foo'};
> -EXPECT
> -########
> -# Allowed glob self-ties
> +# TODO Allowed glob self-ties
>  my $destroyed = 0;
>  my $printed   = 0;
>  sub Self2::TIEHANDLE { bless $_[1], $_[0] }
> @@ -241,3 +213,30 @@
>  EXPECT
>  ########
>  
> +# Interaction of tie and vec
> +
> +my ($a, $b);
> +use Tie::Scalar;
> +tie $a,Tie::StdScalar or die;
> +vec($b,1,1)=1;
> +$a = $b;
> +vec($a,1,1)=0;
> +vec($b,1,1)=0;
> +die unless $a eq $b;
> +EXPECT
> +########
> +
> +# correct unlocalisation of tied hashes (patch #16431)
> +use Tie::Hash ;
> +tie %tied, Tie::StdHash;
> +{ local $hash{'foo'} } warn "plain hash bad unlocalize" if exists $hash{'foo'};
> +{ local $tied{'foo'} } warn "tied hash bad unlocalize" if exists $tied{'foo'};
> +{ local $ENV{'foo'}  } warn "%ENV bad unlocalize" if exists $ENV{'foo'};
> +EXPECT
> +########
> +
> +# An attempt at lvalueable barewords broke this
> +tie FH, 'main';
> +EXPECT
> +Can't modify constant item in tie at - line 3, near "'main';"
> +Execution of - aborted due to compilation errors.
> End of Patch.

-- 
$jhi++; # http://www.iki.fi/jhi/
        # There is this special biologist word we use for 'stable'.
        # It is 'dead'. -- Jack Cohen

Thread Previous | Thread Next


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