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

Re: perl@16861

Thread Previous | Thread Next
From:
sthoenna
Date:
May 29, 2002 15:54
Subject:
Re: perl@16861
Message ID:
GXV98gzkgW7Y092yn@efn.org
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!

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.

--- 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.

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