[asperl] added AS patch#2
[p5sagit/p5-mst-13.2.git] / mg.c
CommitLineData
a0d0e21e 1/* mg.c
79072805 2 *
9607fc9c 3 * Copyright (c) 1991-1997, Larry Wall
79072805 4 *
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
7 *
a0d0e21e 8 */
9
10/*
11 * "Sam sat on the ground and put his head in his hands. 'I wish I had never
12 * come here, and I don't want to see no more magic,' he said, and fell silent."
79072805 13 */
14
15#include "EXTERN.h"
16#include "perl.h"
17
e6d9441c 18/* XXX If this causes problems, set i_unistd=undef in the hint file. */
a0d0e21e 19#ifdef I_UNISTD
20# include <unistd.h>
21#endif
a0d0e21e 22
5cd24f17 23#if defined(HAS_GETGROUPS) || defined(HAS_SETGROUPS)
188ea221 24# ifndef NGROUPS
25# define NGROUPS 32
26# endif
27#endif
28
c07a80fd 29/*
30 * Use the "DESTRUCTOR" scope cleanup to reinstate magic.
31 */
32
76e3520e 33#ifdef PERL_OBJECT
34static void UnwindHandler(void *pPerl, void *ptr)
35{
36 ((CPerlObj*)pPerl)->unwind_handler_stack(ptr);
37}
38
39static void RestoreMagic(void *pPerl, void *ptr)
40{
41 ((CPerlObj*)pPerl)->restore_magic(ptr);
42}
43#define UNWINDHANDLER UnwindHandler
44#define RESTOREMAGIC RestoreMagic
45#define VTBL this->*vtbl
46
47#else
c07a80fd 48struct magic_state {
49 SV* mgs_sv;
50 U32 mgs_flags;
51};
52typedef struct magic_state MGS;
53
54static void restore_magic _((void *p));
76e3520e 55#define UNWINDHANDLER unwind_handler_stack
56#define RESTOREMAGIC restore_magic
57#define VTBL *vtbl
c07a80fd 58
76e3520e 59#endif
60
61STATIC void
8ac85365 62save_magic(MGS *mgs, SV *sv)
c07a80fd 63{
c07a80fd 64 assert(SvMAGICAL(sv));
65
c07a80fd 66 mgs->mgs_sv = sv;
67 mgs->mgs_flags = SvMAGICAL(sv) | SvREADONLY(sv);
76e3520e 68 SAVEDESTRUCTOR(RESTOREMAGIC, mgs);
c07a80fd 69
70 SvMAGICAL_off(sv);
71 SvREADONLY_off(sv);
72 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
c07a80fd 73}
74
76e3520e 75STATIC void
8ac85365 76restore_magic(void *p)
c07a80fd 77{
48e43a1c 78 MGS* mgs = (MGS*)p;
c07a80fd 79 SV* sv = mgs->mgs_sv;
80
81 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
82 {
83 if (mgs->mgs_flags)
84 SvFLAGS(sv) |= mgs->mgs_flags;
85 else
86 mg_magical(sv);
87 if (SvGMAGICAL(sv))
88 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
89 }
c07a80fd 90}
91
8990e307 92void
8ac85365 93mg_magical(SV *sv)
8990e307 94{
95 MAGIC* mg;
96 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
97 MGVTBL* vtbl = mg->mg_virtual;
98 if (vtbl) {
76e3520e 99 if ((vtbl->svt_get != NULL) && !(mg->mg_flags & MGf_GSKIP))
8990e307 100 SvGMAGICAL_on(sv);
101 if (vtbl->svt_set)
102 SvSMAGICAL_on(sv);
76e3520e 103 if (!(SvFLAGS(sv) & (SVs_GMG|SVs_SMG)) || (vtbl->svt_clear != NULL))
8990e307 104 SvRMAGICAL_on(sv);
105 }
106 }
107}
108
79072805 109int
8ac85365 110mg_get(SV *sv)
79072805 111{
48e43a1c 112 MGS mgs;
79072805 113 MAGIC* mg;
c6496cc7 114 MAGIC** mgp;
760ac839 115 int mgp_valid = 0;
463ee0b2 116
c07a80fd 117 ENTER;
48e43a1c 118 save_magic(&mgs, sv);
463ee0b2 119
c6496cc7 120 mgp = &SvMAGIC(sv);
121 while ((mg = *mgp) != 0) {
79072805 122 MGVTBL* vtbl = mg->mg_virtual;
76e3520e 123 if (!(mg->mg_flags & MGf_GSKIP) && vtbl && (vtbl->svt_get != NULL)) {
124 (VTBL->svt_get)(sv, mg);
c6496cc7 125 /* Ignore this magic if it's been deleted */
48e43a1c 126 if ((mg == (mgp_valid ? *mgp : SvMAGIC(sv))) &&
127 (mg->mg_flags & MGf_GSKIP))
128 mgs.mgs_flags = 0;
a0d0e21e 129 }
c6496cc7 130 /* Advance to next magic (complicated by possible deletion) */
760ac839 131 if (mg == (mgp_valid ? *mgp : SvMAGIC(sv))) {
c6496cc7 132 mgp = &mg->mg_moremagic;
760ac839 133 mgp_valid = 1;
134 }
135 else
136 mgp = &SvMAGIC(sv); /* Re-establish pointer after sv_upgrade */
79072805 137 }
463ee0b2 138
c07a80fd 139 LEAVE;
79072805 140 return 0;
141}
142
143int
8ac85365 144mg_set(SV *sv)
79072805 145{
48e43a1c 146 MGS mgs;
79072805 147 MAGIC* mg;
463ee0b2 148 MAGIC* nextmg;
149
c07a80fd 150 ENTER;
48e43a1c 151 save_magic(&mgs, sv);
463ee0b2 152
153 for (mg = SvMAGIC(sv); mg; mg = nextmg) {
79072805 154 MGVTBL* vtbl = mg->mg_virtual;
463ee0b2 155 nextmg = mg->mg_moremagic; /* it may delete itself */
a0d0e21e 156 if (mg->mg_flags & MGf_GSKIP) {
157 mg->mg_flags &= ~MGf_GSKIP; /* setting requires another read */
48e43a1c 158 mgs.mgs_flags = 0;
a0d0e21e 159 }
76e3520e 160 if (vtbl && (vtbl->svt_set != NULL))
161 (VTBL->svt_set)(sv, mg);
79072805 162 }
463ee0b2 163
c07a80fd 164 LEAVE;
79072805 165 return 0;
166}
167
168U32
8ac85365 169mg_len(SV *sv)
79072805 170{
171 MAGIC* mg;
748a9306 172 char *junk;
463ee0b2 173 STRLEN len;
463ee0b2 174
79072805 175 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
176 MGVTBL* vtbl = mg->mg_virtual;
76e3520e 177 if (vtbl && (vtbl->svt_len != NULL)) {
48e43a1c 178 MGS mgs;
179
c07a80fd 180 ENTER;
48e43a1c 181 save_magic(&mgs, sv);
a0d0e21e 182 /* omit MGf_GSKIP -- not changed here */
76e3520e 183 len = (VTBL->svt_len)(sv, mg);
c07a80fd 184 LEAVE;
85e6fe83 185 return len;
186 }
187 }
188
748a9306 189 junk = SvPV(sv, len);
463ee0b2 190 return len;
79072805 191}
192
193int
8ac85365 194mg_clear(SV *sv)
79072805 195{
48e43a1c 196 MGS mgs;
79072805 197 MAGIC* mg;
463ee0b2 198
c07a80fd 199 ENTER;
48e43a1c 200 save_magic(&mgs, sv);
463ee0b2 201
79072805 202 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
203 MGVTBL* vtbl = mg->mg_virtual;
a0d0e21e 204 /* omit GSKIP -- never set here */
205
76e3520e 206 if (vtbl && (vtbl->svt_clear != NULL))
207 (VTBL->svt_clear)(sv, mg);
79072805 208 }
463ee0b2 209
c07a80fd 210 LEAVE;
79072805 211 return 0;
212}
213
93a17b20 214MAGIC*
8ac85365 215mg_find(SV *sv, int type)
93a17b20 216{
217 MAGIC* mg;
93a17b20 218 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
219 if (mg->mg_type == type)
220 return mg;
221 }
222 return 0;
223}
224
79072805 225int
8ac85365 226mg_copy(SV *sv, SV *nsv, char *key, I32 klen)
79072805 227{
463ee0b2 228 int count = 0;
79072805 229 MAGIC* mg;
463ee0b2 230 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
231 if (isUPPER(mg->mg_type)) {
a0d0e21e 232 sv_magic(nsv, mg->mg_obj, toLOWER(mg->mg_type), key, klen);
463ee0b2 233 count++;
79072805 234 }
79072805 235 }
463ee0b2 236 return count;
79072805 237}
238
239int
8ac85365 240mg_free(SV *sv)
79072805 241{
242 MAGIC* mg;
243 MAGIC* moremagic;
244 for (mg = SvMAGIC(sv); mg; mg = moremagic) {
245 MGVTBL* vtbl = mg->mg_virtual;
246 moremagic = mg->mg_moremagic;
76e3520e 247 if (vtbl && (vtbl->svt_free != NULL))
248 (VTBL->svt_free)(sv, mg);
93a17b20 249 if (mg->mg_ptr && mg->mg_type != 'g')
76e3520e 250 if (mg->mg_length >= 0)
88e89b8a 251 Safefree(mg->mg_ptr);
76e3520e 252 else if (mg->mg_length == HEf_SVKEY)
88e89b8a 253 SvREFCNT_dec((SV*)mg->mg_ptr);
85e6fe83 254 if (mg->mg_flags & MGf_REFCOUNTED)
8990e307 255 SvREFCNT_dec(mg->mg_obj);
79072805 256 Safefree(mg);
257 }
258 SvMAGIC(sv) = 0;
259 return 0;
260}
261
262#if !defined(NSIG) || defined(M_UNIX) || defined(M_XENIX)
263#include <signal.h>
264#endif
265
93a17b20 266U32
8ac85365 267magic_len(SV *sv, MAGIC *mg)
93a17b20 268{
a863c7d1 269 dTHR;
93a17b20 270 register I32 paren;
271 register char *s;
272 register I32 i;
bbce6d69 273 register REGEXP *rx;
748a9306 274 char *t;
93a17b20 275
276 switch (*mg->mg_ptr) {
277 case '1': case '2': case '3': case '4':
278 case '5': case '6': case '7': case '8': case '9': case '&':
bbce6d69 279 if (curpm && (rx = curpm->op_pmregexp)) {
93a17b20 280 paren = atoi(mg->mg_ptr);
281 getparen:
bbce6d69 282 if (paren <= rx->nparens &&
283 (s = rx->startp[paren]) &&
284 (t = rx->endp[paren]))
285 {
748a9306 286 i = t - s;
71be2cbc 287 if (i >= 0)
93a17b20 288 return i;
93a17b20 289 }
93a17b20 290 }
748a9306 291 return 0;
93a17b20 292 case '+':
bbce6d69 293 if (curpm && (rx = curpm->op_pmregexp)) {
294 paren = rx->lastparen;
13f57bf8 295 if (paren)
296 goto getparen;
93a17b20 297 }
748a9306 298 return 0;
93a17b20 299 case '`':
bbce6d69 300 if (curpm && (rx = curpm->op_pmregexp)) {
13f57bf8 301 if ((s = rx->subbeg) && rx->startp[0]) {
bbce6d69 302 i = rx->startp[0] - s;
71be2cbc 303 if (i >= 0)
93a17b20 304 return i;
93a17b20 305 }
93a17b20 306 }
748a9306 307 return 0;
93a17b20 308 case '\'':
bbce6d69 309 if (curpm && (rx = curpm->op_pmregexp)) {
13f57bf8 310 if (rx->subend && (s = rx->endp[0])) {
311 i = rx->subend - s;
312 if (i >= 0)
5cd24f17 313 return i;
93a17b20 314 }
93a17b20 315 }
748a9306 316 return 0;
93a17b20 317 case ',':
318 return (STRLEN)ofslen;
319 case '\\':
320 return (STRLEN)orslen;
321 }
322 magic_get(sv,mg);
323 if (!SvPOK(sv) && SvNIOK(sv))
463ee0b2 324 sv_2pv(sv, &na);
93a17b20 325 if (SvPOK(sv))
326 return SvCUR(sv);
327 return 0;
328}
329
79072805 330int
8ac85365 331magic_get(SV *sv, MAGIC *mg)
79072805 332{
a863c7d1 333 dTHR;
79072805 334 register I32 paren;
335 register char *s;
336 register I32 i;
bbce6d69 337 register REGEXP *rx;
748a9306 338 char *t;
79072805 339
340 switch (*mg->mg_ptr) {
748a9306 341 case '\001': /* ^A */
342 sv_setsv(sv, bodytarget);
343 break;
79072805 344 case '\004': /* ^D */
188ea221 345 sv_setiv(sv, (IV)(debug & 32767));
79072805 346 break;
28f23441 347 case '\005': /* ^E */
348#ifdef VMS
349 {
350# include <descrip.h>
351# include <starlet.h>
352 char msg[255];
353 $DESCRIPTOR(msgdsc,msg);
946ec16e 354 sv_setnv(sv,(double) vaxc$errno);
28f23441 355 if (sys$getmsg(vaxc$errno,&msgdsc.dsc$w_length,&msgdsc,0,0) & 1)
356 sv_setpvn(sv,msgdsc.dsc$a_pointer,msgdsc.dsc$w_length);
357 else
358 sv_setpv(sv,"");
359 }
360#else
88e89b8a 361#ifdef OS2
fb73857a 362 if (!(_emx_env & 0x200)) { /* Under DOS */
363 sv_setnv(sv, (double)errno);
364 sv_setpv(sv, errno ? Strerror(errno) : "");
365 } else {
366 if (errno != errno_isOS2)
367 Perl_rc = _syserrno();
368 sv_setnv(sv, (double)Perl_rc);
369 sv_setpv(sv, os2error(Perl_rc));
370 }
88e89b8a 371#else
22fae026 372#ifdef WIN32
373 {
374 DWORD dwErr = GetLastError();
375 sv_setnv(sv, (double)dwErr);
376 if (dwErr)
76e3520e 377 {
378#ifdef PERL_OBJECT
379 char *sMsg;
380 DWORD dwLen;
381 PerlProc_GetSysMsg(sMsg, dwLen, dwErr);
382 sv_setpvn(sv, sMsg, dwLen);
383 PerlProc_FreeBuf(sMsg);
384#else
22fae026 385 win32_str_os_error(sv, dwErr);
76e3520e 386#endif
387 }
22fae026 388 else
389 sv_setpv(sv, "");
390 SetLastError(dwErr);
391 }
392#else
946ec16e 393 sv_setnv(sv, (double)errno);
28f23441 394 sv_setpv(sv, errno ? Strerror(errno) : "");
395#endif
88e89b8a 396#endif
22fae026 397#endif
946ec16e 398 SvNOK_on(sv); /* what a wonderful hack! */
28f23441 399 break;
79072805 400 case '\006': /* ^F */
188ea221 401 sv_setiv(sv, (IV)maxsysfd);
79072805 402 break;
a0d0e21e 403 case '\010': /* ^H */
188ea221 404 sv_setiv(sv, (IV)hints);
a0d0e21e 405 break;
79072805 406 case '\t': /* ^I */
407 if (inplace)
408 sv_setpv(sv, inplace);
409 else
188ea221 410 sv_setsv(sv, &sv_undef);
79072805 411 break;
28f23441 412 case '\017': /* ^O */
188ea221 413 sv_setpv(sv, osname);
28f23441 414 break;
79072805 415 case '\020': /* ^P */
188ea221 416 sv_setiv(sv, (IV)perldb);
79072805 417 break;
fb73857a 418 case '\023': /* ^S */
d58bf5aa 419 {
420 dTHR;
421 if (lex_state != LEX_NOTPARSING)
422 SvOK_off(sv);
423 else if (in_eval)
424 sv_setiv(sv, 1);
425 else
426 sv_setiv(sv, 0);
427 }
fb73857a 428 break;
79072805 429 case '\024': /* ^T */
88e89b8a 430#ifdef BIG_TIME
188ea221 431 sv_setnv(sv, basetime);
88e89b8a 432#else
188ea221 433 sv_setiv(sv, (IV)basetime);
88e89b8a 434#endif
79072805 435 break;
436 case '\027': /* ^W */
188ea221 437 sv_setiv(sv, (IV)dowarn);
79072805 438 break;
439 case '1': case '2': case '3': case '4':
440 case '5': case '6': case '7': case '8': case '9': case '&':
bbce6d69 441 if (curpm && (rx = curpm->op_pmregexp)) {
a863c7d1 442 /*
443 * Pre-threads, this was paren = atoi(GvENAME((GV*)mg->mg_obj));
444 * XXX Does the new way break anything?
445 */
446 paren = atoi(mg->mg_ptr);
79072805 447 getparen:
bbce6d69 448 if (paren <= rx->nparens &&
449 (s = rx->startp[paren]) &&
450 (t = rx->endp[paren]))
451 {
748a9306 452 i = t - s;
13f57bf8 453 getrx:
748a9306 454 if (i >= 0) {
13f57bf8 455 bool was_tainted;
456 if (tainting) {
457 was_tainted = tainted;
458 tainted = FALSE;
459 }
79072805 460 sv_setpvn(sv,s,i);
13f57bf8 461 if (tainting)
c277df42 462 tainted = was_tainted || RX_MATCH_TAINTED(rx);
748a9306 463 break;
464 }
79072805 465 }
79072805 466 }
748a9306 467 sv_setsv(sv,&sv_undef);
79072805 468 break;
469 case '+':
bbce6d69 470 if (curpm && (rx = curpm->op_pmregexp)) {
471 paren = rx->lastparen;
a0d0e21e 472 if (paren)
473 goto getparen;
79072805 474 }
748a9306 475 sv_setsv(sv,&sv_undef);
79072805 476 break;
477 case '`':
bbce6d69 478 if (curpm && (rx = curpm->op_pmregexp)) {
13f57bf8 479 if ((s = rx->subbeg) && rx->startp[0]) {
bbce6d69 480 i = rx->startp[0] - s;
13f57bf8 481 goto getrx;
79072805 482 }
79072805 483 }
748a9306 484 sv_setsv(sv,&sv_undef);
79072805 485 break;
486 case '\'':
bbce6d69 487 if (curpm && (rx = curpm->op_pmregexp)) {
13f57bf8 488 if (rx->subend && (s = rx->endp[0])) {
489 i = rx->subend - s;
490 goto getrx;
79072805 491 }
79072805 492 }
748a9306 493 sv_setsv(sv,&sv_undef);
79072805 494 break;
495 case '.':
496#ifndef lint
a0d0e21e 497 if (GvIO(last_in_gv)) {
188ea221 498 sv_setiv(sv, (IV)IoLINES(GvIO(last_in_gv)));
79072805 499 }
500#endif
501 break;
502 case '?':
809a5acc 503 {
504 dTHR;
505 sv_setiv(sv, (IV)STATUS_CURRENT);
ff0cee69 506#ifdef COMPLEX_STATUS
809a5acc 507 LvTARGOFF(sv) = statusvalue;
508 LvTARGLEN(sv) = statusvalue_vms;
ff0cee69 509#endif
809a5acc 510 }
79072805 511 break;
512 case '^':
a0d0e21e 513 s = IoTOP_NAME(GvIOp(defoutgv));
79072805 514 if (s)
515 sv_setpv(sv,s);
516 else {
517 sv_setpv(sv,GvENAME(defoutgv));
518 sv_catpv(sv,"_TOP");
519 }
520 break;
521 case '~':
a0d0e21e 522 s = IoFMT_NAME(GvIOp(defoutgv));
79072805 523 if (!s)
524 s = GvENAME(defoutgv);
525 sv_setpv(sv,s);
526 break;
527#ifndef lint
528 case '=':
188ea221 529 sv_setiv(sv, (IV)IoPAGE_LEN(GvIOp(defoutgv)));
79072805 530 break;
531 case '-':
188ea221 532 sv_setiv(sv, (IV)IoLINES_LEFT(GvIOp(defoutgv)));
79072805 533 break;
534 case '%':
188ea221 535 sv_setiv(sv, (IV)IoPAGE(GvIOp(defoutgv)));
79072805 536 break;
537#endif
538 case ':':
539 break;
540 case '/':
541 break;
542 case '[':
0f15f207 543 WITH_THR(sv_setiv(sv, (IV)curcop->cop_arybase));
79072805 544 break;
545 case '|':
188ea221 546 sv_setiv(sv, (IV)(IoFLAGS(GvIOp(defoutgv)) & IOf_FLUSH) != 0 );
79072805 547 break;
548 case ',':
549 sv_setpvn(sv,ofs,ofslen);
550 break;
551 case '\\':
552 sv_setpvn(sv,ors,orslen);
553 break;
554 case '#':
555 sv_setpv(sv,ofmt);
556 break;
557 case '!':
a5f75d66 558#ifdef VMS
946ec16e 559 sv_setnv(sv, (double)((errno == EVMSERR) ? vaxc$errno : errno));
88e89b8a 560 sv_setpv(sv, errno ? Strerror(errno) : "");
a5f75d66 561#else
88e89b8a 562 {
563 int saveerrno = errno;
946ec16e 564 sv_setnv(sv, (double)errno);
88e89b8a 565#ifdef OS2
566 if (errno == errno_isOS2) sv_setpv(sv, os2error(Perl_rc));
567 else
a5f75d66 568#endif
2304df62 569 sv_setpv(sv, errno ? Strerror(errno) : "");
88e89b8a 570 errno = saveerrno;
571 }
572#endif
946ec16e 573 SvNOK_on(sv); /* what a wonderful hack! */
79072805 574 break;
575 case '<':
188ea221 576 sv_setiv(sv, (IV)uid);
79072805 577 break;
578 case '>':
188ea221 579 sv_setiv(sv, (IV)euid);
79072805 580 break;
581 case '(':
188ea221 582 sv_setiv(sv, (IV)gid);
fc36a67e 583 sv_setpvf(sv, "%Vd", (IV)gid);
79072805 584 goto add_groups;
585 case ')':
188ea221 586 sv_setiv(sv, (IV)egid);
fc36a67e 587 sv_setpvf(sv, "%Vd", (IV)egid);
79072805 588 add_groups:
79072805 589#ifdef HAS_GETGROUPS
79072805 590 {
a0d0e21e 591 Groups_t gary[NGROUPS];
79072805 592 i = getgroups(NGROUPS,gary);
46fc3d4c 593 while (--i >= 0)
fc36a67e 594 sv_catpvf(sv, " %Vd", (IV)gary[i]);
79072805 595 }
596#endif
29355cf7 597 SvIOK_on(sv); /* what a wonderful hack! */
79072805 598 break;
599 case '*':
600 break;
601 case '0':
602 break;
a863c7d1 603#ifdef USE_THREADS
604 case '@':
38a03e6e 605 sv_setsv(sv, thr->errsv);
a863c7d1 606 break;
607#endif /* USE_THREADS */
79072805 608 }
a0d0e21e 609 return 0;
79072805 610}
611
612int
8ac85365 613magic_getuvar(SV *sv, MAGIC *mg)
79072805 614{
615 struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr;
616
617 if (uf && uf->uf_val)
618 (*uf->uf_val)(uf->uf_index, sv);
619 return 0;
620}
621
622int
8ac85365 623magic_setenv(SV *sv, MAGIC *mg)
79072805 624{
625 register char *s;
88e89b8a 626 char *ptr;
5aabfad6 627 STRLEN len, klen;
a0d0e21e 628 I32 i;
1e422769 629
a0d0e21e 630 s = SvPV(sv,len);
5aabfad6 631 ptr = MgPV(mg,klen);
88e89b8a 632 my_setenv(ptr, s);
1e422769 633
a0d0e21e 634#ifdef DYNAMIC_ENV_FETCH
635 /* We just undefd an environment var. Is a replacement */
636 /* waiting in the wings? */
637 if (!len) {
5aabfad6 638 SV **valp;
639 if ((valp = hv_fetch(GvHVn(envgv), ptr, klen, FALSE)))
640 s = SvPV(*valp, len);
a0d0e21e 641 }
642#endif
1e422769 643
39e571d4 644#if !defined(OS2) && !defined(AMIGAOS) && !defined(WIN32) && !defined(MSDOS)
79072805 645 /* And you'll never guess what the dog had */
646 /* in its mouth... */
463ee0b2 647 if (tainting) {
1e422769 648 MgTAINTEDDIR_off(mg);
649#ifdef VMS
5aabfad6 650 if (s && klen == 8 && strEQ(ptr, "DCL$PATH")) {
1e422769 651 char pathbuf[256], eltbuf[256], *cp, *elt = s;
652 struct stat sbuf;
653 int i = 0, j = 0;
654
655 do { /* DCL$PATH may be a search list */
656 while (1) { /* as may dev portion of any element */
657 if ( ((cp = strchr(elt,'[')) || (cp = strchr(elt,'<'))) ) {
658 if ( *(cp+1) == '.' || *(cp+1) == '-' ||
659 cando_by_name(S_IWUSR,0,elt) ) {
660 MgTAINTEDDIR_on(mg);
661 return 0;
662 }
663 }
664 if ((cp = strchr(elt, ':')) != Nullch)
665 *cp = '\0';
666 if (my_trnlnm(elt, eltbuf, j++))
667 elt = eltbuf;
668 else
669 break;
670 }
671 j = 0;
672 } while (my_trnlnm(s, pathbuf, i++) && (elt = pathbuf));
673 }
674#endif /* VMS */
5aabfad6 675 if (s && klen == 4 && strEQ(ptr,"PATH")) {
a0d0e21e 676 char *strend = s + len;
463ee0b2 677
678 while (s < strend) {
96827780 679 char tmpbuf[256];
1e422769 680 struct stat st;
96827780 681 s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf,
fc36a67e 682 s, strend, ':', &i);
463ee0b2 683 s++;
96827780 684 if (i >= sizeof tmpbuf /* too long -- assume the worst */
685 || *tmpbuf != '/'
686 || (Stat(tmpbuf, &st) == 0 && (st.st_mode & 2)) ) {
8990e307 687 MgTAINTEDDIR_on(mg);
1e422769 688 return 0;
689 }
463ee0b2 690 }
79072805 691 }
692 }
39e571d4 693#endif /* neither OS2 nor AMIGAOS nor WIN32 nor MSDOS */
1e422769 694
79072805 695 return 0;
696}
697
698int
8ac85365 699magic_clearenv(SV *sv, MAGIC *mg)
85e6fe83 700{
5aabfad6 701 my_setenv(MgPV(mg,na),Nullch);
85e6fe83 702 return 0;
703}
704
88e89b8a 705int
8ac85365 706magic_set_all_env(SV *sv, MAGIC *mg)
fb73857a 707{
708#if defined(VMS)
709 die("Can't make list assignment to %%ENV on this system");
710#else
d58bf5aa 711 dTHR;
fb73857a 712 if (localizing) {
713 HE* entry;
714 magic_clear_all_env(sv,mg);
715 hv_iterinit((HV*)sv);
716 while (entry = hv_iternext((HV*)sv)) {
717 I32 keylen;
718 my_setenv(hv_iterkey(entry, &keylen),
719 SvPV(hv_iterval((HV*)sv, entry), na));
720 }
721 }
722#endif
723 return 0;
724}
725
726int
8ac85365 727magic_clear_all_env(SV *sv, MAGIC *mg)
66b1d557 728{
3e3baf6d 729#if defined(VMS)
730 die("Can't make list assignment to %%ENV on this system");
731#else
732#ifdef WIN32
733 char *envv = GetEnvironmentStrings();
734 char *cur = envv;
735 STRLEN len;
736 while (*cur) {
737 char *end = strchr(cur,'=');
738 if (end && end != cur) {
739 *end = '\0';
740 my_setenv(cur,Nullch);
741 *end = '=';
742 cur += strlen(end+1)+1;
743 }
744 else if ((len = strlen(cur)))
745 cur += len+1;
746 }
747 FreeEnvironmentStrings(envv);
66b1d557 748#else
749 I32 i;
750
751 if (environ == origenviron)
752 New(901, environ, 1, char*);
753 else
754 for (i = 0; environ[i]; i++)
755 Safefree(environ[i]);
756 environ[0] = Nullch;
757
66b1d557 758#endif
3e3baf6d 759#endif
760 return 0;
66b1d557 761}
762
763int
8ac85365 764magic_getsig(SV *sv, MAGIC *mg)
88e89b8a 765{
766 I32 i;
767 /* Are we fetching a signal entry? */
5aabfad6 768 i = whichsig(MgPV(mg,na));
88e89b8a 769 if (i) {
770 if(psig_ptr[i])
771 sv_setsv(sv,psig_ptr[i]);
772 else {
ff68c719 773 Sighandler_t sigstate = rsignal_state(i);
774
88e89b8a 775 /* cache state so we don't fetch it again */
ff68c719 776 if(sigstate == SIG_IGN)
88e89b8a 777 sv_setpv(sv,"IGNORE");
778 else
779 sv_setsv(sv,&sv_undef);
780 psig_ptr[i] = SvREFCNT_inc(sv);
781 SvTEMP_off(sv);
782 }
783 }
784 return 0;
785}
786int
8ac85365 787magic_clearsig(SV *sv, MAGIC *mg)
88e89b8a 788{
789 I32 i;
790 /* Are we clearing a signal entry? */
5aabfad6 791 i = whichsig(MgPV(mg,na));
88e89b8a 792 if (i) {
793 if(psig_ptr[i]) {
794 SvREFCNT_dec(psig_ptr[i]);
795 psig_ptr[i]=0;
796 }
797 if(psig_name[i]) {
798 SvREFCNT_dec(psig_name[i]);
799 psig_name[i]=0;
800 }
801 }
802 return 0;
803}
3d37d572 804
85e6fe83 805int
8ac85365 806magic_setsig(SV *sv, MAGIC *mg)
79072805 807{
11343788 808 dTHR;
79072805 809 register char *s;
810 I32 i;
748a9306 811 SV** svp;
a0d0e21e 812
5aabfad6 813 s = MgPV(mg,na);
748a9306 814 if (*s == '_') {
815 if (strEQ(s,"__DIE__"))
816 svp = &diehook;
817 else if (strEQ(s,"__WARN__"))
818 svp = &warnhook;
819 else if (strEQ(s,"__PARSE__"))
820 svp = &parsehook;
821 else
822 croak("No such hook: %s", s);
823 i = 0;
4633a7c4 824 if (*svp) {
825 SvREFCNT_dec(*svp);
826 *svp = 0;
827 }
748a9306 828 }
829 else {
830 i = whichsig(s); /* ...no, a brick */
831 if (!i) {
832 if (dowarn || strEQ(s,"ALARM"))
833 warn("No such signal: SIG%s", s);
834 return 0;
835 }
ff0cee69 836 SvREFCNT_dec(psig_name[i]);
837 SvREFCNT_dec(psig_ptr[i]);
88e89b8a 838 psig_ptr[i] = SvREFCNT_inc(sv);
88e89b8a 839 SvTEMP_off(sv); /* Make sure it doesn't go away on us */
ff0cee69 840 psig_name[i] = newSVpv(s, strlen(s));
88e89b8a 841 SvREADONLY_on(psig_name[i]);
748a9306 842 }
a0d0e21e 843 if (SvTYPE(sv) == SVt_PVGV || SvROK(sv)) {
748a9306 844 if (i)
c23142e2 845 (void)rsignal(i, sighandlerp);
748a9306 846 else
847 *svp = SvREFCNT_inc(sv);
a0d0e21e 848 return 0;
849 }
850 s = SvPV_force(sv,na);
748a9306 851 if (strEQ(s,"IGNORE")) {
852 if (i)
ff68c719 853 (void)rsignal(i, SIG_IGN);
748a9306 854 else
855 *svp = 0;
856 }
857 else if (strEQ(s,"DEFAULT") || !*s) {
858 if (i)
ff68c719 859 (void)rsignal(i, SIG_DFL);
748a9306 860 else
861 *svp = 0;
862 }
79072805 863 else {
5aabfad6 864 /*
865 * We should warn if HINT_STRICT_REFS, but without
866 * access to a known hint bit in a known OP, we can't
867 * tell whether HINT_STRICT_REFS is in force or not.
868 */
46fc3d4c 869 if (!strchr(s,':') && !strchr(s,'\''))
870 sv_setpv(sv, form("main::%s", s));
748a9306 871 if (i)
c23142e2 872 (void)rsignal(i, sighandlerp);
748a9306 873 else
874 *svp = SvREFCNT_inc(sv);
79072805 875 }
876 return 0;
877}
878
879int
8ac85365 880magic_setisa(SV *sv, MAGIC *mg)
79072805 881{
a0231f0e 882 HV *stash;
883 SV **svp;
884 I32 fill;
885 HV *basefields = Nullhv;
886 GV **gvp;
887 GV *gv;
888 HE *he;
889 static char *FIELDS = "FIELDS";
890
463ee0b2 891 sub_generation++;
a0231f0e 892
893 if (mg->mg_type == 'i')
894 return 0; /* Ignore lower-case version of the magic */
895
896 stash = GvSTASH(mg->mg_obj);
897 svp = AvARRAY((AV*)sv);
898
899 for (fill = AvFILL((AV*)sv); fill >= 0; fill--, svp++) {
900 HV *basestash = gv_stashsv(*svp, FALSE);
901
902 if (!basestash) {
903 if (dowarn)
904 warn("No such package \"%_\" in @ISA assignment", *svp);
905 continue;
906 }
907 gvp = (GV**)hv_fetch(basestash, FIELDS, 6, FALSE);
908 if (gvp && *gvp && GvHV(*gvp)) {
909 if (basefields)
910 croak("Can't multiply inherit %%FIELDS");
911 basefields = GvHV(*gvp);
912 }
913 }
914
915 if (!basefields)
916 return 0;
917
918 gv = (GV*)*hv_fetch(stash, FIELDS, 6, TRUE);
919 if (!isGV(gv))
920 gv_init(gv, stash, FIELDS, 6, TRUE);
921 if (!GvHV(gv))
922 GvHV(gv) = newHV();
923 if (HvKEYS(GvHV(gv)))
924 croak("Inherited %%FIELDS can't override existing %%FIELDS");
925
926 hv_iterinit(GvHV(gv));
927 while ((he = hv_iternext(basefields)))
928 hv_store(GvHV(gv), HeKEY(he), HeKLEN(he), HeVAL(he), HeHASH(he));
929
463ee0b2 930 return 0;
931}
932
a0d0e21e 933#ifdef OVERLOAD
934
463ee0b2 935int
8ac85365 936magic_setamagic(SV *sv, MAGIC *mg)
463ee0b2 937{
a0d0e21e 938 /* HV_badAMAGIC_on(Sv_STASH(sv)); */
939 amagic_generation++;
463ee0b2 940
a0d0e21e 941 return 0;
942}
943#endif /* OVERLOAD */
463ee0b2 944
946ec16e 945int
8ac85365 946magic_setnkeys(SV *sv, MAGIC *mg)
946ec16e 947{
948 if (LvTARG(sv)) {
949 hv_ksplit((HV*)LvTARG(sv), SvIV(sv));
950 LvTARG(sv) = Nullsv; /* Don't allow a ref to reassign this. */
951 }
952 return 0;
953}
954
76e3520e 955STATIC int
8ac85365 956magic_methpack(SV *sv, MAGIC *mg, char *meth)
a0d0e21e 957{
958 dSP;
463ee0b2 959
a0d0e21e 960 ENTER;
961 SAVETMPS;
962 PUSHMARK(sp);
963 EXTEND(sp, 2);
964 PUSHs(mg->mg_obj);
88e89b8a 965 if (mg->mg_ptr) {
76e3520e 966 if (mg->mg_length >= 0)
967 PUSHs(sv_2mortal(newSVpv(mg->mg_ptr, mg->mg_length)));
968 else if (mg->mg_length == HEf_SVKEY)
88e89b8a 969 PUSHs((SV*)mg->mg_ptr);
970 }
a0d0e21e 971 else if (mg->mg_type == 'p')
76e3520e 972 PUSHs(sv_2mortal(newSViv(mg->mg_length)));
463ee0b2 973 PUTBACK;
974
a0d0e21e 975 if (perl_call_method(meth, G_SCALAR))
976 sv_setsv(sv, *stack_sp--);
463ee0b2 977
a0d0e21e 978 FREETMPS;
979 LEAVE;
980 return 0;
981}
463ee0b2 982
a0d0e21e 983int
8ac85365 984magic_getpack(SV *sv, MAGIC *mg)
a0d0e21e 985{
986 magic_methpack(sv,mg,"FETCH");
987 if (mg->mg_ptr)
988 mg->mg_flags |= MGf_GSKIP;
463ee0b2 989 return 0;
990}
991
992int
8ac85365 993magic_setpack(SV *sv, MAGIC *mg)
463ee0b2 994{
463ee0b2 995 dSP;
463ee0b2 996
a0d0e21e 997 PUSHMARK(sp);
998 EXTEND(sp, 3);
999 PUSHs(mg->mg_obj);
88e89b8a 1000 if (mg->mg_ptr) {
76e3520e 1001 if (mg->mg_length >= 0)
1002 PUSHs(sv_2mortal(newSVpv(mg->mg_ptr, mg->mg_length)));
1003 else if (mg->mg_length == HEf_SVKEY)
88e89b8a 1004 PUSHs((SV*)mg->mg_ptr);
1005 }
a0d0e21e 1006 else if (mg->mg_type == 'p')
76e3520e 1007 PUSHs(sv_2mortal(newSViv(mg->mg_length)));
463ee0b2 1008 PUSHs(sv);
1009 PUTBACK;
1010
a0d0e21e 1011 perl_call_method("STORE", G_SCALAR|G_DISCARD);
463ee0b2 1012
1013 return 0;
1014}
1015
1016int
8ac85365 1017magic_clearpack(SV *sv, MAGIC *mg)
463ee0b2 1018{
a0d0e21e 1019 return magic_methpack(sv,mg,"DELETE");
1020}
463ee0b2 1021
8ac85365 1022int magic_wipepack(SV *sv, MAGIC *mg)
a0d0e21e 1023{
1024 dSP;
463ee0b2 1025
a0d0e21e 1026 PUSHMARK(sp);
1027 XPUSHs(mg->mg_obj);
463ee0b2 1028 PUTBACK;
463ee0b2 1029
a0d0e21e 1030 perl_call_method("CLEAR", G_SCALAR|G_DISCARD);
463ee0b2 1031
1032 return 0;
1033}
1034
1035int
8ac85365 1036magic_nextpack(SV *sv, MAGIC *mg, SV *key)
463ee0b2 1037{
463ee0b2 1038 dSP;
a0d0e21e 1039 char *meth = SvOK(key) ? "NEXTKEY" : "FIRSTKEY";
463ee0b2 1040
1041 ENTER;
a0d0e21e 1042 SAVETMPS;
1043 PUSHMARK(sp);
1044 EXTEND(sp, 2);
1045 PUSHs(mg->mg_obj);
463ee0b2 1046 if (SvOK(key))
1047 PUSHs(key);
1048 PUTBACK;
1049
a0d0e21e 1050 if (perl_call_method(meth, G_SCALAR))
1051 sv_setsv(key, *stack_sp--);
463ee0b2 1052
a0d0e21e 1053 FREETMPS;
1054 LEAVE;
79072805 1055 return 0;
1056}
1057
1058int
8ac85365 1059magic_existspack(SV *sv, MAGIC *mg)
a0d0e21e 1060{
1061 return magic_methpack(sv,mg,"EXISTS");
1062}
1063
1064int
8ac85365 1065magic_setdbline(SV *sv, MAGIC *mg)
79072805 1066{
11343788 1067 dTHR;
79072805 1068 OP *o;
1069 I32 i;
1070 GV* gv;
1071 SV** svp;
1072
1073 gv = DBline;
1074 i = SvTRUE(sv);
188ea221 1075 svp = av_fetch(GvAV(gv),
5aabfad6 1076 atoi(MgPV(mg,na)), FALSE);
8990e307 1077 if (svp && SvIOKp(*svp) && (o = (OP*)SvSTASH(*svp)))
93a17b20 1078 o->op_private = i;
79072805 1079 else
1080 warn("Can't break at that line\n");
1081 return 0;
1082}
1083
1084int
8ac85365 1085magic_getarylen(SV *sv, MAGIC *mg)
79072805 1086{
0f15f207 1087 dTHR;
a0d0e21e 1088 sv_setiv(sv, AvFILL((AV*)mg->mg_obj) + curcop->cop_arybase);
79072805 1089 return 0;
1090}
1091
1092int
8ac85365 1093magic_setarylen(SV *sv, MAGIC *mg)
79072805 1094{
0f15f207 1095 dTHR;
a0d0e21e 1096 av_fill((AV*)mg->mg_obj, SvIV(sv) - curcop->cop_arybase);
1097 return 0;
1098}
1099
1100int
8ac85365 1101magic_getpos(SV *sv, MAGIC *mg)
a0d0e21e 1102{
1103 SV* lsv = LvTARG(sv);
1104
1105 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv)) {
1106 mg = mg_find(lsv, 'g');
76e3520e 1107 if (mg && mg->mg_length >= 0) {
0f15f207 1108 dTHR;
76e3520e 1109 sv_setiv(sv, mg->mg_length + curcop->cop_arybase);
a0d0e21e 1110 return 0;
1111 }
1112 }
1113 (void)SvOK_off(sv);
1114 return 0;
1115}
1116
1117int
8ac85365 1118magic_setpos(SV *sv, MAGIC *mg)
a0d0e21e 1119{
1120 SV* lsv = LvTARG(sv);
1121 SSize_t pos;
1122 STRLEN len;
1123
1124 mg = 0;
1125
1126 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv))
1127 mg = mg_find(lsv, 'g');
1128 if (!mg) {
1129 if (!SvOK(sv))
1130 return 0;
1131 sv_magic(lsv, (SV*)0, 'g', Nullch, 0);
1132 mg = mg_find(lsv, 'g');
1133 }
1134 else if (!SvOK(sv)) {
76e3520e 1135 mg->mg_length = -1;
a0d0e21e 1136 return 0;
1137 }
1138 len = SvPOK(lsv) ? SvCUR(lsv) : sv_len(lsv);
1139
0f15f207 1140 WITH_THR(pos = SvIV(sv) - curcop->cop_arybase);
a0d0e21e 1141 if (pos < 0) {
1142 pos += len;
1143 if (pos < 0)
1144 pos = 0;
1145 }
1146 else if (pos > len)
1147 pos = len;
76e3520e 1148 mg->mg_length = pos;
71be2cbc 1149 mg->mg_flags &= ~MGf_MINMATCH;
a0d0e21e 1150
79072805 1151 return 0;
1152}
1153
1154int
8ac85365 1155magic_getglob(SV *sv, MAGIC *mg)
79072805 1156{
8646b087 1157 if (SvFAKE(sv)) { /* FAKE globs can get coerced */
1158 SvFAKE_off(sv);
946ec16e 1159 gv_efullname3(sv,((GV*)sv), "*");
8646b087 1160 SvFAKE_on(sv);
1161 }
1162 else
946ec16e 1163 gv_efullname3(sv,((GV*)sv), "*"); /* a gv value, be nice */
79072805 1164 return 0;
1165}
1166
1167int
8ac85365 1168magic_setglob(SV *sv, MAGIC *mg)
79072805 1169{
1170 register char *s;
1171 GV* gv;
1172
1173 if (!SvOK(sv))
1174 return 0;
463ee0b2 1175 s = SvPV(sv, na);
79072805 1176 if (*s == '*' && s[1])
1177 s++;
85e6fe83 1178 gv = gv_fetchpv(s,TRUE, SVt_PVGV);
79072805 1179 if (sv == (SV*)gv)
1180 return 0;
1181 if (GvGP(sv))
88e89b8a 1182 gp_free((GV*)sv);
79072805 1183 GvGP(sv) = gp_ref(GvGP(gv));
79072805 1184 return 0;
1185}
1186
1187int
8ac85365 1188magic_setsubstr(SV *sv, MAGIC *mg)
79072805 1189{
8990e307 1190 STRLEN len;
1191 char *tmps = SvPV(sv,len);
1192 sv_insert(LvTARG(sv),LvTARGOFF(sv),LvTARGLEN(sv), tmps, len);
79072805 1193 return 0;
1194}
1195
1196int
8ac85365 1197magic_gettaint(SV *sv, MAGIC *mg)
463ee0b2 1198{
a863c7d1 1199 dTHR;
76e3520e 1200 TAINT_IF((mg->mg_length & 1) ||
1201 (mg->mg_length & 2) && mg->mg_obj == sv); /* kludge */
463ee0b2 1202 return 0;
1203}
1204
1205int
8ac85365 1206magic_settaint(SV *sv, MAGIC *mg)
463ee0b2 1207{
11343788 1208 dTHR;
748a9306 1209 if (localizing) {
1210 if (localizing == 1)
76e3520e 1211 mg->mg_length <<= 1;
748a9306 1212 else
76e3520e 1213 mg->mg_length >>= 1;
a0d0e21e 1214 }
748a9306 1215 else if (tainted)
76e3520e 1216 mg->mg_length |= 1;
748a9306 1217 else
76e3520e 1218 mg->mg_length &= ~1;
463ee0b2 1219 return 0;
1220}
1221
1222int
8ac85365 1223magic_setvec(SV *sv, MAGIC *mg)
79072805 1224{
1225 do_vecset(sv); /* XXX slurp this routine */
1226 return 0;
1227}
1228
1229int
8ac85365 1230magic_getdefelem(SV *sv, MAGIC *mg)
5f05dabc 1231{
71be2cbc 1232 SV *targ = Nullsv;
5f05dabc 1233 if (LvTARGLEN(sv)) {
68dc0745 1234 if (mg->mg_obj) {
1235 HV* hv = (HV*)LvTARG(sv);
1236 HE* he = hv_fetch_ent(hv, mg->mg_obj, FALSE, 0);
1237 if (he)
1238 targ = HeVAL(he);
1239 }
1240 else {
1241 AV* av = (AV*)LvTARG(sv);
1242 if ((I32)LvTARGOFF(sv) <= AvFILL(av))
1243 targ = AvARRAY(av)[LvTARGOFF(sv)];
1244 }
1245 if (targ && targ != &sv_undef) {
e858de61 1246 dTHR; /* just for SvREFCNT_dec */
68dc0745 1247 /* somebody else defined it for us */
1248 SvREFCNT_dec(LvTARG(sv));
1249 LvTARG(sv) = SvREFCNT_inc(targ);
1250 LvTARGLEN(sv) = 0;
1251 SvREFCNT_dec(mg->mg_obj);
1252 mg->mg_obj = Nullsv;
1253 mg->mg_flags &= ~MGf_REFCOUNTED;
1254 }
5f05dabc 1255 }
71be2cbc 1256 else
1257 targ = LvTARG(sv);
1258 sv_setsv(sv, targ ? targ : &sv_undef);
1259 return 0;
1260}
1261
1262int
8ac85365 1263magic_setdefelem(SV *sv, MAGIC *mg)
71be2cbc 1264{
1265 if (LvTARGLEN(sv))
68dc0745 1266 vivify_defelem(sv);
1267 if (LvTARG(sv)) {
5f05dabc 1268 sv_setsv(LvTARG(sv), sv);
68dc0745 1269 SvSETMAGIC(LvTARG(sv));
1270 }
5f05dabc 1271 return 0;
1272}
1273
1274int
8ac85365 1275magic_freedefelem(SV *sv, MAGIC *mg)
5f05dabc 1276{
1277 SvREFCNT_dec(LvTARG(sv));
71be2cbc 1278 return 0;
1279}
1280
1281void
8ac85365 1282vivify_defelem(SV *sv)
71be2cbc 1283{
e858de61 1284 dTHR; /* just for SvREFCNT_inc and SvREFCNT_dec*/
68dc0745 1285 MAGIC* mg;
1286 SV* value;
71be2cbc 1287
68dc0745 1288 if (!LvTARGLEN(sv) || !(mg = mg_find(sv, 'y')))
71be2cbc 1289 return;
68dc0745 1290 if (mg->mg_obj) {
1291 HV* hv = (HV*)LvTARG(sv);
1292 HE* he = hv_fetch_ent(hv, mg->mg_obj, TRUE, 0);
1293 if (!he || (value = HeVAL(he)) == &sv_undef)
1294 croak(no_helem, SvPV(mg->mg_obj, na));
71be2cbc 1295 }
68dc0745 1296 else {
1297 AV* av = (AV*)LvTARG(sv);
5aabfad6 1298 if ((I32)LvTARGLEN(sv) < 0 && (I32)LvTARGOFF(sv) > AvFILL(av))
68dc0745 1299 LvTARG(sv) = Nullsv; /* array can't be extended */
1300 else {
1301 SV** svp = av_fetch(av, LvTARGOFF(sv), TRUE);
1302 if (!svp || (value = *svp) == &sv_undef)
1303 croak(no_aelem, (I32)LvTARGOFF(sv));
1304 }
1305 }
3e3baf6d 1306 (void)SvREFCNT_inc(value);
68dc0745 1307 SvREFCNT_dec(LvTARG(sv));
1308 LvTARG(sv) = value;
71be2cbc 1309 LvTARGLEN(sv) = 0;
68dc0745 1310 SvREFCNT_dec(mg->mg_obj);
1311 mg->mg_obj = Nullsv;
1312 mg->mg_flags &= ~MGf_REFCOUNTED;
5f05dabc 1313}
1314
1315int
8ac85365 1316magic_setmglob(SV *sv, MAGIC *mg)
93a17b20 1317{
76e3520e 1318 mg->mg_length = -1;
c6496cc7 1319 SvSCREAM_off(sv);
93a17b20 1320 return 0;
1321}
1322
1323int
8ac85365 1324magic_setbm(SV *sv, MAGIC *mg)
79072805 1325{
463ee0b2 1326 sv_unmagic(sv, 'B');
79072805 1327 SvVALID_off(sv);
1328 return 0;
1329}
1330
1331int
8ac85365 1332magic_setfm(SV *sv, MAGIC *mg)
55497cff 1333{
1334 sv_unmagic(sv, 'f');
1335 SvCOMPILED_off(sv);
1336 return 0;
1337}
1338
1339int
8ac85365 1340magic_setuvar(SV *sv, MAGIC *mg)
79072805 1341{
1342 struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr;
1343
1344 if (uf && uf->uf_set)
1345 (*uf->uf_set)(uf->uf_index, sv);
1346 return 0;
1347}
1348
c277df42 1349int
1350magic_freeregexp(SV *sv, MAGIC *mg)
1351{
1352 regexp *re = (regexp *)mg->mg_obj;
1353 ReREFCNT_dec(re);
1354 return 0;
1355}
1356
7a4c00b4 1357#ifdef USE_LOCALE_COLLATE
79072805 1358int
8ac85365 1359magic_setcollxfrm(SV *sv, MAGIC *mg)
bbce6d69 1360{
1361 /*
1362 * René Descartes said "I think not."
1363 * and vanished with a faint plop.
1364 */
7a4c00b4 1365 if (mg->mg_ptr) {
1366 Safefree(mg->mg_ptr);
1367 mg->mg_ptr = NULL;
76e3520e 1368 mg->mg_length = -1;
7a4c00b4 1369 }
bbce6d69 1370 return 0;
1371}
7a4c00b4 1372#endif /* USE_LOCALE_COLLATE */
bbce6d69 1373
1374int
8ac85365 1375magic_set(SV *sv, MAGIC *mg)
79072805 1376{
11343788 1377 dTHR;
79072805 1378 register char *s;
1379 I32 i;
8990e307 1380 STRLEN len;
79072805 1381 switch (*mg->mg_ptr) {
748a9306 1382 case '\001': /* ^A */
1383 sv_setsv(bodytarget, sv);
1384 break;
79072805 1385 case '\004': /* ^D */
8990e307 1386 debug = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) | 0x80000000;
79072805 1387 DEBUG_x(dump_all());
1388 break;
28f23441 1389 case '\005': /* ^E */
1390#ifdef VMS
1391 set_vaxc_errno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1392#else
22fae026 1393#ifdef WIN32
1394 SetLastError( SvIV(sv) );
1395#else
f86702cc 1396 /* will anyone ever use this? */
1397 SETERRNO(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv), 4);
28f23441 1398#endif
22fae026 1399#endif
28f23441 1400 break;
79072805 1401 case '\006': /* ^F */
463ee0b2 1402 maxsysfd = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
79072805 1403 break;
a0d0e21e 1404 case '\010': /* ^H */
1405 hints = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1406 break;
79072805 1407 case '\t': /* ^I */
1408 if (inplace)
1409 Safefree(inplace);
1410 if (SvOK(sv))
a0d0e21e 1411 inplace = savepv(SvPV(sv,na));
79072805 1412 else
1413 inplace = Nullch;
1414 break;
28f23441 1415 case '\017': /* ^O */
1416 if (osname)
1417 Safefree(osname);
1418 if (SvOK(sv))
1419 osname = savepv(SvPV(sv,na));
1420 else
1421 osname = Nullch;
1422 break;
79072805 1423 case '\020': /* ^P */
84902520 1424 perldb = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
79072805 1425 break;
1426 case '\024': /* ^T */
88e89b8a 1427#ifdef BIG_TIME
1428 basetime = (Time_t)(SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv));
1429#else
85e6fe83 1430 basetime = (Time_t)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
88e89b8a 1431#endif
79072805 1432 break;
1433 case '\027': /* ^W */
463ee0b2 1434 dowarn = (bool)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
79072805 1435 break;
1436 case '.':
748a9306 1437 if (localizing) {
1438 if (localizing == 1)
1439 save_sptr((SV**)&last_in_gv);
1440 }
88e89b8a 1441 else if (SvOK(sv) && GvIO(last_in_gv))
a0d0e21e 1442 IoLINES(GvIOp(last_in_gv)) = (long)SvIV(sv);
79072805 1443 break;
1444 case '^':
a0d0e21e 1445 Safefree(IoTOP_NAME(GvIOp(defoutgv)));
1446 IoTOP_NAME(GvIOp(defoutgv)) = s = savepv(SvPV(sv,na));
1447 IoTOP_GV(GvIOp(defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO);
79072805 1448 break;
1449 case '~':
a0d0e21e 1450 Safefree(IoFMT_NAME(GvIOp(defoutgv)));
1451 IoFMT_NAME(GvIOp(defoutgv)) = s = savepv(SvPV(sv,na));
1452 IoFMT_GV(GvIOp(defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO);
79072805 1453 break;
1454 case '=':
a0d0e21e 1455 IoPAGE_LEN(GvIOp(defoutgv)) = (long)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
79072805 1456 break;
1457 case '-':
a0d0e21e 1458 IoLINES_LEFT(GvIOp(defoutgv)) = (long)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1459 if (IoLINES_LEFT(GvIOp(defoutgv)) < 0L)
1460 IoLINES_LEFT(GvIOp(defoutgv)) = 0L;
79072805 1461 break;
1462 case '%':
a0d0e21e 1463 IoPAGE(GvIOp(defoutgv)) = (long)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
79072805 1464 break;
1465 case '|':
4b65379b 1466 {
1467 IO *io = GvIOp(defoutgv);
1468 if ((SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) == 0)
1469 IoFLAGS(io) &= ~IOf_FLUSH;
1470 else {
1471 if (!(IoFLAGS(io) & IOf_FLUSH)) {
1472 PerlIO *ofp = IoOFP(io);
1473 if (ofp)
1474 (void)PerlIO_flush(ofp);
1475 IoFLAGS(io) |= IOf_FLUSH;
1476 }
1477 }
79072805 1478 }
1479 break;
1480 case '*':
463ee0b2 1481 i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
79072805 1482 multiline = (i != 0);
1483 break;
1484 case '/':
c07a80fd 1485 SvREFCNT_dec(nrs);
1486 nrs = newSVsv(sv);
1487 SvREFCNT_dec(rs);
1488 rs = SvREFCNT_inc(nrs);
79072805 1489 break;
1490 case '\\':
1491 if (ors)
1492 Safefree(ors);
e3c19b7b 1493 if (SvOK(sv) || SvGMAGICAL(sv))
1494 ors = savepv(SvPV(sv,orslen));
1495 else {
1496 ors = Nullch;
1497 orslen = 0;
1498 }
79072805 1499 break;
1500 case ',':
1501 if (ofs)
1502 Safefree(ofs);
a0d0e21e 1503 ofs = savepv(SvPV(sv, ofslen));
79072805 1504 break;
1505 case '#':
1506 if (ofmt)
1507 Safefree(ofmt);
a0d0e21e 1508 ofmt = savepv(SvPV(sv,na));
79072805 1509 break;
1510 case '[':
a0d0e21e 1511 compiling.cop_arybase = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
79072805 1512 break;
1513 case '?':
ff0cee69 1514#ifdef COMPLEX_STATUS
1515 if (localizing == 2) {
1516 statusvalue = LvTARGOFF(sv);
1517 statusvalue_vms = LvTARGLEN(sv);
1518 }
1519 else
1520#endif
1521#ifdef VMSISH_STATUS
1522 if (VMSISH_STATUS)
1523 STATUS_NATIVE_SET((U32)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)));
1524 else
1525#endif
1526 STATUS_POSIX_SET(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
79072805 1527 break;
1528 case '!':
f86702cc 1529 SETERRNO(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv),
1530 (SvIV(sv) == EVMSERR) ? 4 : vaxc$errno);
79072805 1531 break;
1532 case '<':
463ee0b2 1533 uid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
79072805 1534 if (delaymagic) {
1535 delaymagic |= DM_RUID;
1536 break; /* don't do magic till later */
1537 }
1538#ifdef HAS_SETRUID
85e6fe83 1539 (void)setruid((Uid_t)uid);
79072805 1540#else
1541#ifdef HAS_SETREUID
85e6fe83 1542 (void)setreuid((Uid_t)uid, (Uid_t)-1);
748a9306 1543#else
85e6fe83 1544#ifdef HAS_SETRESUID
1545 (void)setresuid((Uid_t)uid, (Uid_t)-1, (Uid_t)-1);
79072805 1546#else
1547 if (uid == euid) /* special case $< = $> */
76e3520e 1548 (void)PerlProc_setuid(uid);
a0d0e21e 1549 else {
76e3520e 1550 uid = (I32)PerlProc_getuid();
463ee0b2 1551 croak("setruid() not implemented");
a0d0e21e 1552 }
79072805 1553#endif
1554#endif
85e6fe83 1555#endif
76e3520e 1556 uid = (I32)PerlProc_getuid();
4633a7c4 1557 tainting |= (uid && (euid != uid || egid != gid));
79072805 1558 break;
1559 case '>':
463ee0b2 1560 euid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
79072805 1561 if (delaymagic) {
1562 delaymagic |= DM_EUID;
1563 break; /* don't do magic till later */
1564 }
1565#ifdef HAS_SETEUID
85e6fe83 1566 (void)seteuid((Uid_t)euid);
79072805 1567#else
1568#ifdef HAS_SETREUID
85e6fe83 1569 (void)setreuid((Uid_t)-1, (Uid_t)euid);
1570#else
1571#ifdef HAS_SETRESUID
1572 (void)setresuid((Uid_t)-1, (Uid_t)euid, (Uid_t)-1);
79072805 1573#else
1574 if (euid == uid) /* special case $> = $< */
76e3520e 1575 PerlProc_setuid(euid);
a0d0e21e 1576 else {
76e3520e 1577 euid = (I32)PerlProc_geteuid();
463ee0b2 1578 croak("seteuid() not implemented");
a0d0e21e 1579 }
79072805 1580#endif
1581#endif
85e6fe83 1582#endif
76e3520e 1583 euid = (I32)PerlProc_geteuid();
4633a7c4 1584 tainting |= (uid && (euid != uid || egid != gid));
79072805 1585 break;
1586 case '(':
463ee0b2 1587 gid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
79072805 1588 if (delaymagic) {
1589 delaymagic |= DM_RGID;
1590 break; /* don't do magic till later */
1591 }
1592#ifdef HAS_SETRGID
85e6fe83 1593 (void)setrgid((Gid_t)gid);
79072805 1594#else
1595#ifdef HAS_SETREGID
85e6fe83 1596 (void)setregid((Gid_t)gid, (Gid_t)-1);
1597#else
1598#ifdef HAS_SETRESGID
1599 (void)setresgid((Gid_t)gid, (Gid_t)-1, (Gid_t) 1);
79072805 1600#else
1601 if (gid == egid) /* special case $( = $) */
76e3520e 1602 (void)PerlProc_setgid(gid);
748a9306 1603 else {
76e3520e 1604 gid = (I32)PerlProc_getgid();
463ee0b2 1605 croak("setrgid() not implemented");
748a9306 1606 }
79072805 1607#endif
1608#endif
85e6fe83 1609#endif
76e3520e 1610 gid = (I32)PerlProc_getgid();
4633a7c4 1611 tainting |= (uid && (euid != uid || egid != gid));
79072805 1612 break;
1613 case ')':
5cd24f17 1614#ifdef HAS_SETGROUPS
1615 {
1616 char *p = SvPV(sv, na);
1617 Groups_t gary[NGROUPS];
1618
1619 SET_NUMERIC_STANDARD();
1620 while (isSPACE(*p))
1621 ++p;
1622 egid = I_V(atof(p));
1623 for (i = 0; i < NGROUPS; ++i) {
1624 while (*p && !isSPACE(*p))
1625 ++p;
1626 while (isSPACE(*p))
1627 ++p;
1628 if (!*p)
1629 break;
1630 gary[i] = I_V(atof(p));
1631 }
8cc95fdb 1632 if (i)
1633 (void)setgroups(i, gary);
5cd24f17 1634 }
1635#else /* HAS_SETGROUPS */
463ee0b2 1636 egid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
5cd24f17 1637#endif /* HAS_SETGROUPS */
79072805 1638 if (delaymagic) {
1639 delaymagic |= DM_EGID;
1640 break; /* don't do magic till later */
1641 }
1642#ifdef HAS_SETEGID
85e6fe83 1643 (void)setegid((Gid_t)egid);
79072805 1644#else
1645#ifdef HAS_SETREGID
85e6fe83 1646 (void)setregid((Gid_t)-1, (Gid_t)egid);
1647#else
1648#ifdef HAS_SETRESGID
1649 (void)setresgid((Gid_t)-1, (Gid_t)egid, (Gid_t)-1);
79072805 1650#else
1651 if (egid == gid) /* special case $) = $( */
76e3520e 1652 (void)PerlProc_setgid(egid);
748a9306 1653 else {
76e3520e 1654 egid = (I32)PerlProc_getegid();
463ee0b2 1655 croak("setegid() not implemented");
748a9306 1656 }
79072805 1657#endif
1658#endif
85e6fe83 1659#endif
76e3520e 1660 egid = (I32)PerlProc_getegid();
4633a7c4 1661 tainting |= (uid && (euid != uid || egid != gid));
79072805 1662 break;
1663 case ':':
a0d0e21e 1664 chopset = SvPV_force(sv,na);
79072805 1665 break;
1666 case '0':
1667 if (!origalen) {
1668 s = origargv[0];
1669 s += strlen(s);
1670 /* See if all the arguments are contiguous in memory */
1671 for (i = 1; i < origargc; i++) {
fb73857a 1672 if (origargv[i] == s + 1
1673#ifdef OS2
1674 || origargv[i] == s + 2
1675#endif
1676 )
79072805 1677 s += strlen(++s); /* this one is ok too */
fb73857a 1678 else
1679 break;
79072805 1680 }
bbce6d69 1681 /* can grab env area too? */
fb73857a 1682 if (origenviron && (origenviron[0] == s + 1
1683#ifdef OS2
1684 || (origenviron[0] == s + 9 && (s += 8))
1685#endif
1686 )) {
66b1d557 1687 my_setenv("NoNe SuCh", Nullch);
79072805 1688 /* force copy of environment */
1689 for (i = 0; origenviron[i]; i++)
1690 if (origenviron[i] == s + 1)
1691 s += strlen(++s);
fb73857a 1692 else
1693 break;
79072805 1694 }
1695 origalen = s - origargv[0];
1696 }
a0d0e21e 1697 s = SvPV_force(sv,len);
8990e307 1698 i = len;
79072805 1699 if (i >= origalen) {
1700 i = origalen;
fb73857a 1701 /* don't allow system to limit $0 seen by script */
1702 /* SvCUR_set(sv, i); *SvEND(sv) = '\0'; */
79072805 1703 Copy(s, origargv[0], i, char);
fb73857a 1704 s = origargv[0]+i;
1705 *s = '\0';
79072805 1706 }
1707 else {
1708 Copy(s, origargv[0], i, char);
1709 s = origargv[0]+i;
1710 *s++ = '\0';
1711 while (++i < origalen)
8990e307 1712 *s++ = ' ';
1713 s = origargv[0]+i;
ed6116ce 1714 for (i = 1; i < origargc; i++)
8990e307 1715 origargv[i] = Nullch;
79072805 1716 }
1717 break;
a863c7d1 1718#ifdef USE_THREADS
1719 case '@':
38a03e6e 1720 sv_setsv(thr->errsv, sv);
a863c7d1 1721 break;
1722#endif /* USE_THREADS */
79072805 1723 }
1724 return 0;
1725}
1726
f93b4edd 1727#ifdef USE_THREADS
1728int
8ac85365 1729magic_mutexfree(SV *sv, MAGIC *mg)
f93b4edd 1730{
1731 dTHR;
bc1f4c86 1732 DEBUG_L(PerlIO_printf(PerlIO_stderr(), "0x%lx: magic_mutexfree 0x%lx\n",
1733 (unsigned long)thr, (unsigned long)sv);)
f93b4edd 1734 if (MgOWNER(mg))
1735 croak("panic: magic_mutexfree");
1736 MUTEX_DESTROY(MgMUTEXP(mg));
1737 COND_DESTROY(MgCONDP(mg));
e55aaa0e 1738 SvREFCNT_dec(sv);
f93b4edd 1739 return 0;
1740}
1741#endif /* USE_THREADS */
1742
79072805 1743I32
8ac85365 1744whichsig(char *sig)
79072805 1745{
1746 register char **sigv;
1747
1748 for (sigv = sig_name+1; *sigv; sigv++)
1749 if (strEQ(sig,*sigv))
8e07c86e 1750 return sig_num[sigv - sig_name];
79072805 1751#ifdef SIGCLD
1752 if (strEQ(sig,"CHLD"))
1753 return SIGCLD;
1754#endif
1755#ifdef SIGCHLD
1756 if (strEQ(sig,"CLD"))
1757 return SIGCHLD;
1758#endif
1759 return 0;
1760}
1761
84902520 1762static SV* sig_sv;
1763
76e3520e 1764STATIC void
8ac85365 1765unwind_handler_stack(void *p)
84902520 1766{
ff26ac79 1767 dTHR;
84902520 1768 U32 flags = *(U32*)p;
1769
1770 if (flags & 1)
1771 savestack_ix -= 5; /* Unprotect save in progress. */
1772 /* cxstack_ix-- Not needed, die already unwound it. */
1773 if (flags & 64)
1774 SvREFCNT_dec(sig_sv);
1775}
1776
ecfc5424 1777Signal_t
8ac85365 1778sighandler(int sig)
79072805 1779{
1780 dSP;
00d579c5 1781 GV *gv = Nullgv;
a0d0e21e 1782 HV *st;
84902520 1783 SV *sv, *tSv = Sv;
00d579c5 1784 CV *cv = Nullcv;
79072805 1785 AV *oldstack;
84902520 1786 OP *myop = op;
1787 U32 flags = 0;
1788 I32 o_save_i = savestack_ix, type;
c09156bb 1789 PERL_CONTEXT *cx;
84902520 1790 XPV *tXpv = Xpv;
1791
1792 if (savestack_ix + 15 <= savestack_max)
1793 flags |= 1;
1794 if (cxstack_ix < cxstack_max - 2)
1795 flags |= 2;
1796 if (markstack_ptr < markstack_max - 2)
1797 flags |= 4;
1798 if (retstack_ix < retstack_max - 2)
1799 flags |= 8;
1800 if (scopestack_ix < scopestack_max - 3)
1801 flags |= 16;
1802
1803 if (flags & 2) { /* POPBLOCK may decrease cxstack too early. */
1804 cxstack_ix++; /* Protect from overwrite. */
1805 cx = &cxstack[cxstack_ix];
1806 type = cx->cx_type; /* Can be during partial write. */
1807 cx->cx_type = CXt_NULL; /* Make it safe for unwind. */
1808 }
ff0cee69 1809 if (!psig_ptr[sig])
1810 die("Signal SIG%s received, but no signal handler set.\n",
1811 sig_name[sig]);
1812
84902520 1813 /* Max number of items pushed there is 3*n or 4. We cannot fix
1814 infinity, so we fix 4 (in fact 5): */
1815 if (flags & 1) {
1816 savestack_ix += 5; /* Protect save in progress. */
1817 o_save_i = savestack_ix;
76e3520e 1818 SAVEDESTRUCTOR(UNWINDHANDLER, (void*)&flags);
84902520 1819 }
1820 if (flags & 4)
1821 markstack_ptr++; /* Protect mark. */
1822 if (flags & 8) {
1823 retstack_ix++;
1824 retstack[retstack_ix] = NULL;
1825 }
1826 if (flags & 16)
1827 scopestack_ix += 1;
1828 /* sv_2cv is too complicated, try a simpler variant first: */
1829 if (!SvROK(psig_ptr[sig]) || !(cv = (CV*)SvRV(psig_ptr[sig]))
1830 || SvTYPE(cv) != SVt_PVCV)
1831 cv = sv_2cv(psig_ptr[sig],&st,&gv,TRUE);
1832
a0d0e21e 1833 if (!cv || !CvROOT(cv)) {
79072805 1834 if (dowarn)
1835 warn("SIG%s handler \"%s\" not defined.\n",
00d579c5 1836 sig_name[sig], (gv ? GvENAME(gv)
1837 : ((cv && CvGV(cv))
1838 ? GvENAME(CvGV(cv))
1839 : "__ANON__")));
1840 goto cleanup;
79072805 1841 }
1842
88e89b8a 1843 oldstack = curstack;
1844 if (curstack != signalstack)
a0d0e21e 1845 AvFILL(signalstack) = 0;
88e89b8a 1846 SWITCHSTACK(curstack, signalstack);
79072805 1847
84902520 1848 if(psig_name[sig]) {
88e89b8a 1849 sv = SvREFCNT_inc(psig_name[sig]);
84902520 1850 flags |= 64;
1851 sig_sv = sv;
1852 } else {
ff0cee69 1853 sv = sv_newmortal();
1854 sv_setpv(sv,sig_name[sig]);
88e89b8a 1855 }
a0d0e21e 1856 PUSHMARK(sp);
79072805 1857 PUSHs(sv);
79072805 1858 PUTBACK;
a0d0e21e 1859
1860 perl_call_sv((SV*)cv, G_DISCARD);
79072805 1861
1862 SWITCHSTACK(signalstack, oldstack);
00d579c5 1863cleanup:
84902520 1864 if (flags & 1)
1865 savestack_ix -= 8; /* Unprotect save in progress. */
1866 if (flags & 2) {
1867 cxstack[cxstack_ix].cx_type = type;
1868 cxstack_ix -= 1;
1869 }
1870 if (flags & 4)
1871 markstack_ptr--;
1872 if (flags & 8)
1873 retstack_ix--;
1874 if (flags & 16)
1875 scopestack_ix -= 1;
1876 if (flags & 64)
1877 SvREFCNT_dec(sv);
1878 op = myop; /* Apparently not needed... */
1879
1880 Sv = tSv; /* Restore global temporaries. */
1881 Xpv = tXpv;
79072805 1882 return;
1883}
4e35701f 1884
1885