static int runops_leakcheck( pTHX ) { char *lastfile = NULL; int lastline = 0; while ( ( PL_op = CALL_FPTR( PL_op->op_ppaddr ) ( aTHX ) ) ) { PERL_ASYNC_CHECK( ); if ( interesting_op( PL_op->op_type ) ) { /*fprintf(stderr, "%s, line %d\n", lastfile, lastline); */ NOTE_NEW_VARS( lastline, lastfile ); free( lastfile ); if ( lastfile = strdup( CopFILE( cCOP ) ), NULL == lastfile ) { nomem( ); } lastline = CopLINE( cCOP ); } } /*fprintf(stderr, "%s, line %d\n", lastfile, lastline); */ NOTE_NEW_VARS( lastline, lastfile ); free( lastfile ); TAINT_NOT; return 0; }
int Perl_runops_debug(pTHX) { #ifdef DEBUGGING if (!PL_op) { if (ckWARN_d(WARN_DEBUGGING)) Perl_warner(aTHX_ WARN_DEBUGGING, "NULL OP IN RUN"); return 0; } do { PERL_ASYNC_CHECK(); if (PL_debug) { if (PL_watchaddr != 0 && *PL_watchaddr != PL_watchok) PerlIO_printf(Perl_debug_log, "WARNING: %"UVxf" changed from %"UVxf" to %"UVxf"\n", PTR2UV(PL_watchaddr), PTR2UV(PL_watchok), PTR2UV(*PL_watchaddr)); DEBUG_s(debstack()); DEBUG_t(debop(PL_op)); DEBUG_P(debprof(PL_op)); } } while ((PL_op = CALL_FPTR(PL_op->op_ppaddr)(aTHX))); TAINT_NOT; return 0; #else return runops_standard(); #endif /* DEBUGGING */ }
int Perl_runops_standard(pTHX) { while ((PL_op = CALL_FPTR(PL_op->op_ppaddr)(aTHX))) { PERL_ASYNC_CHECK(); } TAINT_NOT; return 0; }
void S_signals_set_handler(SV* handlersv, SV* namesv) { I32 i; /* Need to be careful with SvREFCNT_dec(), because that can have side * effects (due to closures). We must make sure that the new disposition * is in place before it is called. */ SV* to_dec = NULL; STRLEN len; const char *s; bool set_to_ignore = FALSE; bool set_to_default = FALSE; #ifdef HAS_SIGPROCMASK sigset_t set, save; SV* save_sv; #endif if ( SvROK(handlersv) ) { if ( SvTYPE(SvRV(handlersv)) != SVt_PVCV ) Perl_croak(aTHX_ "signal handler should be a code refernce, 'DEFAULT' or 'IGNORE'"); } else { const char *s = SvOK(handlersv) ? SvPV_const(handlersv, len) : "DEFAULT"; if ( strEQ(s,"IGNORE") ) set_to_ignore = TRUE; else if (strEQ(s,"DEFAULT")) set_to_default = TRUE; else Perl_croak(aTHX_ "signal handler should be a code reference or 'DEFAULT or 'IGNORE'"); } if (!PL_psig_ptr) { Newxz(PL_psig_ptr, SIG_SIZE, SV*); Newxz(PL_psig_name, SIG_SIZE, SV*); Newxz(PL_psig_pend, SIG_SIZE, int); } s = SvPV_const(namesv,len); i = whichsig(s); /* ...no, a brick */ if (i <= 0) { Perl_croak(aTHX_ "No such signal: SIG%s", s); } #ifdef HAS_SIGPROCMASK /* Avoid having the signal arrive at a bad time, if possible. */ sigemptyset(&set); sigaddset(&set,i); sigprocmask(SIG_BLOCK, &set, &save); ENTER; save_sv = newSVpvn((char *)(&save), sizeof(sigset_t)); SAVEFREESV(save_sv); SAVEDESTRUCTOR_X(restore_sigmask, save_sv); #endif PERL_ASYNC_CHECK(); #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS) if (!PL_sig_handlers_initted) Perl_csighandler_init(); #endif #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS PL_sig_ignoring[i] = 0; #endif #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS PL_sig_defaulting[i] = 0; #endif SvREFCNT_dec(PL_psig_name[i]); to_dec = PL_psig_ptr[i]; PL_psig_ptr[i] = NULL; PL_psig_name[i] = newSVpvn(s, len); SvREADONLY_on(PL_psig_name[i]); if (SvROK(handlersv)) { PL_psig_ptr[i] = SvREFCNT_inc(SvRV(handlersv)); (void)rsignal(i, PL_csighandlerp); #ifdef HAS_SIGPROCMASK LEAVE; #endif if(to_dec) SvREFCNT_dec(to_dec); return; } if (set_to_ignore) { #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS PL_sig_ignoring[i] = 1; (void)rsignal(i, PL_csighandlerp); #else (void)rsignal(i, (Sighandler_t) SIG_IGN); #endif } else { #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS PL_sig_defaulting[i] = 1; (void)rsignal(i, PL_csighandlerp); #else (void)rsignal(i, (Sighandler_t) SIG_DFL); #endif } #ifdef HAS_SIGPROCMASK if(i) LEAVE; #endif if(to_dec) SvREFCNT_dec(to_dec); }