diff options
author | markm <markm@FreeBSD.org> | 1998-09-09 07:00:04 +0000 |
---|---|---|
committer | markm <markm@FreeBSD.org> | 1998-09-09 07:00:04 +0000 |
commit | 4fcbc3669aa997848e15198cc9fb856287a6788c (patch) | |
tree | 58b20e81687d6d5931f120b50802ed21225bf440 /contrib/perl5/run.c | |
download | FreeBSD-src-4fcbc3669aa997848e15198cc9fb856287a6788c.zip FreeBSD-src-4fcbc3669aa997848e15198cc9fb856287a6788c.tar.gz |
Initial import of Perl5. The king is dead; long live the king!
Diffstat (limited to 'contrib/perl5/run.c')
-rw-r--r-- | contrib/perl5/run.c | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/contrib/perl5/run.c b/contrib/perl5/run.c new file mode 100644 index 0000000..97444ec --- /dev/null +++ b/contrib/perl5/run.c @@ -0,0 +1,139 @@ +/* run.c + * + * Copyright (c) 1991-1997, Larry Wall + * + * You may distribute under the terms of either the GNU General Public + * License or the Artistic License, as specified in the README file. + * + */ + +#include "EXTERN.h" +#include "perl.h" + +/* + * "Away now, Shadowfax! Run, greatheart, run as you have never run before! + * Now we are come to the lands where you were foaled, and every stone you + * know. Run now! Hope is in speed!" --Gandalf + */ + +#ifdef PERL_OBJECT +#define CALLOP this->*PL_op +#else +#define CALLOP *PL_op +#endif + +int +runops_standard(void) +{ + dTHR; + + while ( PL_op = (CALLOP->op_ppaddr)(ARGS) ) ; + + TAINT_NOT; + return 0; +} + +#ifdef DEBUGGING + +dEXT char **watchaddr = 0; +dEXT char *watchok; + +#ifndef PERL_OBJECT +static void debprof _((OP*o)); +#endif + +#endif /* DEBUGGING */ + +int +runops_debug(void) +{ +#ifdef DEBUGGING + dTHR; + if (!PL_op) { + warn("NULL OP IN RUN"); + return 0; + } + + do { + if (PL_debug) { + if (watchaddr != 0 && *watchaddr != watchok) + PerlIO_printf(Perl_debug_log, "WARNING: %lx changed from %lx to %lx\n", + (long)watchaddr, (long)watchok, (long)*watchaddr); + DEBUG_s(debstack()); + DEBUG_t(debop(PL_op)); + DEBUG_P(debprof(PL_op)); + } + } while ( PL_op = (CALLOP->op_ppaddr)(ARGS) ); + + TAINT_NOT; + return 0; +#else + return runops_standard(); +#endif /* DEBUGGING */ +} + +I32 +debop(OP *o) +{ +#ifdef DEBUGGING + SV *sv; + deb("%s", op_name[o->op_type]); + switch (o->op_type) { + case OP_CONST: + PerlIO_printf(Perl_debug_log, "(%s)", SvPEEK(cSVOPo->op_sv)); + break; + case OP_GVSV: + case OP_GV: + if (cGVOPo->op_gv) { + sv = NEWSV(0,0); + gv_fullname3(sv, cGVOPo->op_gv, Nullch); + PerlIO_printf(Perl_debug_log, "(%s)", SvPV(sv, PL_na)); + SvREFCNT_dec(sv); + } + else + PerlIO_printf(Perl_debug_log, "(NULL)"); + break; + default: + break; + } + PerlIO_printf(Perl_debug_log, "\n"); +#endif /* DEBUGGING */ + return 0; +} + +void +watch(char **addr) +{ +#ifdef DEBUGGING + watchaddr = addr; + watchok = *addr; + PerlIO_printf(Perl_debug_log, "WATCHING, %lx is currently %lx\n", + (long)watchaddr, (long)watchok); +#endif /* DEBUGGING */ +} + +STATIC void +debprof(OP *o) +{ +#ifdef DEBUGGING + if (!PL_profiledata) + Newz(000, PL_profiledata, MAXO, U32); + ++PL_profiledata[o->op_type]; +#endif /* DEBUGGING */ +} + +void +debprofdump(void) +{ +#ifdef DEBUGGING + unsigned i; + if (!PL_profiledata) + return; + for (i = 0; i < MAXO; i++) { + if (PL_profiledata[i]) + PerlIO_printf(Perl_debug_log, + "%5lu %s\n", (unsigned long)PL_profiledata[i], + op_name[i]); + } +#endif /* DEBUGGING */ +} |