#include "EXTERN.h"
#include "perl.h"
-/* Omit -- it causes too much grief on mixed systems.
+/* XXX If this causes problems, set i_unistd=undef in the hint file. */
#ifdef I_UNISTD
# include <unistd.h>
#endif
-*/
/*
* Use the "DESTRUCTOR" scope cleanup to reinstate magic.
SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
}
- safefree((void *)mgs);
+ Safefree(mgs);
}
MGS* mgs;
MAGIC* mg;
MAGIC** mgp;
+ int mgp_valid = 0;
ENTER;
mgs = save_magic(sv);
if (!(mg->mg_flags & MGf_GSKIP) && vtbl && vtbl->svt_get) {
(*vtbl->svt_get)(sv, mg);
/* Ignore this magic if it's been deleted */
- if (*mgp == mg && (mg->mg_flags & MGf_GSKIP))
+ if ((mg == (mgp_valid ? *mgp : SvMAGIC(sv))) && (mg->mg_flags & MGf_GSKIP))
mgs->mgs_flags = 0;
}
/* Advance to next magic (complicated by possible deletion) */
- if (*mgp == mg)
+ if (mg == (mgp_valid ? *mgp : SvMAGIC(sv))) {
mgp = &mg->mg_moremagic;
+ mgp_valid = 1;
+ }
+ else
+ mgp = &SvMAGIC(sv); /* Re-establish pointer after sv_upgrade */
}
LEAVE;
{
I32 i;
/* Are we fetching a signal entry? */
- i = whichsig(mg->mg_ptr);
+ i = whichsig((mg->mg_len == HEf_SVKEY) ? SvPV((SV*)mg->mg_ptr, na) : mg->mg_ptr);
if (i) {
if(psig_ptr[i])
sv_setsv(sv,psig_ptr[i]);
else {
- void (*origsig)(int);
+ void (*origsig) _((int));
/* get signal state without losing signals */
sig_trapped=0;
origsig = rsignal(i,sig_trap);
{
I32 i;
/* Are we clearing a signal entry? */
- i = whichsig(mg->mg_ptr);
+ i = whichsig((mg->mg_len == HEf_SVKEY) ? SvPV((SV*)mg->mg_ptr, na) : mg->mg_ptr);
if (i) {
if(psig_ptr[i]) {
SvREFCNT_dec(psig_ptr[i]);
psig_ptr[i] = SvREFCNT_inc(sv);
if(psig_name[i])
SvREFCNT_dec(psig_name[i]);
- psig_name[i] = newSVpv(mg->mg_ptr,strlen(mg->mg_ptr));
+ psig_name[i] = newSVpv(s,strlen(s));
SvTEMP_off(sv); /* Make sure it doesn't go away on us */
SvREADONLY_on(psig_name[i]);
}
*svp = 0;
}
else {
+ if(hints & HINT_STRICT_REFS)
+ die(no_symref,s,"a subroutine");
if (!strchr(s,':') && !strchr(s,'\'')) {
sprintf(tokenbuf, "main::%s",s);
sv_setpv(sv,tokenbuf);
SV* sv;
MAGIC* mg;
{
- gv_efullname(sv,((GV*)sv));/* a gv value, be nice */
+ if (SvFAKE(sv)) { /* FAKE globs can get coerced */
+ SvFAKE_off(sv);
+ gv_efullname(sv,((GV*)sv), "*");
+ SvFAKE_on(sv);
+ }
+ else
+ gv_efullname(sv,((GV*)sv), "*"); /* a gv value, be nice */
return 0;
}
SV *sv;
CV *cv;
AV *oldstack;
+
+ if(!psig_ptr[sig])
+ die("Signal SIG%s received, but no signal handler set.\n",
+ sig_name[sig]);
cv = sv_2cv(psig_ptr[sig],&st,&gv,TRUE);
if (!cv || !CvROOT(cv)) {