summaryrefslogtreecommitdiff
path: root/pp_hot.c
Commit message (Collapse)AuthorAgeFilesLines
* [perl #92290, #92406] Returning a pad var from lv subFather Chrysostomos2011-06-071-2/+10
| | | | | | | | | | | | | | | | | | This fixes a recent (post-5.14.0) regression. Commit bf8fb5e (the fix for #62498) introduced it for lvalue subs with no return statement [perl #92406]. Commit fa1e92c (the fix for #72724) introduced it for lvalue subs that do have an explicit return [perl #92290]. Simply returning a scalar itself from an lvalue sub does not work if it is a pad variable with a reference count of 1. In that circum- stance, the sub-popping code sees that the SV can be re-used the next time the sub is called, so it undefines it and hangs on to it. So the scalar returned gets emptied before the calling code can see it. The reference count has to be increased temporarily, which sv_2mortal and SvREFCNT_inc combined accomplish.
* Allow lvalue subs to return COWs in reference contextFather Chrysostomos2011-06-041-1/+3
| | | | | | | | | | | (That’s ‘reference’ as in ‘pass by reference’. It applies to foo(lvalue_func()) and for(lvalue_func()).) Commit f71f472 took care of scalar context. Commit a0aa607 came and long and took care of list context, but, unfortunately, missed reference context. This commit takes care of that.
* Fix several array-returning bugs in lvalue subsFather Chrysostomos2011-06-041-24/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | This finishes fixing bug #23790. When called in reference context (for(...) or map $_, ...), lvalue subs returning arrays or hashes would return the AV or HV itself, as though it were lvalue context. The result was that $_ would be bound to an AV or HV, which is not supposed to happen, as it’s a scalar (that’s when you start getting ‘Bizarre copy’ errors). Commit 91e34d82 fixed this in pp_leavesublv, but the if condition it added was placed outside the loop, so it only applied when the array was the first thing returned. It also did not take hashes into account. By changing the lvalue-context check in pp_padav, pp_padhv and pp_rv2av (which also serves as pp_rv2hv), I was able to apply a more general fix, which also fix another bug: Those array and hash ops were croaking when called in scalar reference context (...->$method). Because it is no longer part of the sub-leaving code, explicitly returning an array in reference context works now, too. This commit also eliminates the code added by 91e34d82, as it’s no longer necessary.
* [perl #7946] Lvalue subs do not autovivifyFather Chrysostomos2011-06-031-1/+26
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This commit makes autovivification work with lvalue subs. It follows the same technique used by other autovivifiable ops (aelem, helem, tc.), except that, due to flag constraints, it uses a single flag and instead checks the op tree at run time to find out what sort of thing to vivify. The flag constraints are that these two flags: #define OPpENTERSUB_HASTARG 32 /* Called from OP tree. */ #define OPpENTERSUB_NOMOD 64 /* Immune to op_lvalue() for :attrlist. */ conflict with these: #define OPpDEREF (32|64) /* autovivify: Want ref to something: */ #define OPpDEREF_AV 32 /* Want ref to AV. */ #define OPpDEREF_HV 64 /* Want ref to HV. */ #define OPpDEREF_SV (32|64) /* Want ref to SV. */ Renumbering HASTARG and NOMOD is problematic, as there are places in op.c that change entersubs into rv2cvs, and the entersub and rv2cv flags would conflict. Setting the flags correctly when changing the type is hard and would result in subtle bugs if not done perfectly. Ops like ${...} don’t actually autovivify; it’s the op inside that does it. In those cases, the parent op is flagged with OPpDEREFed, and it skips get-magic, as it has already been called by the inner op. Since entersub is now marked as being an autovivifying op, ${...} in lvalue context ends up skipping get-magic if there is a foo() inside. And this affects even regular subs. So pp_leavesub and pp_return have to call get-magic; hence the new tests in gmagic.t.
* [perl #62498] Scalar context breaks lvalue subsFather Chrysostomos2011-06-011-23/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | That RT ticket reported that a $ prototype puts an implicit scalar() on its argument, and that scalar(lvalue()) causes the function to return a temporary value. In particular: ${\scalar($_)} = 1; # ok ${\scalar f()} = 1; # no effect (where f is an lvalue sub that returns $_). It turns out that this does not only affect scalar(), but also || and &&: ${\($_ && undef)} = 3; # ok ${\(f() && undef)} = 3; # no effect Also, that comment in pp_leavesublv about f()->meth() not being lvalue context is wrong, as $o->${\sub { $_[0] = "whatever" }}; assigns to $o, and sub UNIVERSAL::undef { undef $_[0] } allows calls like $x->undef to undefine $x, if it contains an object or package name. Since copying values in rvalue context is wasteful anyway, since the definition of rvalue context is that the value is going to be copied (resulting in *two* copies), the easiest solution is not to copy val- ues in rvalue context. This ends up applying to what I call ‘reference’ context (semi-lvalue, or potential lvalue) as well. This works already with explicit return. As a bonus, this also fixes bug #78680, for which there are already to-do tests that were added before the bug was reported. See also: http://www.nntp.perl.org/group/perl.perl5.porters/;msgid=20060118203058.GQ616@plum.flirble.org
* Warn when list-assigning to TEMPFather Chrysostomos2011-06-011-0/+8
|
* Make empty lvalue subs work correctlyFather Chrysostomos2011-05-311-3/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | | In perl 5.8.1 and earlier, sub{} would return @_ in list context. This was fixed in 5.8.2 for regular subs, but not lvalue subs. Before the syntactic restriction on return values was removed in commit 145b2bb, there was a bug affecting compilation of empty subs before any use statement: $ perl5.14.0 -e 'sub foo :lvalue {}' Can't modify stub in lvalue subroutine return at -e line 1, near "{}" Execution of -e aborted due to compilation errors. $ perl5.14.0 -le 'use sigtrap; sub foo :lvalue {} print "ok"' ok But I digress. :-) Up to 5.14, lvalue subs were still returning @_, or, rather, the ele- ments of @_ as separate scalars: $ perl5.14.0 -Mre -le '(sub :lvalue {}->($a,$b))=(3,4); print "$a $b"' Useless use of "re" pragma at -e line 0 3 4 (Not exactly useless, eh? The -Mre allows the sub to compile.) This commit fixes that bug.
* Allow lvalue subs to return TEMPsFather Chrysostomos2011-05-311-4/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This is perhaps not ideal, but it fixes (or allows to be fixed) seve- ral bugs. I was hoping that the cases that this perhaps erroneously allows through would fall back to the warning I added in commit 8fe85e3, but, unfortunately, in all these cases the refcount is greater than 1 when pp_sassign is reached. To be less vague: ‘foo() = 3’ warns if foo() returns a TEMP with no set-magic and a refcount of 1 (meaning it will be freed shortly). But truly temporary values returned by pure-Perl lvalue subs have a refer- ence count of at least 2, and as many entries on the mortals stack. I cannot distinguish between truly temporary values and those that are but nominally temporary (marked TEMP because the refcount will go down, but not to zero) by checking for a refcount <= 2 in pp_sassign, because this example returns with a refcount of 2: +sub :lvalue { return delete($_[0]), $x }->($x) = 3; # returns a TEMP There’s no logical reason why that shouldn’t work, if this does: +sub :lvalue { return foo(), $x }->($x) = 3; # not TEMP as they are conceptually identical. The advantages to this change: • The delete example above will work. • It allows XS lvalue subs that return TEMPs to work in the debugger [perl #71172], restoring the bug fix that b724cc1 implemented but c73030b reverted. • It makes these three cases identical, as they should be. Note that only two of them return TEMPs: +sub :lvalue { return shift }->($x) = 3; +sub :lvalue { \@_; return shift }->($x) = 3; # returns a TEMP +sub :lvalue { return delete $_[0] }->($x) = 3; # returns a TEMP So I think the advantages outweigh the disadvantages.
* Revert "Allow returning of temps and ro’s from lv subs"Father Chrysostomos2011-05-311-2/+19
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This reverts commit b724cc14b25929aee44eee20bd26102cceb520b6. Lvalue subroutines are more of a mess than I realised when I made that commit. I just tried removing the syntactical restriction on what the last statement or the argument to return can be in an lvalue sub. It opened a whole can of worms. PADTMPs are bizarre creatures that have somewhat erratic behaviour. Since assigning to a PADTMP is almost always a mistake (since the value will definitely be discarded), those *should* be disallowed, when the sub is called in lvalue context. That also avoids propagating a whole load of bugs when referencing PADTMPs, aliasing to them, etc. Read-only scalars end up triggering a ‘Modification of a read-only value attempted’ message without the restrictions in pp_leavesublv, but the message the latter was providing (which this revert restores) is clearer (‘Can't return a readonly value from lvalue subroutine’). Speaking of lvalue context, there are three types of context with regard to lvalue-ness (orthogonal to the usual void/scalar/list contexts): • rvalue context ($x = func()) • lvalue context (func() = $x) • semi-lvalue context (\func()) Each is handle by a separate code path in pp_leavesublv: • rvalue context - any value can be returned; it’s copied (waste- ful, perhaps?) • semi-lvalue context - any value can be returned; it’s not copied • lvalue context - stringent rules about what can and cannot be returned (which this revert restores) So it is perfectly fine to restrict what can be returned from an lvalue sub *in true lvalue context*, without affected rvalue use. Now, regarding TEMPs, although this commit restores the restriction on returning TEMPs, a forthcoming commit will relax that restriction once more, since it causes bugs.
* Allow lvalue subs to return COWs in list contextFather Chrysostomos2011-05-301-1/+5
| | | | Commit f71f472 missed list assignment. :-(
* Allow returning of temps and ro’s from lv subsFather Chrysostomos2011-05-301-19/+2
| | | | | | | | | | | | This commit removes the restriction on returning temps and read-only scalars from lvalue subs that occurs when the sub returns implicitly (with no ‘return’ statement; ‘return’ has never had that restriction). It does not actually help pure-Perl lvalue subs much yet, as op.c still enforces lvalue syntax on the last statement. But this should fix bug #71172, allowing XS lvalue subs to work under the debugger.
* [perl #31946] Warn when assigning to a TEMPFather Chrysostomos2011-05-301-0/+7
| | | | | | | | | | | | | | This is the first step in downgrading a fatal error (Can't return a temporary from lvalue subroutine) to a warning. Currently only XS lvalue routines that return TEMPs and pure-Perl lvalue routines that use explicit return (which don’t quite work properly yet anyway, despite commit fa1e92c) are affected by this. This is implemented in pp_sassign and pp_aassign, rather than pp_leavesublv, so it will affect explicit returns and so it will be skipped for overloaded ‘.=’, etc. Thanks to Craig DeForest for suggesting how to do this.
* Clean: Actually use HvUSEDKEYS() instead of HvKEYS()Michael Witten2011-05-181-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This: commit 8aacddc1ea3837f8f1a911d90c644451fc7cfc86 Author: Nick Ing-Simmons <nik@tiuk.ti.com> Date: Tue Dec 18 15:55:22 2001 +0000 Tidied version of Jeffrey Friedl's <jfriedl@yahoo.com> restricted hashes - added delete of READONLY value inhibit & test for same - re-tabbed p4raw-id: //depot/perlio@13760 essentially deprecated HvKEYS() in favor of HvUSEDKEYS(); this is explained in line 144 (now 313) of file `hv.h': /* * HvKEYS gets the number of keys that actually exist(), and is provided * for backwards compatibility with old XS code. The core uses HvUSEDKEYS * (keys, excluding placeholdes) and HvTOTALKEYS (including placeholders) */ This commit simply puts that into practice, and is equivalent to running the following (at least with a35ef416833511da752c4b5b836b7a8915712aab checked out): git grep -l HvKEYS | sed /hv.h/d | xargs sed -i s/HvKEYS/HvUSEDKEYS/ Notice that HvKEYS is currently just an alias for HvUSEDKEYS: $ git show a35ef416833511da752c4b5b836b7a8915712aab:hv.h | sed -n 318p #define HvKEYS(hv) HvUSEDKEYS(hv) According to `make tests': All tests successful.
* Remove unnecessary code from pp_addFather Chrysostomos2011-04-081-13/+0
| | | | | This code, added recently in 4c3ac4b and amended in 837c879, has been unnecessary since commit 75ea7a1.
* Remove unnecessary code from pp_eqFather Chrysostomos2011-04-081-12/+0
| | | | | This code, added recently in 7d779b2, has been unnecessary since com- mit 75ea7a1.
* [perl #87708] $tied == $tiedFather Chrysostomos2011-04-071-0/+12
| | | | | | | | | | | | | | | | | | This is only part of #87708. This fixes the + operator outside of any ‘use integer’ scope when the same tied scalar is used for both operands and returns two different values. Before this commit, get-magic would be called only once and the same value used. In 5.12.x it just worked. I tried modifying pp_eq throughout to take this case into account, but it made the most common cases slightly slower, presumably because of the extra checks. So this follows the same temp sv method that I used for pp_add (in 4c3ac4b and 837c879), which, though slowing down this edge cases due to the extra allocation, leaves the most common cases just as fast. (And, in case my benchmarks were unreliably [not unlikely], this method is also safer, as it has less chance of getting different code paths wrong.)
* Correct stupidities in 4c3ac4bFather Chrysostomos2011-04-061-2/+5
| | | | | | | Allocating an extra SV for rare edge cases...er...only needs to be done in those rare edge cases. Uninitialized warnings are only supposed to be enabled when they are.
* [perl #87708] $tied + $tiedFather Chrysostomos2011-04-061-0/+10
| | | | | | | | | This is just part of #87708. This fixes the + operator outside of any ‘use integer’ when the same tied scalar is used for both operands and returns two different val- ues. Before this commit, get-magic would be called only once and the same value used. In 5.12.x it worked.
* [perl #82111] de-pessimise some my @array = ...David Mitchell2011-03-121-1/+12
| | | | | | | | | | | | | Due to obscure closure and goto tricks, it's sometimes possible for the array or hash in the LHS of 'my @a = ...' and 'my %h = ...' to be non-empty. At compile-time, these conditions are detected and the assign op is compiled with the OPpASSIGN_COMMON, making the assignment slower. This commit speeds it up again by adding a run-time check to pp_aassign to only do the OPpASSIGN_COMMON code-branch if the LHS isn't an empty array or hash. See also #70171.
* Stop aelemfast from crashing on GVs with null AVsFather Chrysostomos2011-02-261-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | As reported at nntp://nntp.perl.org/1298599236.4753.72.camel@p100 (and respaced for readability): #!perl5.12.0 $r=q/ print __FILE__; local *dbline = $main::{"_<".__FILE__}; print $dbline[0] /; eval $r;' __END__ (eval 1) Bus error This only seems to happen in non-threaded perls. It can be reduced to this: *d = *a; print $d[0]; The $d[0] is optimised into an aelemfast op (instead of the usual aelem with an rv2av kid). pp_aelemfast is at fault, as evidenced by the fact that this does not crash (the ${\...} prevents the optimisation): *d = *a; print $d[${\0}]; pp_aelemfast uses GvAV instead of GvAVn. Usually $d[0] will autovivify @d, but the glob assignment leaves $d[0] pointing to a glob (*d) with no array. Then pp_alemfast passes a null pointer around.
* pp_subst: eliminate 'matched' local varDavid Mitchell2011-02-181-5/+3
|
* taint REGEX SVs as well as refs to themDavid Mitchell2011-02-181-1/+3
| | | | | | | | | | | Now that REGEX is actually a first-class SV type, we can taint the regex SV directly, as well as the RV pointing to it. This means that this now taints: $rr = qr/$tainted/; $r = $$r; /$r/;
* pp_subst: exit earlier after failed matchDavid Mitchell2011-02-181-9/+10
| | | | | | | | If the match fails, don't bother to execute some code that prepares the source and replacement strings for a substitution (e.g. matching UTF8-ness). (This is an enhancement to ff6e92e827a143094fdf3af374056b524759194b)
* tweak the new pattern taint descriptionDavid Mitchell2011-02-181-10/+11
|
* document how tainting works with pattern matchingDavid Mitchell2011-02-161-1/+70
|
* fix many s/// tainting bugsDavid Mitchell2011-02-161-18/+51
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This is a re-implementation of the tainting code in pp_subst and pp_substcont. Although this fixes many bugs, because its a de-novo rewrite of the tainting parts of the code in those two functions, it's quite possible that it breaks some existing tainting behaviour. It doesn't break any existing tests, although it turns out that this area was severely under-tested anyway. The main bugs that this commit fixes are as follows, where: T = a tainted value L = pattern tainted by locale (e.g. use locale; s/\w//) Happens both with and without 'use re taint' unless specified. Happens with all modifiers (/g, /r etc) unless explicitly mentioned. $1 unexpectedly untainted: s/T// T =~ s/// under use re 'taint' original string unexpectedly untainted: s/L//, s/L//g return value unexpectedly untainted: T =~ s///g under no re 'taint' s/L//g, s/L//r return value unexpectedly tainted: s/T// s//T/r under no re 'taint' T =~ s/// under use re 'taint' s//T/ under use re 'taint' Also, with /ge, the original string becomes tainted as soon as possible (usually in the second entry to the /e code block) rather than only at the end, in code like $orig =~ s/T/...code.../ge The rationale behind the taintedness of the return value of s/// (in the non /r case), is that a boolean value shouldn't be tainted. This corresponds to the general perl tainting policy that boolean ops don't return tainted values. On the other hand, when it returns an integer (number of matches), that should be tainted. A couple of note about the old tainting code this replaces: firstly, several occurrences of the following were NOOPs, since rxtainted was U8 and the bit being ored was > 256: rxtainted |= RX_MATCH_TAINTED(rx) secondly, removing a whole bunch of the following didn't make any existing tests fail: TAINT_IF(rxtainted & 1);
* pp_match: indent label slightlyDavid Mitchell2011-02-161-1/+1
| | | | | 'play_it_again:' was on column 0, which meant that most diff utilities interpreted it as a function name.
* pp_subst: move a common block outside an if/thenDavid Mitchell2011-02-061-18/+8
| | | | | The last few commits have been working towards making two blocks of code identical. Now it's payback time!
* pp_subst: do SvUTF8_on next to the SvPOK_only_UTF8David Mitchell2011-02-061-2/+2
| | | | | | This should leave things functionally unchanged. This is another step in making two branches of code more identical
* fix a s/non-utf8/is-utf8/ bit of nastinessDavid Mitchell2011-02-061-2/+3
| | | | | | | | | | | | | Commit 3e462cdc2087ddf90984010fabd80c30db92bfa0 provided a fix for the s/non-utf8/is-utf8/ case by upgrading TARG to UTF8 after the match, but before the substitution. It used sv_utf8_upgrade() rather than sv_utf8_upgrade_nomg(), so for example, with a tied variable, FETCH would get called again, and all the char* pointers such as s would be left dangling. If the length of the string was unchanged, the code wouldn't notice this. Fix by using the _nomg() variant, and by checking whether the string has been reallocated
* pp_subst: remove a superflous PUTBACK/SPAGAINDavid Mitchell2011-02-061-5/+1
| | | | | | | These were added around a mg_set() call before the stack-of-stacks mechanism was introduced, which has made them redundant. This is another step in making two branches of code more identical
* pp_subtr: preserve UTF8 flag in rare casesDavid Mitchell2011-02-061-1/+1
| | | | | | | | | | | | There are two main branches in pp_subtr(): the 'in-place' and the other, depending on whether the replacement string is short enough to be inserted directly. Commit 80b498e0aacf413fb7460d6882a74c68c1f9df48 back in 2000 changed a SvPOK_only() to a SvPOK_only_UTF8() to preserve the UTF8 bit, but only on *one* branch. Add the change to the other branch too. This will only make a difference in rare cases involving 'use bytes' (where it's arguably broken and generating malformed utf8 anyway); but the main reason for doing it is to allow soon for some identical code in the two branches to be de-duplicated.
* pp_subst: move a bock of code to to decrease gotosDavid Mitchell2011-02-061-8/+7
|
* pp_subst: compact a couple of PUSHes using ?:David Mitchell2011-02-061-8/+2
|
* pp_subst: remove a duplicate labelDavid Mitchell2011-02-061-2/+1
| | | | (both nope: and ret_no: labelled the same chunk of exit code)
* pp_subst: exit as soon as !matchDavid Mitchell2011-02-061-6/+5
| | | | | ... rather than messing about first deciding whether to process a successful match inline or not
* pp_substr: combine two identical blocks of codeDavid Mitchell2011-02-061-9/+2
|
* fix a confusing open scope in pp_substDavid Mitchell2011-01-301-1/+2
| | | | just a white space change
* regen/opcode.pl should only generate prototypes for pp_* functions that exist.Nicholas Clark2011-01-091-1/+1
| | | | | | | It now generates prototypes for all functions that implement OPs. Hence Perl_unimplemented_op no longer needs a special-case prototype. As it is now generating a prototype for Perl_do_kv, no need for regen/embed.pl to duplicate this. Convert the last two users of the macro do_kv() to Perl_do_kv(aTHX).
* Generate pp_* prototypes in pp_proto.h, and remove pp.symNicholas Clark2011-01-091-1/+1
| | | | | | | | | | | Eliminate the #define pp_foo Perl_pp_foo(pTHX) macros, and update the 13 locations that relied on them. regen/opcode.pl now generates prototypes for the PP functions directly, into pp_proto.h. It no longer writes pp.sym, and regen/embed.pl no longer reads this, removing the only ordering dependency in the regen scripts. opcode.pl is now responsible for prototypes for pp_* functions. (embed.pl remains responsible for ck_* functions, reading from regen/opcodes)
* Fix typos (spelling errors) in Perl sources.Peter J. Acklam) (via RT2011-01-071-1/+1
| | | | | | | | | # New Ticket Created by (Peter J. Acklam) # Please include the string: [perl #81904] # in the subject line of all future correspondence about this issue. # <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=81904 > Signed-off-by: Abigail <abigail@abigail.be>
* Convert tied READLINE to using Perl_tied_method()Nicholas Clark2011-01-051-12/+6
|
* Convert tied PRINT to using Perl_tied_method()Nicholas Clark2011-01-051-16/+5
| | | | | Add a flag TIED_METHOD_SAY to Perl_tied_method(), to allow tied PRINT to effect C<local $\ = "\n";> within the ENTER/LEAVE pair of Perl_tied_method().
* Reindent pp_rv2avVincent Pit2011-01-031-31/+31
|
* GvIO(gv) returns NULL for a NULL gv, so refactor to take advantage of this.Nicholas Clark2011-01-021-3/+3
| | | | | | Simplify tests of !gv || !io to just !io, avoid calling GvIO(gv) more than once, and where possible initialise io at declaration time, to allow it to be const.
* make <expr> always overload if expr is overloadedDavid Mitchell2011-01-021-1/+1
| | | | | | | | Due to the way that '<> as glob' was parsed differently from '<> as filehandle' from 5.6 onwards, something like <$foo[0]> didn't handle overloading, even where $foo[0] was an overloaded object. This was contrary to the docs for overload, and meant that <> couldn't be used as a general overloaded iterator operator.
* standardise amagic method namingDavid Mitchell2010-12-311-1/+1
| | | | | | | | | | | | | | Some amagic-related macros take the full method enumeration name, (e.g. "add_amg"); while others "helpfully" allow you to pass a shortened version, ("add"), and do a CAT2(meth,_amg) behind the scenes. Standardise on passing the full name; this makes it less confusing and allows you to grep for the enumeration name in the source. It updates two macros to accept full enumeration names: tryAMAGICunTARGET (which isn't used outside the core apparently), and AMG_CALLun, which is replaced by a new AMG_CALLunary (since AMG_CALLun is used outside the core).
* As report_evil_fh() checks WARN_{CLOSED,UNOPENED}, don't duplicate this.Nicholas Clark2010-12-281-3/+2
| | | | | | | | | | This trades reduced code size for an extra function call in the error path with warnings disabled. (And removes a duplicated check for the case of taking the error path *with* warnings enabled.) Removing the check from Perl_do_close() does not change behaviour, as io is NULL there, hence Perl_report_evil_fh() will always be checking WARN_UNOPENED and setting vile to "unopened".
* As report_wrongway_fh() checks ckWARN(WARN_IO) internally, don't duplicate this.Nicholas Clark2010-12-281-7/+5
| | | | | | This trades reduced code size for an extra function call in the error path with warnings disabled. (And removes a duplicated check for the case of taking the error path *with* warnings enabled.)
* Argument op to report_evil_fh() is always PL_op->op_type, so need not be passedNicholas Clark2010-12-281-3/+3
|