cpan/Win32API-File/buffers.h#l244 in perl.git
I'm talking about the above. Original author even says its intended to be a replacement for alloca. Also, someone correct me if I'm wrong, but I've read rumors in Perl's source that SVs can "steal" the strings/PVs of other SVs leaving the source SV undefined. I've seen it on defelem 'y' magic SVs that come in on the Perl Stack. The mess in sv_setsv sv.c#l4227 in perl.git does, sometimes, maybe, steal the PV from source to destination SV. I guess some programmers might be intentionally taking advantage of the fact that mortalized SVs can give up their PVs to a destination SV. For example, in an XSUB with C style data return in parameter scalars, if the C func fails, dont touch the value of the parameter Perl Stack SV, let the mortal SV disappear in the return, or in the croak. The author of Win32API::File obviously isn't doing that since the SV * is tossed leaving only the char */PV around. Remember (not to you BrowserUk), croaks in XS and dies in Perl are implemented using a Perl Stack unwinder (will call DESTROY if objs), and a C Stack unwinder (setjmp/longjmp). If you malloc a block (or new anything in C++), callback into Perl without eval protection and the CV dies, you just leaked memory. Using the sv_grow/mortal macro above would give you a croak safe C++ smart pointer in XS, using alloca would too. The magic system can also cause you to run Perl unintentionally in XS. Not sure if the magic system sets up an eval catch or not if the C func or Perl sub croaks/dies in the magic setter/getter. Not sure what else in the XS/C perl api can croak other than magic SVs and callbacks into Perl. The definition of mortal should be "the caller shall delete the SV if the caller shall not need it when the callee returns to the caller". The warnings about needing to return to Perl or ENTER/LEAVE blocks in perlguts or whereever it is still stands, AKA, never make mortal SVs in a non hard coded iteration loop (while(i<10) is good, while(i<runtimes), while(!exit), while(job = oldjob->Next) is very bad). You'll run out of memory/ "C stack overflow" (but its not a C stack overflow, its heap memory you ran out of). Can you think of any other uses of mortal system? :-)
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.
|