This Week on perl5-porters - 6-12 March 2006

This Week on perl5-porters - 6-12 March 2006

Larry returns to p5p

Topics of Interest

Routines that accept a file name or a filehandle

Salvador Fandino was trying to override CORE::GLOBAL::stat when he discovered that there is no way to be able to distinguish between a filename 'Foo' and a bareword filehandle Foo.

Salvador patched the prototyping mechanism to permit

  C<sub my_stat (/) {...}>

to mean that a bareword will be converted to a typeglob. Rafael Garcia-Suarez replied that stat already had a prototype of * (star). Salvador showed why that didn't work the way he wanted. Rafael thought that it would be better to fix the '*' prototype rather than introduce a new one, on the basis that replacements of built-ins really are supposed to behave identically the built-ins they are replacing.

Salvador was worried that changing the behaviour of * would introduce backwards compatibility problems, and maintained his / idea. Rafael asked for examples where problems could arise, and remained somewhat unconvinced. Salva showed what the problem was from his perspective, and admitted that his solution was a bit ugly, but couldn't think of anything better, if backwards compatibility were to be maintained.

Nick Ing-Simmons suggested that the replacement do just what stat does -- checks to see whether the string exists as a glob, but Salvador maintained that such a check had the potential for error, and pointed out in the code why things can get messed up.

Nick began to accept the validity of Salva's argument, saying only that he didn't like the choice of / (slash) as the prototype key. H.Merijn Brand ruled out a number of characters that would cause grief for simple-minded syntax highlighters. Nick suggested + (like a star) or ? (conditional globbing could be occurring).

  Who gets the colon?

Overriding filetest operators

Salvador also supplied a patch to allow the filetest operators to be overridden. Given the previous thread about overriding stat, Nick Ing-Simmons wanted to get to the bottom of things and find out what Salvador really needed to do.

It turns out that Salvador is writing a module to manipulate remote file systems transparently via sftp. In the process of doing so he had uncovered various oddities, which was the reason for patches.

Nick and Yitzchak Scott-Thoennes thought that a more promising approach would be to use the IO abstractions available in PerlIO, rather than the approach based on ties that Salva was using.

The thread continued on for quite some time, debating whether or not Perl 5 is an evolving language and whether the prototype scheme was in need of tweaking.

  Ties are out, layers are in

Threads and VMS

We left John E. Malmberg and Craig A. Berry last week trying to build a threaded core that didn't splatter itself out over the landscape. Considerable progress was made this week: John spotted some memory leaks, Craig saw that some memory was being allocated before the threads subsystem was fully operational, which caused grief when that memory was later freeed, since the thread housekeeping code knew nothing about it.

John was still getting some errors in the test suite in the end.

Another problem John ran into was that he was able to provoke Perl_safesysfree into freeing memory allocated by malloc, because a race condition in updating an internal linked list structure. Dave Mitchell thought that the linked lists in question were allocated on a per-thread basis, so they should be safe.

John eventually traced the problem to a completely different piece of code that he had been working on, and therefore suggested that the linked list next and prev pointers be poisoned (that is, overwritten with garbage values) so that the use of already-freed memory would be noticed the first time it was attempted.

  Die fast

Source code analysis with Coverity

Andy Lester had a look at the results of applying Coverity (a static source code analysis tool) to see what came out the other end. He found an unnecessary NULL check in Digest::SHA.

David Dyck looked at a NULL dereference in Zlib.xs and wondered whether it too had unnecessary code guards around it. Marcus Holland-Moritz showed that the checks were indeed necessary. Paul Marquess fixed up his local copy of Compress::Zlib to guard against what Marcus had discovered.

Andy found another code fragment in pp_hot.c that could be tightened up, resulting in a cascade that caused another pointer to go const.

Elsewhere, in toke.c, he pulled some variable declarations down into tighter scopes. In the process of applying the patch, Nicholas discovered another tiny tweak.

  A cycle here, a cycle there

Allocating op-codes from an arena

One of things to do in the huge evergrowing pulsating TODO list is to allocate OPs from an arena. Nicholas Clark thought that there might be a big win due to the resulting simplification of allocation and freeing of ops.

Jim Cromie, who has been spending a lot of time recently on these matters thought that it might be an overall loss, due the fact that the CPU would probably wind up trampling over a far larger section of memory and thus ruining the cache.

All the same, he wrote a patch to allow the arenarisation of op allocations to allow the issue to be explored in more detail.

Mentioning the new constant routines in perlxstut

Achim Grolms filed a bug report after looking at perlxstut should made no mention of new constant subroutine construction mechanism newCONSTSUB. He felt it deserved a mention. Marcus Holland-Moritz told him to send the documentation patches to the list (the maintainer e-mail address in perlxstut was bouncing).

Coroutine support in the perl core

Marc Lehmann, author of the Coro module, had a wishlist of items that, if implemented, would improve the its functionality. Part of the effort of getting Coro to work involves from reusing code from the guts of perl, which leads to problems when said guts undergo changes. Marc was hoping to have something more stable upon which to hang his work.

Nick Ing-Simmons noted the similarities between Marc's needs, and those of threads and wondered whether the current global/interpreter/thread variable model needs a new "coro" category as a subset of thread variables. Marc said that sometimes he needs to copy variables, sometimes he needs to clone them. Nick wondered whether a new "weird" category was also needed. All this probably only makes sense if you understand coroutines already -- I had to reread Dan Sugalski's blog.

Yuval Kogman added his own wishlist to the Coro module: to make them serialisable. Marc was of the opinion that such a thing was theoretically impossible. To do it in practice would involve giving up a certain number of features, such as closures.

Yves Orton said that Data::Dump::Streamer was able to serialise closures, although he wasn't sure whether it was applicable in the current instance. Marc posted a snippet showing that it doesn't work. Things batted back and forth a bit Yves saying it could, Marc saying it couldn't. Looking at the code posted by both Marc and Yves it looks to me as if they're both correct, they're just not talking about the same things.

Yves was showing that it was possible to recreate the universe. March was showing how it's not possible to take something from the universe and then put it back again.

  Dan Sugalski's "What the heck is a coroutine"

Should truncate perform a seek

H.Merijn Brand was having problems with the fact that after truncating a file, the file pointer (à la seek and tell) was now pointing into limbo. This would mean that a subsequent print would create a sparse file. Gellyfish, er, Johnathon Stowe thought that the problem was more one of documentation than implementation.

Gisle Aas produced an explanation that was sufficient to make H.Merijn change his mind.

  Seek and ye shall truncate

Larry's Perl 5 to Perl 5 convertor

In preparation for Perl 6, Larry Wall has been writing a Perl 5 to Perl 5 convertor. Nicholas Clark had the unenviable task of merging Larry's work into blead (in that the code base has moved around around considerably since Larry took a copy to work on). It's now available if you compile with -Dmad (Misc Attribute Decoration -- I suspect we'll be hearing a lot about this in the future).

Alas, the code was not working as expected. After some serious grief and punishment, Nicholas got it all working correctly. Yay!

  They're mad I tell you

Andy cranked up the warn-o-meter and found an uninitialised variable in S_my_kid, but didn't know what to do about it.

Elsewhere (as we segue into what Andy did this week), Andy spotted an inconsistency between embed.fnc and doio.c, where the parameters didn't agree.

And an unnecessary switch was flicked.

Madly duplicated files

Dave Mitchell started to look at the new MAD code and was worried at the presence of files that had been copied and then modified, such as becoming

Dave pleaded for some creative #ifdefing to merge the two files back into one, to avoid them drifting out of sync.

Nicholas Clark tended to agree. So did Larry. It seems that for some files, simple #ifdefs should suffice, but there will be some cases where the only solution is to create a meta-file that can be processed to emit, say, perly.y or madly.y, depending on what the build requires.

  One file to rule them and don't mix

Craig A. Berry was running into trouble following on from change #27453. The two files and map to the same name on a case-insensitive file system, which results in either last-one-standing wins, or infinite loops when synching the blead repository with rsync.

Larry replied that the correct file to use was, the other one can be axed, which is exactly what Nick Clark went ahead and did.

Fixing ExtUtils::Install on Win32

Adam Kennedy reported that his Vanilla Perl, a Windows installer for Perl and MinGW was almost ready, except for a problem with ExtUtils::Install, and the fact that it's difficult to replace a file that is in use. He wanted to know what the status of ExtUtils::Install was, and whether any progress had been made on this front.

Randy Sims said that Yves Orton had done all the necessary footwork, but Michael Schwern is still the putative owner and things are in limbo at the moment, since Michael is apparently lost in the Worlds of Warcraft.

Randy took Yves' second patch and applied it against blead with some minor additions. Yves spotted a couple of problems and Randy promised to fix them up. It all finally wound up looking good.

Paging Mr. Schwern, white courtesy phone.

  Vanilla Perl approaches beta

New and old bugs from RT

perl 5.8.8 build fails at dynaloader (#38687)

Andy Ford posted the tail end of what appeared to be an ordinary build on Linux that died when building dynaloader. No takers. Perhaps Andy didn't post enough of the log for people to figure out what was going wrong.

Test failures on AFS (#38698)

Peter Scott traced a test failure involving sockets back to change #22258.

Pre-extending an array should fill it with undef (#38703)

Marc Lehmann wanted to know where it in the documentation it explains that

  perl -e '@a = (undef); map $_->{x}, @a'

runs without error, but

  perl -e '$#a = 1; map $_->{x}, @a'

dies with a "Modification of a read-only value attempted". He wondered whether they should behave in the same manner. Larry Wall replied saying that it was vaguely implied by reading the documentation for exists, in that it allows for testing for the presence of an element in an array, regardless of whether it is some value or undef.

This in turn permits sparse arrays to be implemented with arrays, and not just with hashes.

Marc more or less agreed, but still had trouble tying it back to pre-extended arrays. Nicholas Clark agreed that the error Marc ran could be interpreted as an artifact of the implementation, and probably should be fixed.

Opening |- triggers unjustified taint check (#38709)

Martin Hasch discovered that opening |- will trigger an $ENV{PATH} taint check, even though no PATH dependency is involved. He noticed that the problem started to occur from 5.8.7 onwards, including blead. Furthermore, he tracked the problem down to what may have been an over-optimisation in doio.c, restored the previous behaviour, and added a couple of tests to ensure it continues to work.

Rick Delaney confirmed Martin's hypothesis, tracing the problem to change #23725, which accidently lost an single character (a !, thus inverting the truth of a conditional).

  For the want of a character, the program was lost

More on the Term::ReadKey/Term::ReadLine bug

Adam Kennedy forwarded the thread to Ilya Zakharevich that Johnathon Stowe started last week, concerning Term::ReadKey and Term::ReadLine on Win32. Ilya said that the bug wasn't in Term::ReadLine, but rather the Windows CON device driver, and suggested where to add a work-around.

Johnathon confirmed that Ilya was correct, and nearly had the bug nailed, except for a nagging problem with carriage returns that remains to be solved.

  Routing around damage

localised stash slices (#38710)

Hugo van der Sanden discovered a way to make localised stash slices go dreadfully wrong, and suggested where to start looking, along with some new tests to guide the way.

  If the tests pass, ship it

Threads calling LWP causes exception (#38712)

Steve Haneman posted a short program demonstrating how LWP, the https protocol and threads do not mix.

Perl5 Bug Summary

  1556 open tickets

  In glorious Technicolor

New Core Modules

In Brief

Continuing on from last week, Jarkko Hietaniemi reported a technique to give Devel::DProf indigestion using XSLoader::load() and its goto &$name trickery.

Marcus Holland-Moritz took DEBUG_LEAKING_SCALARS for a spin. He wrote a short section that leaked an SV and then wondered why he didn't get any debug output. Dave Mitchell showed another snippet that did. Marcus ran Dave's code, which died with a segmentation fault. This led Marcus to ask what the use of it was for.

Tels realised that bug #1808 can be closed, but lacked the necessary auth bit to do so himself

As mentioned last week, Jerry D. Hedden announced that he had completed the preparatory ground work for uploading a version of to CPAN. There's some new functionality in there, plus some documentation and test suite improvements.

Jan Dubois noticed that change #24576 zapped #24576 (which deals with USE_SITECUSTOMIZE). H.Merijn Brand applied a liberal dose of his config-fu to ensure that it sticks around this time.

John E. Malmberg was having test failures with Compress::Zlib. Craig Berry reasoned correctly that the problem was to do with shell redirections. Finally after a certain amount of work, John started from a clean directory tree and achieved success.

Shlomi Fish posted a pathological regular expression pattern in bug #38717 that caused perl to die a horrible death. Yves dissected it neatly, suggesting a couple of ways to make it work faster and not crash perl.

Rafael made a small change in .pmc files in order to help Audrey and the Pugs crowd do some nifty things with precompiled modules. See Module::Compile for more information.

Robert Spier, Hugo and Andy Dougherty weren't too keen on the idea.

About this summary

This summary was written by David Landgren.

Information concerning bugs referenced in this summary (as #nnnnn) may be viewed at

Information concerning patches to maint or blead referenced in this summary (as #nnnnn) may be viewed at

If you want a bookmarklet approach to viewing bugs and change reports, there are a couple of bookmarklets that you might find useful on my page of Perl stuff:

Weekly summaries are published on and posted on a mailing list, (subscription: The archive is at Corrections and comments are welcome.

If you found this summary useful or enjoyable, please consider contributing to the Perl Foundation to help support the development of Perl.