New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Data::Dumper -- dumping large hash returns empty string, segfaults perl #10292
Comments
From @sitaramcCreated by @sitaramcI'm the author of a little tool called "gitolite" which is basically an access The basic mode of operation of gitolite is that whenever the ACL rules change, This dumping seems to fail if the hash is too large and you have a custom sort for my $key (sort keys %repos) { Finally, this seems to happen only when the program builds up the hash step by http://github.com/sitaramc/gitolite/raw/temp-br--data-dumper-problem-demo/data-dumper-returns-undef.pl Perl Info
|
From @avarThanks for the report. I'm attaching a copy of your test script for reference. I can confirm that this happens in 5.10.1 and blead. Perl segfaults in (gdb) bt full At that point Perl is working with a scalar that seems corrupted. It (gdb) p SvFLAGS(ref) & SVf_ROK (Equivalent to SvRV() but gdb doesn't grok it): (gdb) p ref->sv_u.svu_rv Or in another session: (gdb) p ref->sv_u.svu_rv Or: (gdb) p target Which then segfaults on: SvOBJECT(SvRV(ref)) |
The RT System itself - Status changed from 'new' to 'open' |
From @avarOn Fri, Apr 9, 2010 at 15:31, Ævar Arnfjörð Bjarmason <avarab@gmail.com> wrote:
It's OK in 5.8.9, but bisecting below 5.10.0 is too much of a PITA due |
From @avarOn Fri, Apr 9, 2010 at 17:13, Ævar Arnfjörð Bjarmason <avarab@gmail.com> wrote:
Fixed those: d7aa538 is the first bad commit Final version object core patch? p4raw-id: //depot/perl@23190 :100644 100644 2c6641d6f6a9947812cd4c2b3801159ae717ba92 |
From @cpansproutData_Dumper_Dumpxs is missing a SPAGAIN after the call to DD_dump. It |
From @cpansproutInline Patchdiff -Nurp blead/dist/Data-Dumper/Dumper.xs blead-74170/dist/Data-Dumper/Dumper.xs
--- blead/dist/Data-Dumper/Dumper.xs 2010-04-15 12:45:10.000000000 -0700
+++ blead-74170/dist/Data-Dumper/Dumper.xs 2010-05-12 22:31:57.000000000 -0700
@@ -1192,6 +1192,10 @@ Data_Dumper_Dumpxs(href, ...)
postav, &level, indent, pad, xpad, newapad, sep, pair,
freezer, toaster, purity, deepcopy, quotekeys,
bless, maxdepth, sortkeys);
+ /* DD_dump might have called a custom sort routine that
+ might have reallocated the stack (see
+ [perl #74170]). */
+ SPAGAIN;
if (indent >= 2 && !terse)
SvREFCNT_dec(newapad);
diff -Nurp blead/dist/Data-Dumper/t/perl-74170.t blead-74170/dist/Data-Dumper/t/perl-74170.t
--- blead/dist/Data-Dumper/t/perl-74170.t 1969-12-31 16:00:00.000000000 -0800
+++ blead-74170/dist/Data-Dumper/t/perl-74170.t 2010-05-12 22:25:45.000000000 -0700
@@ -0,0 +1,143 @@
+#!perl -X
+#
+# Regression test for [perl #74170] (missing SPAGAIN after DD_Dump(...)):
+# Since it’s so large, it gets its own file.
+
+BEGIN {
+ require Config; import Config;
+ no warnings 'once';
+ if ($Config{'extensions'} !~ /\bData\/Dumper\b/) {
+ print "1..0 # Skip: Data::Dumper was not built\n";
+ exit 0;
+ }
+}
+
+use strict;
+use Test::More tests => 1;
+use Data::Dumper;
+
+our %repos = ();
+&real_life_setup();
+
+$Data::Dumper::Indent = 1;
+# A custom sort sub is necessary for reproducing the bug, as this is where
+# the stack gets reallocated.
+$Data::Dumper::Sortkeys = sub { return [ reverse sort keys %{$_[0]} ]; }
+ unless exists $ENV{NO_SORT_SUB};
+
+ok +Data::Dumper->Dumpxs([\%repos], [qw(*repos)]);
+
+sub real_life_setup {
+ # set up the %repos hash in a manner that reflects a real run of
+ # gitolite's "compiler" script:
+ # Yes, all this is necessary to get the stack in such a state that the
+ # custom sort sub will trigger a reallocation.
+ push @{ $repos{''}{'@all'} }, ();
+ push @{ $repos{''}{'guser86'} }, ();
+ push @{ $repos{''}{'guser87'} }, ();
+ push @{ $repos{''}{'user88'} }, ();
+ push @{ $repos{''}{'grussell'} }, ();
+ push @{ $repos{''}{'guser0'} }, ();
+ push @{ $repos{''}{'guser1'} }, ();
+ push @{ $repos{''}{'guser10'} }, ();
+ push @{ $repos{''}{'guser11'} }, ();
+ push @{ $repos{''}{'guser12'} }, ();
+ push @{ $repos{''}{'guser13'} }, ();
+ push @{ $repos{''}{'guser14'} }, ();
+ push @{ $repos{''}{'guser15'} }, ();
+ push @{ $repos{''}{'guser16'} }, ();
+ push @{ $repos{''}{'guser17'} }, ();
+ push @{ $repos{''}{'guser18'} }, ();
+ push @{ $repos{''}{'guser19'} }, ();
+ push @{ $repos{''}{'guser2'} }, ();
+ push @{ $repos{''}{'guser20'} }, ();
+ push @{ $repos{''}{'guser21'} }, ();
+ push @{ $repos{''}{'guser22'} }, ();
+ push @{ $repos{''}{'guser23'} }, ();
+ push @{ $repos{''}{'guser24'} }, ();
+ push @{ $repos{''}{'guser25'} }, ();
+ push @{ $repos{''}{'guser26'} }, ();
+ push @{ $repos{''}{'guser27'} }, ();
+ push @{ $repos{''}{'guser28'} }, ();
+ push @{ $repos{''}{'guser29'} }, ();
+ push @{ $repos{''}{'guser3'} }, ();
+ push @{ $repos{''}{'guser30'} }, ();
+ push @{ $repos{''}{'guser31'} }, ();
+ push @{ $repos{''}{'guser32'} }, ();
+ push @{ $repos{''}{'guser33'} }, ();
+ push @{ $repos{''}{'guser34'} }, ();
+ push @{ $repos{''}{'guser35'} }, ();
+ push @{ $repos{''}{'guser36'} }, ();
+ push @{ $repos{''}{'guser37'} }, ();
+ push @{ $repos{''}{'guser38'} }, ();
+ push @{ $repos{''}{'guser39'} }, ();
+ push @{ $repos{''}{'guser4'} }, ();
+ push @{ $repos{''}{'guser40'} }, ();
+ push @{ $repos{''}{'guser41'} }, ();
+ push @{ $repos{''}{'guser42'} }, ();
+ push @{ $repos{''}{'guser43'} }, ();
+ push @{ $repos{''}{'guser44'} }, ();
+ push @{ $repos{''}{'guser45'} }, ();
+ push @{ $repos{''}{'guser46'} }, ();
+ push @{ $repos{''}{'guser47'} }, ();
+ push @{ $repos{''}{'guser48'} }, ();
+ push @{ $repos{''}{'guser49'} }, ();
+ push @{ $repos{''}{'guser5'} }, ();
+ push @{ $repos{''}{'guser50'} }, ();
+ push @{ $repos{''}{'guser51'} }, ();
+ push @{ $repos{''}{'guser52'} }, ();
+ push @{ $repos{''}{'guser53'} }, ();
+ push @{ $repos{''}{'guser54'} }, ();
+ push @{ $repos{''}{'guser55'} }, ();
+ push @{ $repos{''}{'guser56'} }, ();
+ push @{ $repos{''}{'guser57'} }, ();
+ push @{ $repos{''}{'guser58'} }, ();
+ push @{ $repos{''}{'guser59'} }, ();
+ push @{ $repos{''}{'guser6'} }, ();
+ push @{ $repos{''}{'guser60'} }, ();
+ push @{ $repos{''}{'guser61'} }, ();
+ push @{ $repos{''}{'guser62'} }, ();
+ push @{ $repos{''}{'guser63'} }, ();
+ push @{ $repos{''}{'guser64'} }, ();
+ push @{ $repos{''}{'guser65'} }, ();
+ push @{ $repos{''}{'guser66'} }, ();
+ push @{ $repos{''}{'guser67'} }, ();
+ push @{ $repos{''}{'guser68'} }, ();
+ push @{ $repos{''}{'guser69'} }, ();
+ push @{ $repos{''}{'guser7'} }, ();
+ push @{ $repos{''}{'guser70'} }, ();
+ push @{ $repos{''}{'guser71'} }, ();
+ push @{ $repos{''}{'guser72'} }, ();
+ push @{ $repos{''}{'guser73'} }, ();
+ push @{ $repos{''}{'guser74'} }, ();
+ push @{ $repos{''}{'guser75'} }, ();
+ push @{ $repos{''}{'guser76'} }, ();
+ push @{ $repos{''}{'guser77'} }, ();
+ push @{ $repos{''}{'guser78'} }, ();
+ push @{ $repos{''}{'guser79'} }, ();
+ push @{ $repos{''}{'guser8'} }, ();
+ push @{ $repos{''}{'guser80'} }, ();
+ push @{ $repos{''}{'guser81'} }, ();
+ push @{ $repos{''}{'guser82'} }, ();
+ push @{ $repos{''}{'guser83'} }, ();
+ push @{ $repos{''}{'guser84'} }, ();
+ push @{ $repos{''}{'guser85'} }, ();
+ push @{ $repos{''}{'guser9'} }, ();
+ push @{ $repos{''}{'user1'} }, ();
+ push @{ $repos{''}{'user10'} }, ();
+ push @{ $repos{''}{'user11'} }, ();
+ push @{ $repos{''}{'user12'} }, ();
+ push @{ $repos{''}{'user13'} }, ();
+ push @{ $repos{''}{'user14'} }, ();
+ push @{ $repos{''}{'user15'} }, ();
+ push @{ $repos{''}{'user16'} }, ();
+ push @{ $repos{''}{'user2'} }, ();
+ push @{ $repos{''}{'user3'} }, ();
+ push @{ $repos{''}{'user4'} }, ();
+ push @{ $repos{''}{'user5'} }, ();
+ push @{ $repos{''}{'user6'} }, ();
+ push @{ $repos{''}{'user7'} }, ();
+ $repos{''}{R}{'user8'} = 1;
+ $repos{''}{W}{'user8'} = 1;
+ push @{ $repos{''}{'user8'} }, ();
+}
--- blead/MANIFEST 2010-04-26 02:44:11.000000000 -0700
+++ blead-74170/MANIFEST 2010-05-12 22:30:08.000000000 -0700
@@ -2614,6 +2614,7 @@ dist/Data-Dumper/t/freezer.t See if $Dat
dist/Data-Dumper/Todo Data pretty printer, futures
dist/Data-Dumper/t/overload.t See if Data::Dumper works for overloaded data
dist/Data-Dumper/t/pair.t See if Data::Dumper pair separator works
+dist/Data-Dumper/t/perl-74170.t Regression test for [perl #74170]
dist/Data-Dumper/t/terse.t See if Data::Dumper terse option works
dist/ExtUtils-Install/Changes ExtUtils-Install change log
dist/ExtUtils-Install/lib/ExtUtils/Installed.pm Information on installed extensions |
From @tseeHi, Father Chrysostomos wrote:
thanks for the patch! Unfortunately, I see some test failures when Test Summary Report op/stash.t (Wstat: ../cpan/CGI/t/http.t (Wstat: Non-zero exit status: 1 ../cpan/ExtUtils-MakeMaker/t/min_perl_version.t (Wstat: Non-zero exit status: 1 ../cpan/ExtUtils-MakeMaker/t/prereq_print.t (Wstat: Non-zero exit status: 1 ../cpan/Test-Simple/t/explain.t (Wstat: Non-zero exit status: 2 Files=1806, Tests=358509, 437 wallclock secs (100.08 usr 7.54 sys + The CGI failure is not relevant (CGI.pm test bug related to environment). The Test::Simple one reads: ===( 109147;321 2298/? 1/5 0/? )==================================== # Failed test at t/explain.t line 25. # Structures begin differing at: # $got->[0] = undef # $expected->[0] = ARRAY(0x2299e40) # Failed test at t/explain.t line 27. MakeMaker: # Failed test 'prereqs dumped' # at t/prereq_print.t line 53. # Structures begin differing at: # $got = undef # $expected = HASH(0x28c5478) ===( 22895;210 8/11 7/912 1/13 ../cpan/ExtUtils-MakeMaker/t/prereq_print.t ....................... Failed 1/11 subtests more of the same: # Failed test ' and talking like we expect' # at t/min_perl_version.t line 120. # $BUILD_REQUIRES = {}; ../cpan/IO-Compress/t/010examples-bzip2.t ......................... ok ===( 17695;198 6/8 26/33 ../cpan/ExtUtils-MakeMaker/t/min_perl_version.t ................... Failed 1/33 subtests (less 3 skipped subtests: 29 okay) Before applying the patch, these all passed (minus CGI.pm). Could you have a look at these? Best regards, |
From @tonycozOn Sun May 16 18:03:05 2010, sprout@cpan.org wrote:
When applied to blead several tests that otherwise pass, fail: Script started on Mon 17 May 2010 22:07:20 EST ok 16 - PREREQ_PRINT exiting normally # Failed test 'prereqs dumped' # Failed test at t/explain.t line 25. # Failed test at t/explain.t line 27. Test Summary Report ../cpan/ExtUtils-MakeMaker/t/min_perl_version.t (Wstat: 256 Tests: 33 Script done on Mon 17 May 2010 22:07:57 EST |
From @cpansproutOn May 17, 2010, at 4:53 AM, Steffen Mueller wrote:
Ah, I should have run all of perl’s tests, not just DD’s. Attached is a new patch, which works this time (hopefully), and also |
From @cpansproutInline Patchdiff -Nurp blead/dist/Data-Dumper/Dumper.xs blead-74170/dist/Data-Dumper/Dumper.xs
--- blead/dist/Data-Dumper/Dumper.xs 2010-04-15 12:45:10.000000000 -0700
+++ blead-74170/dist/Data-Dumper/Dumper.xs 2010-05-17 09:50:17.000000000 -0700
@@ -1133,6 +1133,7 @@ Data_Dumper_Dumpxs(href, ...)
valstr = newSVpvn("",0);
for (i = 0; i <= imax; ++i) {
SV *newapad;
+ I32 diff;
av_clear(postav);
if ((svp = av_fetch(todumpav, i, FALSE)))
@@ -1188,10 +1189,16 @@ Data_Dumper_Dumpxs(href, ...)
else
newapad = apad;
+ diff = SP - PL_stack_sp;
DD_dump(aTHX_ val, SvPVX_const(name), SvCUR(name), valstr, seenhv,
postav, &level, indent, pad, xpad, newapad, sep, pair,
freezer, toaster, purity, deepcopy, quotekeys,
bless, maxdepth, sortkeys);
+ /* DD_dump might have called a custom sort routine that
+ might have reallocated the stack (see
+ [perl #74170]). */
+ SPAGAIN;
+ SP += diff;
if (indent >= 2 && !terse)
SvREFCNT_dec(newapad);
diff -Nurp blead/dist/Data-Dumper/t/dumper.t blead-74170/dist/Data-Dumper/t/dumper.t
--- blead/dist/Data-Dumper/t/dumper.t 2009-11-19 08:51:38.000000000 -0800
+++ blead-74170/dist/Data-Dumper/t/dumper.t 2010-05-17 12:43:32.000000000 -0700
@@ -83,7 +83,7 @@ sub SKIP_TEST {
$Data::Dumper::Useperl = 1;
if (defined &Data::Dumper::Dumpxs) {
print "### XS extension loaded, will run XS tests\n";
- $TMAX = 363; $XS = 1;
+ $TMAX = 366; $XS = 1;
}
else {
print "### XS extensions not loaded, will NOT run XS tests\n";
@@ -1429,4 +1429,13 @@ EOT
TEST q(Data::Dumper->Dumpxs([\@foo])) if $XS;
}
+############# 364
+# Make sure $obj->Dumpxs returns the right thing in list context. This was
+# broken by the initial attempt to fix [perl #74170].
+$WANT = <<'EOT';
+#$VAR1 = [];
+EOT
+TEST q(join " ", new Data::Dumper [[]],[] =>->Dumpxs),
+ '$obj->Dumpxs in list context'
+ if $XS;
diff -Nurp blead/dist/Data-Dumper/t/perl-74170.t blead-74170/dist/Data-Dumper/t/perl-74170.t
--- blead/dist/Data-Dumper/t/perl-74170.t 1969-12-31 16:00:00.000000000 -0800
+++ blead-74170/dist/Data-Dumper/t/perl-74170.t 2010-05-12 22:25:45.000000000 -0700
@@ -0,0 +1,143 @@
+#!perl -X
+#
+# Regression test for [perl #74170] (missing SPAGAIN after DD_Dump(...)):
+# Since it’s so large, it gets its own file.
+
+BEGIN {
+ require Config; import Config;
+ no warnings 'once';
+ if ($Config{'extensions'} !~ /\bData\/Dumper\b/) {
+ print "1..0 # Skip: Data::Dumper was not built\n";
+ exit 0;
+ }
+}
+
+use strict;
+use Test::More tests => 1;
+use Data::Dumper;
+
+our %repos = ();
+&real_life_setup();
+
+$Data::Dumper::Indent = 1;
+# A custom sort sub is necessary for reproducing the bug, as this is where
+# the stack gets reallocated.
+$Data::Dumper::Sortkeys = sub { return [ reverse sort keys %{$_[0]} ]; }
+ unless exists $ENV{NO_SORT_SUB};
+
+ok +Data::Dumper->Dumpxs([\%repos], [qw(*repos)]);
+
+sub real_life_setup {
+ # set up the %repos hash in a manner that reflects a real run of
+ # gitolite's "compiler" script:
+ # Yes, all this is necessary to get the stack in such a state that the
+ # custom sort sub will trigger a reallocation.
+ push @{ $repos{''}{'@all'} }, ();
+ push @{ $repos{''}{'guser86'} }, ();
+ push @{ $repos{''}{'guser87'} }, ();
+ push @{ $repos{''}{'user88'} }, ();
+ push @{ $repos{''}{'grussell'} }, ();
+ push @{ $repos{''}{'guser0'} }, ();
+ push @{ $repos{''}{'guser1'} }, ();
+ push @{ $repos{''}{'guser10'} }, ();
+ push @{ $repos{''}{'guser11'} }, ();
+ push @{ $repos{''}{'guser12'} }, ();
+ push @{ $repos{''}{'guser13'} }, ();
+ push @{ $repos{''}{'guser14'} }, ();
+ push @{ $repos{''}{'guser15'} }, ();
+ push @{ $repos{''}{'guser16'} }, ();
+ push @{ $repos{''}{'guser17'} }, ();
+ push @{ $repos{''}{'guser18'} }, ();
+ push @{ $repos{''}{'guser19'} }, ();
+ push @{ $repos{''}{'guser2'} }, ();
+ push @{ $repos{''}{'guser20'} }, ();
+ push @{ $repos{''}{'guser21'} }, ();
+ push @{ $repos{''}{'guser22'} }, ();
+ push @{ $repos{''}{'guser23'} }, ();
+ push @{ $repos{''}{'guser24'} }, ();
+ push @{ $repos{''}{'guser25'} }, ();
+ push @{ $repos{''}{'guser26'} }, ();
+ push @{ $repos{''}{'guser27'} }, ();
+ push @{ $repos{''}{'guser28'} }, ();
+ push @{ $repos{''}{'guser29'} }, ();
+ push @{ $repos{''}{'guser3'} }, ();
+ push @{ $repos{''}{'guser30'} }, ();
+ push @{ $repos{''}{'guser31'} }, ();
+ push @{ $repos{''}{'guser32'} }, ();
+ push @{ $repos{''}{'guser33'} }, ();
+ push @{ $repos{''}{'guser34'} }, ();
+ push @{ $repos{''}{'guser35'} }, ();
+ push @{ $repos{''}{'guser36'} }, ();
+ push @{ $repos{''}{'guser37'} }, ();
+ push @{ $repos{''}{'guser38'} }, ();
+ push @{ $repos{''}{'guser39'} }, ();
+ push @{ $repos{''}{'guser4'} }, ();
+ push @{ $repos{''}{'guser40'} }, ();
+ push @{ $repos{''}{'guser41'} }, ();
+ push @{ $repos{''}{'guser42'} }, ();
+ push @{ $repos{''}{'guser43'} }, ();
+ push @{ $repos{''}{'guser44'} }, ();
+ push @{ $repos{''}{'guser45'} }, ();
+ push @{ $repos{''}{'guser46'} }, ();
+ push @{ $repos{''}{'guser47'} }, ();
+ push @{ $repos{''}{'guser48'} }, ();
+ push @{ $repos{''}{'guser49'} }, ();
+ push @{ $repos{''}{'guser5'} }, ();
+ push @{ $repos{''}{'guser50'} }, ();
+ push @{ $repos{''}{'guser51'} }, ();
+ push @{ $repos{''}{'guser52'} }, ();
+ push @{ $repos{''}{'guser53'} }, ();
+ push @{ $repos{''}{'guser54'} }, ();
+ push @{ $repos{''}{'guser55'} }, ();
+ push @{ $repos{''}{'guser56'} }, ();
+ push @{ $repos{''}{'guser57'} }, ();
+ push @{ $repos{''}{'guser58'} }, ();
+ push @{ $repos{''}{'guser59'} }, ();
+ push @{ $repos{''}{'guser6'} }, ();
+ push @{ $repos{''}{'guser60'} }, ();
+ push @{ $repos{''}{'guser61'} }, ();
+ push @{ $repos{''}{'guser62'} }, ();
+ push @{ $repos{''}{'guser63'} }, ();
+ push @{ $repos{''}{'guser64'} }, ();
+ push @{ $repos{''}{'guser65'} }, ();
+ push @{ $repos{''}{'guser66'} }, ();
+ push @{ $repos{''}{'guser67'} }, ();
+ push @{ $repos{''}{'guser68'} }, ();
+ push @{ $repos{''}{'guser69'} }, ();
+ push @{ $repos{''}{'guser7'} }, ();
+ push @{ $repos{''}{'guser70'} }, ();
+ push @{ $repos{''}{'guser71'} }, ();
+ push @{ $repos{''}{'guser72'} }, ();
+ push @{ $repos{''}{'guser73'} }, ();
+ push @{ $repos{''}{'guser74'} }, ();
+ push @{ $repos{''}{'guser75'} }, ();
+ push @{ $repos{''}{'guser76'} }, ();
+ push @{ $repos{''}{'guser77'} }, ();
+ push @{ $repos{''}{'guser78'} }, ();
+ push @{ $repos{''}{'guser79'} }, ();
+ push @{ $repos{''}{'guser8'} }, ();
+ push @{ $repos{''}{'guser80'} }, ();
+ push @{ $repos{''}{'guser81'} }, ();
+ push @{ $repos{''}{'guser82'} }, ();
+ push @{ $repos{''}{'guser83'} }, ();
+ push @{ $repos{''}{'guser84'} }, ();
+ push @{ $repos{''}{'guser85'} }, ();
+ push @{ $repos{''}{'guser9'} }, ();
+ push @{ $repos{''}{'user1'} }, ();
+ push @{ $repos{''}{'user10'} }, ();
+ push @{ $repos{''}{'user11'} }, ();
+ push @{ $repos{''}{'user12'} }, ();
+ push @{ $repos{''}{'user13'} }, ();
+ push @{ $repos{''}{'user14'} }, ();
+ push @{ $repos{''}{'user15'} }, ();
+ push @{ $repos{''}{'user16'} }, ();
+ push @{ $repos{''}{'user2'} }, ();
+ push @{ $repos{''}{'user3'} }, ();
+ push @{ $repos{''}{'user4'} }, ();
+ push @{ $repos{''}{'user5'} }, ();
+ push @{ $repos{''}{'user6'} }, ();
+ push @{ $repos{''}{'user7'} }, ();
+ $repos{''}{R}{'user8'} = 1;
+ $repos{''}{W}{'user8'} = 1;
+ push @{ $repos{''}{'user8'} }, ();
+} |
From @tonycozOn Sun, May 23, 2010 at 01:55:08PM -0700, Father Chrysostomos wrote:
Couldn't that just be: PUTBACK; ? Tony |
From @cpansproutI forgot to CC this to the list. Begin forwarded message:
|
From @tonycozOn Tue, Jun 15, 2010 at 07:11:43PM -0700, Father Chrysostomos wrote:
Could someone with a better internals understanding take a look at I wouldn't expect any problems with a simple PUTBACK/SPAGAIN, but then Tony |
@rafl - Status changed from 'open' to 'resolved' |
From @tonycozOn Tue, Jun 15, 2010 at 07:11:43PM -0700, Father Chrysostomos wrote:
I applied the PUTBACK/SPAGAIN alternative as e3ec229 and your tests Parameters supplied to a function are delimited by PUSHMARK(), which If you were wondering there were two reasons I didn't want to apply a) it seemed over complex b) it used an I32 offset, which could be a problem in the future with Tony |
Migrated from rt.perl.org#74170 (status was 'resolved')
Searchable as RT74170$
The text was updated successfully, but these errors were encountered: